mirror of https://gitee.com/openkylin/linux.git
xfs: don't zero partial page cache pages during O_DIRECT writes
Similar to direct IO reads, direct IO writes are using truncate_pagecache_range to invalidate the page cache. This is incorrect due to the sub-block zeroing in the page cache that truncate_pagecache_range() triggers. This patch fixes things by using invalidate_inode_pages2_range instead. It preserves the page cache invalidation, but won't zero any pages. cc: stable@vger.kernel.org Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-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
85e584da32
commit
834ffca6f7
|
@ -644,7 +644,15 @@ xfs_file_dio_aio_write(
|
||||||
pos, -1);
|
pos, -1);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
truncate_pagecache_range(VFS_I(ip), pos, -1);
|
/*
|
||||||
|
* Invalidate whole pages. This can return an error if
|
||||||
|
* we fail to invalidate a page, but this should never
|
||||||
|
* happen on XFS. Warn if it does fail.
|
||||||
|
*/
|
||||||
|
ret = invalidate_inode_pages2_range(VFS_I(ip)->i_mapping,
|
||||||
|
pos >> PAGE_CACHE_SHIFT, -1);
|
||||||
|
WARN_ON_ONCE(ret);
|
||||||
|
ret = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue