• Jan Kara's avatar
    [PATCH] Fix race in do_get_write_access() · 4407c2b6
    Jan Kara authored
      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: default avatarJan Kara <jack@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    4407c2b6
transaction.c 60.7 KB