diff options
author | Jan Kara | 2005-09-07 00:19:17 +0200 |
---|---|---|
committer | Linus Torvalds | 2005-09-08 01:57:57 +0200 |
commit | 4407c2b6b297339e296facf62e020cf66e55053d (patch) | |
tree | 485d60b1cb5c6013d09a0327355e216b202bd8ed /drivers/net/irda/smsc-ircc2.c | |
parent | [PATCH] Change HFS+ to not use ll_rw_block() (diff) | |
download | kernel-qcow2-linux-4407c2b6b297339e296facf62e020cf66e55053d.tar.gz kernel-qcow2-linux-4407c2b6b297339e296facf62e020cf66e55053d.tar.xz kernel-qcow2-linux-4407c2b6b297339e296facf62e020cf66e55053d.zip |
[PATCH] Fix race in do_get_write_access()
attached patch should fix the following race:
Proc 1 Proc 2
__flush_batch()
ll_rw_block()
do_get_write_access()
lock_buffer
jh is only waiting for checkpoint
-> b_transaction == NULL ->
do nothing
unlock_buffer
test_set_buffer_locked()
test_clear_buffer_dirty()
__journal_file_buffer()
change the data
submit_bh()
and we have sent wrong data to disk... We now clean the dirty buffer flag
under buffer lock in all cases and hence we know that whenever a buffer is
starting to be journaled we either finish the pending write-out before
attaching a buffer to a transaction or we won't write the buffer until the
transaction is going to be committed.
The test in jbd_unexpected_dirty_buffer() is redundant - remove it.
Furthermore we have to clear the buffer dirty bit under the buffer lock to
prevent races with buffer write-out (and hence prevent returning a buffer with
IO happening).
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/net/irda/smsc-ircc2.c')
0 files changed, 0 insertions, 0 deletions