summaryrefslogtreecommitdiffstats
path: root/fs/nfs/file.c
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2016-06-02 18:10:33 -0400
committerTrond Myklebust <trond.myklebust@primarydata.com>2016-06-22 09:59:44 -0400
commit4f52b6bb8c57b9accafad526a429d6c0851cc62f (patch)
treef353d0c44725548e043d408cf92d0a02a23ee15e /fs/nfs/file.c
parent93761d9863c332d1099d80629f89cf48eb745e48 (diff)
NFS: Don't call COMMIT in ->releasepage()
While COMMIT has the potential to free up a lot of memory that is being taken by unstable writes, it isn't guaranteed to free up this particular page. Also, calling fsync() on the server is expensive and so we want to do it in a more controlled fashion, rather than have it triggered at random by the VM. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
Diffstat (limited to 'fs/nfs/file.c')
-rw-r--r--fs/nfs/file.c23
1 files changed, 0 insertions, 23 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c
index 249262b6bcbe..df4dd8e7e62e 100644
--- a/fs/nfs/file.c
+++ b/fs/nfs/file.c
@@ -460,31 +460,8 @@ static void nfs_invalidate_page(struct page *page, unsigned int offset,
460 */ 460 */
461static int nfs_release_page(struct page *page, gfp_t gfp) 461static int nfs_release_page(struct page *page, gfp_t gfp)
462{ 462{
463 struct address_space *mapping = page->mapping;
464
465 dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); 463 dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
466 464
467 /* Always try to initiate a 'commit' if relevant, but only
468 * wait for it if the caller allows blocking. Even then,
469 * only wait 1 second and only if the 'bdi' is not congested.
470 * Waiting indefinitely can cause deadlocks when the NFS
471 * server is on this machine, when a new TCP connection is
472 * needed and in other rare cases. There is no particular
473 * need to wait extensively here. A short wait has the
474 * benefit that someone else can worry about the freezer.
475 */
476 if (mapping) {
477 struct nfs_server *nfss = NFS_SERVER(mapping->host);
478 nfs_commit_inode(mapping->host, 0);
479 if (gfpflags_allow_blocking(gfp) &&
480 !bdi_write_congested(&nfss->backing_dev_info)) {
481 wait_on_page_bit_killable_timeout(page, PG_private,
482 HZ);
483 if (PagePrivate(page))
484 set_bdi_congested(&nfss->backing_dev_info,
485 BLK_RW_ASYNC);
486 }
487 }
488 /* If PagePrivate() is set, then the page is not freeable */ 465 /* If PagePrivate() is set, then the page is not freeable */
489 if (PagePrivate(page)) 466 if (PagePrivate(page))
490 return 0; 467 return 0;