• Dave Chinner's avatar
    xfs: truncate delalloc extents when IO fails in writeback · 3ed3a434
    Dave Chinner authored
    We currently use block_invalidatepage() to clean up pages where I/O
    fails in ->writepage(). Unfortunately, if the page has delalloc
    regions on it, we fail to remove the delalloc regions when we
    invalidate the page.  This can result in tripping a BUG() in
    xfs_get_blocks() later on if a direct IO read is done on that same
    region - the delalloc extent is returned when none is supposed to be
    there.
    
    Fix this by truncating away the delalloc regions on the page before
    invalidating it. Because they are delalloc, we can do this without
    needing a transaction. Indeed - if we get ENOSPC errors, we have to
    be able to do this truncation without a transaction as there is
    no space left for block reservation (typically why we see a ENOSPC
    in writeback).
    Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarAlex Elder <aelder@sgi.com>
    3ed3a434
xfs_aops.c 41.8 KB