• Jan Kara's avatar
    ext4: fix deadlock during page writeback · 6e853b16
    Jan Kara authored
    commit 646caa9c upstream.
    
    Commit 06bd3c36 (ext4: fix data exposure after a crash) uncovered a
    deadlock in ext4_writepages() which was previously much harder to hit.
    After this commit xfstest generic/130 reproduces the deadlock on small
    filesystems.
    
    The problem happens when ext4_do_update_inode() sets LARGE_FILE feature
    and marks current inode handle as synchronous. That subsequently results
    in ext4_journal_stop() called from ext4_writepages() to block waiting for
    transaction commit while still holding page locks, reference to io_end,
    and some prepared bio in mpd structure each of which can possibly block
    transaction commit from completing and thus results in deadlock.
    
    Fix the problem by releasing page locks, io_end reference, and
    submitting prepared bio before calling ext4_journal_stop().
    
    [ Changed to defer the call to ext4_journal_stop() only if the handle
      is synchronous.  --tytso ]
    Reported-and-tested-by: default avatarEryu Guan <eguan@redhat.com>
    Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    6e853b16
inode.c 153 KB