• Andrew Morton's avatar
    [PATCH] fdatasync integrity fix · d3eb546e
    Andrew Morton authored
    fdatasync can fail to wait on some pages due to a race.
    
    If some task (eg pdflush) is flushing the same mapping it can remove a page's
    dirty tag but not then mark that page as being under writeback, because
    pdflush hit a locked buffer in __block_write_full_page().  This will happen
    because kjournald is writing the buffer.  In this situation
    __block_write_full_page() will redirty the page so that fsync notices it, but
    there is a window where the page eludes the radix tree dirty page walk.
    
    Consequently a concurrent fsync will fail to notice the page when walking the
    radix tree's dirty pages.
    
    The approach taken by this patch is to leave the page marked as dirty in the
    radix tree while ->writepage is working out what to do with it.  This ensures
    that a concurrent write-for-sync will successfully locate the page and will
    then block in lock_page() until the non-write-for-sync code has finished
    altering the page state.
    d3eb546e
page-writeback.c 18.9 KB