diff options
author | Jan Kara <jack@suse.cz> | 2005-09-06 15:19:17 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-07 16:57:57 -0700 |
commit | 4407c2b6b297339e296facf62e020cf66e55053d (patch) | |
tree | 485d60b1cb5c6013d09a0327355e216b202bd8ed /fs/nfsd | |
parent | e39f07c83bac96850265b87a69dfc5c90ed4f1f5 (diff) | |
download | blackbird-op-linux-4407c2b6b297339e296facf62e020cf66e55053d.tar.gz blackbird-op-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 'fs/nfsd')
0 files changed, 0 insertions, 0 deletions