• Chris Mason's avatar
    [PATCH] resierfs: fix reiserfs_invalidatepage race against data=ordered · d62b1b87
    Chris Mason authored
    After a transaction has closed but before it has finished commit, there is
    a window where data=ordered mode requires invalidatepage to pin pages
    instead of freeing them.  This patch fixes a race between the
    invalidatepage checks and data=ordered writeback, and it also adds a check
    to the reiserfs write_ordered_buffers routines to write any anonymous
    buffers that were dirtied after its first writeback loop.
    
    That bug works like this:
    
    proc1: transaction closes and a new one starts
    proc1: write_ordered_buffers starts processing data=ordered list
    proc1: buffer A is cleaned and written
    proc2: buffer A is dirtied by another process
    proc2: File is truncated to zero, page A goes through invalidatepage
    proc2: reiserfs_invalidatepage sees dirty buffer A with reiserfs
           journal head, pins it
    proc1: write_ordered_buffers frees the journal head on buffer A
    
    At this point, buffer A stays dirty forever
    Signed-off-by: default avatarChris Mason <mason@suse.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    d62b1b87
inode.c 86.7 KB