diff options
Diffstat (limited to 'fs/xfs/xfs_iops.c')
| -rw-r--r-- | fs/xfs/xfs_iops.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c index 5e165456da68..1414ab79eacf 100644 --- a/fs/xfs/xfs_iops.c +++ b/fs/xfs/xfs_iops.c @@ -911,6 +911,16 @@ xfs_setattr_size(  		error = iomap_zero_range(inode, oldsize, newsize - oldsize,  				&did_zeroing, &xfs_buffered_write_iomap_ops);  	} else { +		/* +		 * iomap won't detect a dirty page over an unwritten block (or a +		 * cow block over a hole) and subsequently skips zeroing the +		 * newly post-EOF portion of the page. Flush the new EOF to +		 * convert the block before the pagecache truncate. +		 */ +		error = filemap_write_and_wait_range(inode->i_mapping, newsize, +						     newsize); +		if (error) +			return error;  		error = iomap_truncate_page(inode, newsize, &did_zeroing,  				&xfs_buffered_write_iomap_ops);  	}  | 
