blob: edc6668e0a634610d92a258d5b80fafc2d03dcee [file] [log] [blame]
From stable-bounces@linux.kernel.org Thu Sep 7 17:10:13 2006
From: Trond Myklebust <Trond.Myklebust@netapp.com>
Date: Thu, 07 Sep 2006 20:09:36 -0400
To: stable@kernel.org
Message-Id: <20060908000936.10655.41832.stgit@lade.trondhjem.org>
Subject: NFS: Fix a potential deadlock in nfs_release_page
From: Nikita Danilov <nikita@clusterfs.com>
nfs_wb_page() waits on request completion and, as a result, is not safe to be
called from nfs_release_page() invoked by VM scanner as part of GFP_NOFS
allocation. Fix possible deadlock by analyzing gfp mask and refusing to
release page if __GFP_FS is not set.
Signed-off-by: Nikita Danilov <danilov@gmail.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
---
fs/nfs/file.c | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
--- linux-2.6.17.13.orig/fs/nfs/file.c
+++ linux-2.6.17.13/fs/nfs/file.c
@@ -325,7 +325,13 @@ static void nfs_invalidate_page(struct p
static int nfs_release_page(struct page *page, gfp_t gfp)
{
- return !nfs_wb_page(page->mapping->host, page);
+ if (gfp & __GFP_FS)
+ return !nfs_wb_page(page->mapping->host, page);
+ else
+ /*
+ * Avoid deadlock on nfs_wait_on_request().
+ */
+ return 0;
}
struct address_space_operations nfs_file_aops = {