From d55c8b68bdab42bd776ba82e269bbba6325d76d0 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 1 Dec 2021 10:17:07 +0100 Subject: [PATCH] 5.4-stable patches added patches: nfsv42-fix-pagecache-invalidation-after-copy-clone.patch --- ...ecache-invalidation-after-copy-clone.patch | 39 +++++++++++++++++++ queue-5.4/series | 1 + 2 files changed, 40 insertions(+) create mode 100644 queue-5.4/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch create mode 100644 queue-5.4/series diff --git a/queue-5.4/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch b/queue-5.4/nfsv42-fix-pagecache-invalidation-after-copy-clone.patch new file mode 100644 index 00000000000..0eb5408c0c8 --- /dev/null +++ b/queue-5.4/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 +@@ -295,8 +295,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-5.4/series b/queue-5.4/series new file mode 100644 index 00000000000..65e6880e7ab --- /dev/null +++ b/queue-5.4/series @@ -0,0 +1 @@ +nfsv42-fix-pagecache-invalidation-after-copy-clone.patch -- 2.47.2