]> www.infradead.org Git - users/hch/misc.git/commitdiff
NFS: nfs_invalidate_folio() must observe the offset and size arguments
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Wed, 3 Sep 2025 15:48:57 +0000 (11:48 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Sat, 6 Sep 2025 20:51:26 +0000 (16:51 -0400)
If we're truncating part of the folio, then we need to write out the
data on the part that is not covered by the cancellation.

Fixes: d47992f86b30 ("mm: change invalidatepage prototype to accept length")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/file.c
fs/nfs/write.c

index a3105f944a0ee3ed9a31a99ec1b7fd66f7e6eec4..8059ece82468d0ccb1dfb6562d7b57bc5e1a4bc5 100644 (file)
@@ -475,10 +475,11 @@ static void nfs_invalidate_folio(struct folio *folio, size_t offset,
        dfprintk(PAGECACHE, "NFS: invalidate_folio(%lu, %zu, %zu)\n",
                 folio->index, offset, length);
 
-       if (offset != 0 || length < folio_size(folio))
-               return;
        /* Cancel any unstarted writes on this page */
-       nfs_wb_folio_cancel(inode, folio);
+       if (offset != 0 || length < folio_size(folio))
+               nfs_wb_folio(inode, folio);
+       else
+               nfs_wb_folio_cancel(inode, folio);
        folio_wait_private_2(folio); /* [DEPRECATED] */
        trace_nfs_invalidate_folio(inode, folio_pos(folio) + offset, length);
 }
index 8b7c04737967551e9dcc81c834bcef9d311f4eb3..e359fbcdc8a095f6470f2324a710df1e2f1c9175 100644 (file)
@@ -2045,6 +2045,7 @@ int nfs_wb_folio_cancel(struct inode *inode, struct folio *folio)
                 * release it */
                nfs_inode_remove_request(req);
                nfs_unlock_and_release_request(req);
+               folio_cancel_dirty(folio);
        }
 
        return ret;