From b4f47c7053e8dfceb42a9895fd64b387464036bd Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 1 Dec 2021 10:14:44 +0100 Subject: [PATCH] 4.14-stable patches added patches: nfsv42-fix-pagecache-invalidation-after-copy-clone.patch --- ...ecache-invalidation-after-copy-clone.patch | 39 +++++++++++++++++++ queue-4.14/series | 1 + 2 files changed, 40 insertions(+) create mode 100644 queue-4.14/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch diff --git a/queue-4.14/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch b/queue-4.14/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch new file mode 100644 index 00000000000..e4a1695840f --- /dev/null +++ b/queue-4.14/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch @@ -0,0 +1,39 @@ +From 3f015d89a47cd8855cd92f71fff770095bd885a1 Mon Sep 17 00:00:00 2001 +From: Benjamin Coddington +Date: Tue, 16 Nov 2021 10:48:13 -0500 +Subject: NFSv42: Fix pagecache invalidation after COPY/CLONE + +From: Benjamin Coddington + +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: # v4.7+ +Fixes: 2e72448b07dc ("NFS: Add COPY nfs operation") +Signed-off-by: Benjamin Coddington +Signed-off-by: Trond Myklebust +Signed-off-by: Greg Kroah-Hartman +--- + fs/nfs/nfs42proc.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/fs/nfs/nfs42proc.c ++++ b/fs/nfs/nfs42proc.c +@@ -186,8 +186,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)); + + status = res->write_res.count; + out: diff --git a/queue-4.14/series b/queue-4.14/series index 0d77b0695db..e387c2bbf1b 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -68,3 +68,4 @@ xen-netfront-don-t-trust-the-backend-response-data-blindly.patch tty-hvc-replace-bug_on-with-negative-return-value.patch shm-extend-forced-shm-destroy-to-support-objects-from-several-ipc-nses.patch ipc-warn-if-trying-to-remove-ipc-object-which-is-absent.patch +nfsv42-fix-pagecache-invalidation-after-copy-clone.patch -- 2.39.5