NFS: fix up nfs_release_folio() to try to release the page
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Thu, 19 Jan 2023 21:33:48 +0000 (16:33 -0500)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Tue, 14 Feb 2023 19:22:33 +0000 (14:22 -0500)
If the gfp context allows it, and we're not kswapd, then try to write
out the folio that has private data.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
fs/nfs/file.c

index 563c5e0c55e8c0979e8ab50bf7df9a7f6f342030..3bed75c5250b45c88bc41d4bf0ac20b37401e54c 100644 (file)
@@ -432,8 +432,13 @@ static bool nfs_release_folio(struct folio *folio, gfp_t gfp)
        dfprintk(PAGECACHE, "NFS: release_folio(%p)\n", folio);
 
        /* If the private flag is set, then the folio is not freeable */
-       if (folio_test_private(folio))
-               return false;
+       if (folio_test_private(folio)) {
+               if ((current_gfp_context(gfp) & GFP_KERNEL) != GFP_KERNEL ||
+                   current_is_kswapd())
+                       return false;
+               if (nfs_wb_folio(folio_file_mapping(folio)->host, folio) < 0)
+                       return false;
+       }
        return nfs_fscache_release_folio(folio, gfp);
 }