• Jan Kara's avatar
    ext4: avoid deadlock in fs reclaim with page writeback · 00d873c1
    Jan Kara authored
    Ext4 has a filesystem wide lock protecting ext4_writepages() calls to
    avoid races with switching of journalled data flag or inode format. This
    lock can however cause a deadlock like:
    
    CPU0                            CPU1
    
    ext4_writepages()
      percpu_down_read(sbi->s_writepages_rwsem);
                                    ext4_change_inode_journal_flag()
                                      percpu_down_write(sbi->s_writepages_rwsem);
                                        - blocks, all readers block from now on
      ext4_do_writepages()
        ext4_init_io_end()
          kmem_cache_zalloc(io_end_cachep, GFP_KERNEL)
            fs_reclaim frees dentry...
              dentry_unlink_inode()
                iput() - last ref =>
                  iput_final() - inode dirty =>
                    write_inode_now()...
                      ext4_writepages() tries to acquire sbi->s_writepages_rwsem
                        and blocks forever
    
    Make sure we cannot recurse into filesystem reclaim from writeback code
    to avoid the deadlock.
    
    Reported-by: syzbot+6898da502aef574c5f8a@syzkaller.appspotmail.com
    Link: https://lore.kernel.org/all/0000000000004c66b405fa108e27@google.com
    Fixes: c8585c6f ("ext4: fix races between changing inode journal mode and ext4_writepages")
    CC: stable@vger.kernel.org
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20230504124723.20205-1-jack@suse.czSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    00d873c1
inode.c 177 KB