linux/fs/jbd2
Jan Kara f91d1d0417 jbd2: Fix a race between checkpointing code and journal_get_write_access()
The following race can happen:

 CPU1                          CPU2
                               checkpointing code checks the buffer, adds
                                 it to an array for writeback
 do_get_write_access()
 ...
 lock_buffer()
 unlock_buffer()
                               flush_batch() submits the buffer for IO
 __jbd2_journal_file_buffer()

So a buffer under writeout is returned from
do_get_write_access(). Since the filesystem code relies on the fact
that journaled buffers cannot be written out, it does not take the
buffer lock and so it can modify buffer while it is under
writeout. That can lead to a filesystem corruption if we crash at the
right moment.

We fix the problem by clearing the buffer dirty bit under buffer_lock
even if the buffer is on BJ_None list. Actually, we clear the dirty
bit regardless the list the buffer is in and warn about the fact if
the buffer is already journalled.

Thanks for spotting the problem goes to dingdinghua <dingdinghua85@gmail.com>.

Reported-by: dingdinghua <dingdinghua85@gmail.com>
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-07-13 16:16:20 -04:00
..
checkpoint.c jbd2: convert instrumentation from markers to tracepoints 2009-06-17 11:47:48 -04:00
commit.c jbd2: convert instrumentation from markers to tracepoints 2009-06-17 11:47:48 -04:00
journal.c jbd2: Remove GFP_ATOMIC kmalloc from inside spinlock critical region 2009-06-20 23:34:44 -04:00
Kconfig
Makefile
recovery.c
revoke.c
transaction.c jbd2: Fix a race between checkpointing code and journal_get_write_access() 2009-07-13 16:16:20 -04:00