ext4: fix deadlock in journal_unmap_buffer()
authorJan Kara <jack@suse.cz>
Tue, 25 Dec 2012 18:29:52 +0000 (13:29 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 25 Dec 2012 18:29:52 +0000 (13:29 -0500)
commit53e872681fed6a43047e71bf927f77d06f467988
tree8b5061acbaf222b3f25df54ddbcaa0b1123c471a
parent4520fb3c3690f2643006d85f09ecb74554c10e95
ext4: fix deadlock in journal_unmap_buffer()

We cannot wait for transaction commit in journal_unmap_buffer()
because we hold page lock which ranks below transaction start.  We
solve the issue by bailing out of journal_unmap_buffer() and
jbd2_journal_invalidatepage() with -EBUSY.  Caller is then responsible
for waiting for transaction commit to finish and try invalidation
again. Since the issue can happen only for page stradding i_size, it
is simple enough to manually call jbd2_journal_invalidatepage() for
such page from ext4_setattr(), check the return value and wait if
necessary.

Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/inode.c
fs/jbd2/transaction.c
include/linux/jbd2.h