]> git.baikalelectronics.ru Git - kernel.git/commit
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)
commit1a6921823945be83c38edf19c2d9c589ec9f96bb
tree8b5061acbaf222b3f25df54ddbcaa0b1123c471a
parentc2a404bffa25a701ea1343b1364d06d85f4a7b97
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