diff options
author | Brian Foster <bfoster@redhat.com> | 2017-02-17 02:19:12 +0100 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2017-02-17 02:19:12 +0100 |
commit | fa7f138ac4c70dc00519c124cf7cd4862a0a5b0e (patch) | |
tree | f5314084f5619e57781608403c440c6e3a75c764 /fs/xfs/xfs_sysfs.c | |
parent | xfs: don't block the log commit handler for discards (diff) | |
download | linux-fa7f138ac4c70dc00519c124cf7cd4862a0a5b0e.tar.xz linux-fa7f138ac4c70dc00519c124cf7cd4862a0a5b0e.zip |
xfs: clear delalloc and cache on buffered write failure
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: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs/xfs_sysfs.c')
0 files changed, 0 insertions, 0 deletions