• Brian Foster's avatar
    xfs: clear delalloc and cache on buffered write failure · d0040060
    Brian Foster authored
    commit fa7f138a upstream.
    
    The buffered write failure handling code in
    xfs_file_iomap_end_delalloc() has a couple minor problems. First, if
    written == 0, start_fsb is not rounded down and it fails to kill off a
    delalloc block if the start offset is block unaligned. This results in a
    lingering delalloc block and broken delalloc block accounting detected
    at unmount time. Fix this by rounding down start_fsb in the unlikely
    event that written == 0.
    
    Second, it is possible for a failed overwrite of a delalloc extent to
    leave dirty pagecache around over a hole in the file. This is because is
    possible to hit ->iomap_end() on write failure before the iomap code has
    attempted to allocate pagecache, and thus has no need to clean it up. If
    the targeted delalloc extent was successfully written by a previous
    write, however, then it does still have dirty pages when ->iomap_end()
    punches out the underlying blocks. This ultimately results in writeback
    over a hole. To fix this problem, unconditionally punch out the
    pagecache from XFS before the associated delalloc range.
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d0040060
xfs_iomap.c 31.6 KB