• Dave Chinner's avatar
    xfs: Introduce writeback context for writepages · fbcc0256
    Dave Chinner authored
    xfs_vm_writepages() calls generic_writepages to writeback a range of
    a file, but then xfs_vm_writepage() clusters pages itself as it does
    not have any context it can pass between->writepage calls from
    __write_cache_pages().
    
    Introduce a writeback context for xfs_vm_writepages() and call
    __write_cache_pages directly with our own writepage callback so that
    we can pass that context to each writepage invocation. This
    encapsulates the current mapping, whether it is valid or not, the
    current ioend and it's IO type and the ioend chain being built.
    
    This requires us to move the ioend submission up to the level where
    the writepage context is declared. This does mean we do not submit
    IO until we packaged the entire writeback range, but with the block
    plugging in the writepages call this is the way IO is submitted,
    anyway.
    
    It also means that we need to handle discontiguous page ranges.  If
    the pages sent down by write_cache_pages to the writepage callback
    are discontiguous, we need to detect this and put each discontiguous
    page range into individual ioends. This is needed to ensure that the
    ioend accurately represents the range of the file that it covers so
    that file size updates during IO completion set the size correctly.
    Failure to take into account the discontiguous ranges results in
    files being too small when writeback patterns are non-sequential.
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDave Chinner <david@fromorbit.com>
    fbcc0256
xfs_aops.c 54.8 KB