xfs: zeroing space needs to punch delalloc blocks
When we are zeroing space andit is covered by a delalloc range, we need to punch the delalloc range out before we truncate the page cache. Failing to do so leaves and inconsistency between the page cache and the extent tree, which we later trip over when doing direct IO over the same range. Signed-off-by: Dave Chinner <dchinner@redhat.com> Tested-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
parent
aad3f3755e
commit
897b73b6a2
|
@ -1418,6 +1418,8 @@ xfs_zero_file_space(
|
|||
xfs_off_t end_boundary;
|
||||
int error;
|
||||
|
||||
trace_xfs_zero_file_space(ip);
|
||||
|
||||
granularity = max_t(uint, 1 << mp->m_sb.sb_blocklog, PAGE_CACHE_SIZE);
|
||||
|
||||
/*
|
||||
|
@ -1432,9 +1434,18 @@ xfs_zero_file_space(
|
|||
ASSERT(end_boundary <= offset + len);
|
||||
|
||||
if (start_boundary < end_boundary - 1) {
|
||||
/* punch out the page cache over the conversion range */
|
||||
/*
|
||||
* punch out delayed allocation blocks and the page cache over
|
||||
* the conversion range
|
||||
*/
|
||||
xfs_ilock(ip, XFS_ILOCK_EXCL);
|
||||
error = xfs_bmap_punch_delalloc_range(ip,
|
||||
XFS_B_TO_FSBT(mp, start_boundary),
|
||||
XFS_B_TO_FSB(mp, end_boundary - start_boundary));
|
||||
xfs_iunlock(ip, XFS_ILOCK_EXCL);
|
||||
truncate_pagecache_range(VFS_I(ip), start_boundary,
|
||||
end_boundary - 1);
|
||||
|
||||
/* convert the blocks */
|
||||
error = xfs_alloc_file_space(ip, start_boundary,
|
||||
end_boundary - start_boundary - 1,
|
||||
|
|
|
@ -603,6 +603,7 @@ DEFINE_INODE_EVENT(xfs_readlink);
|
|||
DEFINE_INODE_EVENT(xfs_inactive_symlink);
|
||||
DEFINE_INODE_EVENT(xfs_alloc_file_space);
|
||||
DEFINE_INODE_EVENT(xfs_free_file_space);
|
||||
DEFINE_INODE_EVENT(xfs_zero_file_space);
|
||||
DEFINE_INODE_EVENT(xfs_collapse_file_space);
|
||||
DEFINE_INODE_EVENT(xfs_readdir);
|
||||
#ifdef CONFIG_XFS_POSIX_ACL
|
||||
|
|
Loading…
Reference in New Issue
Block a user