]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
NFS: Fix a potential deadlock in nfs_release_page
authorNikita Danilov <nikita@clusterfs.com>
Fri, 8 Sep 2006 00:09:36 +0000 (20:09 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 13 Oct 2006 18:50:09 +0000 (11:50 -0700)
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

index fade02c15e6ef11a8575e6381b6f10445a1de375..801cc0f1fa65676b337d97c7b0aae9f3ea9ef609 100644 (file)
@@ -325,7 +325,13 @@ static void nfs_invalidate_page(struct page *page, unsigned long offset)
 
 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 = {