| From 3f015d89a47cd8855cd92f71fff770095bd885a1 Mon Sep 17 00:00:00 2001 |
| From: Benjamin Coddington <bcodding@redhat.com> |
| Date: Tue, 16 Nov 2021 10:48:13 -0500 |
| Subject: NFSv42: Fix pagecache invalidation after COPY/CLONE |
| |
| From: Benjamin Coddington <bcodding@redhat.com> |
| |
| commit 3f015d89a47cd8855cd92f71fff770095bd885a1 upstream. |
| |
| The mechanism in use to allow the client to see the results of COPY/CLONE |
| is to drop those pages from the pagecache. This forces the client to read |
| those pages once more from the server. However, truncate_pagecache_range() |
| zeros out partial pages instead of dropping them. Let us instead use |
| invalidate_inode_pages2_range() with full-page offsets to ensure the client |
| properly sees the results of COPY/CLONE operations. |
| |
| Cc: <stable@vger.kernel.org> # v4.7+ |
| Fixes: 2e72448b07dc ("NFS: Add COPY nfs operation") |
| Signed-off-by: Benjamin Coddington <bcodding@redhat.com> |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs42proc.c | 5 +++-- |
| 1 file changed, 3 insertions(+), 2 deletions(-) |
| |
| --- a/fs/nfs/nfs42proc.c |
| +++ b/fs/nfs/nfs42proc.c |
| @@ -362,8 +362,9 @@ static ssize_t _nfs42_proc_copy(struct f |
| goto out; |
| } |
| |
| - truncate_pagecache_range(dst_inode, pos_dst, |
| - pos_dst + res->write_res.count); |
| + WARN_ON_ONCE(invalidate_inode_pages2_range(dst_inode->i_mapping, |
| + pos_dst >> PAGE_SHIFT, |
| + (pos_dst + res->write_res.count - 1) >> PAGE_SHIFT)); |
| spin_lock(&dst_inode->i_lock); |
| NFS_I(dst_inode)->cache_validity |= (NFS_INO_REVAL_PAGECACHE | |
| NFS_INO_REVAL_FORCED | NFS_INO_INVALID_SIZE | |