Skip to contentSkip to conversation

Patches for upstream 3f015d89a47c NFS COPY/CLONE - stable versions follow

PATCH New Benjamin Coddington 2 participants 7 messages Nov 29, 2021 – Dec 1, 2021 Stable branch

lore
Share & tools
lore
#1 lore raw

PATCH 1/1 NFSv42: Fix pagecache invalidation after COPY/CLONE

In reply to Benjamin Coddington

Upstream commit 3f015d89a47cd8855cd92f71fff770095bd885a1 backported for stable v5.10:

8<----------------------------------------------------------------------

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 <[email protected]> # v4.7+
Fixes 2e72448b07dc ("NFS: Add COPY nfs operation")
---
 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs42proc.c +3 -2
index 4ebcd9dd1535..2587b1b8e2ef 100644
@@ -362,8 +362,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
 			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 |
Signature · 1 line
2.31.1
#2 lore raw

PATCH 1/1 NFSv42: Fix pagecache invalidation after COPY/CLONE

In reply to Benjamin Coddington

Upstream commit 3f015d89a47cd8855cd92f71fff770095bd885a1 backported for stable v5.4:

8<----------------------------------------------------------------------

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 <[email protected]> # v4.7+
Fixes 2e72448b07dc ("NFS: Add COPY nfs operation")
---
 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs42proc.c +3 -2
index 6b7c926824ae..504812ea4bc2 100644
@@ -295,8 +295,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
 			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:
Signature · 1 line
2.31.1
#3 lore raw

PATCH 1/1 NFSv42: Fix pagecache invalidation after COPY/CLONE

In reply to Benjamin Coddington

Upstream commit 3f015d89a47cd8855cd92f71fff770095bd885a1 backported for stable v4.19:

8<----------------------------------------------------------------------

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 <[email protected]> # v4.7+
Fixes 2e72448b07dc ("NFS: Add COPY nfs operation")
---
 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs42proc.c +3 -2
index be252795a6f7..5b1d452e640b 100644
@@ -295,8 +295,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
 			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:
Signature · 1 line
2.31.1
#0 lore raw

The five patches referencing this cover letter are backports of upstream fix "3f015d89a47c NFSv42: Fix pagecache invalidation after COPY/CLONE", which did not apply cleanly to longterm trees.

Note: while the upstream fix received extensive testing, these backports have been build-tested only.

Benjamin Coddington (1):
NFSv42: Fix pagecache invalidation after COPY/CLONE

 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
Signature · 1 line
2.31.1
#4 lore raw

PATCH 1/1 NFSv42: Fix pagecache invalidation after COPY/CLONE

Upstream commit 3f015d89a47cd8855cd92f71fff770095bd885a1 backported for stable v4.9:

8<----------------------------------------------------------------------

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 <[email protected]> # v4.7+
Fixes 2e72448b07dc ("NFS: Add COPY nfs operation")
---
 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs42proc.c +3 -2
index 7efb9e0e9f25..3038cefff15c 100644
@@ -181,8 +181,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
 			return status;
 	}
 
-	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));
 
 	return res->write_res.count;
 }
Signature · 1 line
2.31.1
#5 lore raw

PATCH 1/1 NFSv42: Fix pagecache invalidation after COPY/CLONE

In reply to Benjamin Coddington

Upstream commit 3f015d89a47cd8855cd92f71fff770095bd885a1 backported for stable v4.14:

8<----------------------------------------------------------------------

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 <[email protected]> # v4.7+
Fixes 2e72448b07dc ("NFS: Add COPY nfs operation")
---
 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/nfs42proc.c +3 -2
index a61792f777be..394503c79faf 100644
@@ -186,8 +186,9 @@ static ssize_t _nfs42_proc_copy(struct file *src,
 		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:
Signature · 1 line
2.31.1
maintainer
#6 lore raw
In reply to Benjamin Coddington
Quoted 4 lines · Benjamin Coddington

The five patches referencing this cover letter are backports of upstream fix "3f015d89a47c NFSv42: Fix pagecache invalidation after COPY/CLONE", which did not apply cleanly to longterm trees.

Quoted 12 lines

Note: while the upstream fix received extensive testing, these backports have been build-tested only.

Benjamin Coddington (1):
NFSv42: Fix pagecache invalidation after COPY/CLONE

 fs/nfs/nfs42proc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
Signature · 1 line
2.31.1

All now queued up, thanks!

greg k-h