jbd2: fix assertion failure in commit code due to lacking transaction credits
authorJan Kara <jack@suse.cz>
Thu, 27 Sep 2012 03:11:13 +0000 (23:11 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 27 Sep 2012 03:11:13 +0000 (23:11 -0400)
commitb794e7a6ebfbddb819b0e75ab59ada6b08a285f2
tree4ae2983a324f3788b831190c30cf92117e76e3d8
parent9b68733273665a4c0d98041a657dabfb4fd6bd80
jbd2: fix assertion failure in commit code due to lacking transaction credits

ext4 users of data=journal mode with blocksize < pagesize were
occasionally hitting assertion failure in
jbd2_journal_commit_transaction() checking whether the transaction has
at least as many credits reserved as buffers attached.  The core of the
problem is that when a file gets truncated, buffers that still need
checkpointing or that are attached to the committing transaction are
left with buffer_mapped set. When this happens to buffers beyond i_size
attached to a page stradding i_size, subsequent write extending the file
will see these buffers and as they are mapped (but underlying blocks
were freed) things go awry from here.

The assertion failure just coincidentally (and in this case luckily as
we would start corrupting filesystem) triggers due to journal_head not
being properly cleaned up as well.

We fix the problem by unmapping buffers if possible (in lots of cases we
just need a buffer attached to a transaction as a place holder but it
must not be written out anyway).  And in one case, we just have to bite
the bullet and wait for transaction commit to finish.

CC: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Jan Kara <jack@suse.cz>
fs/jbd2/commit.c
fs/jbd2/transaction.c