diff options
Diffstat (limited to 'fs/xfs/xfs_bmap_util.c')
| -rw-r--r-- | fs/xfs/xfs_bmap_util.c | 13 | 
1 files changed, 12 insertions, 1 deletions
| diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c index 01f6a646caa1..296160b8e78c 100644 --- a/fs/xfs/xfs_bmap_util.c +++ b/fs/xfs/xfs_bmap_util.c @@ -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, | 

