ceph: invalidate pages when doing direct/sync writes
When doing a direct/sync write, we need to invalidate the page cache in the range being written to. If we don't do this, the cache will include invalid data as we just did a write that avoided the page cache. In the event that invalidation fails, just ignore the error. That likely just means that we raced with another task doing a buffered write, in which case we want to leave the page intact anyway. [ jlayton: minor comment update ] Signed-off-by: Luís Henriques <lhenriques@suse.de> Reviewed-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Xiubo Li <xiubli@redhat.com> Reviewed-by: Milind Changire <mchangir@redhat.com> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
f0fe1e54cf
commit
b422f11504
@ -1636,11 +1636,6 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
ceph_fscache_invalidate(inode, false);
|
ceph_fscache_invalidate(inode, false);
|
||||||
ret = invalidate_inode_pages2_range(inode->i_mapping,
|
|
||||||
pos >> PAGE_SHIFT,
|
|
||||||
(pos + count - 1) >> PAGE_SHIFT);
|
|
||||||
if (ret < 0)
|
|
||||||
dout("invalidate_inode_pages2_range returned %d\n", ret);
|
|
||||||
|
|
||||||
while ((len = iov_iter_count(from)) > 0) {
|
while ((len = iov_iter_count(from)) > 0) {
|
||||||
size_t left;
|
size_t left;
|
||||||
@ -1968,6 +1963,20 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ceph_clear_error_write(ci);
|
ceph_clear_error_write(ci);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We successfully wrote to a range of the file. Declare
|
||||||
|
* that region of the pagecache invalid.
|
||||||
|
*/
|
||||||
|
ret = invalidate_inode_pages2_range(
|
||||||
|
inode->i_mapping,
|
||||||
|
pos >> PAGE_SHIFT,
|
||||||
|
(pos + len - 1) >> PAGE_SHIFT);
|
||||||
|
if (ret < 0) {
|
||||||
|
dout("invalidate_inode_pages2_range returned %d\n",
|
||||||
|
ret);
|
||||||
|
ret = 0;
|
||||||
|
}
|
||||||
pos += len;
|
pos += len;
|
||||||
written += len;
|
written += len;
|
||||||
dout("sync_write written %d\n", written);
|
dout("sync_write written %d\n", written);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user