diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-19 13:55:17 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-03-19 13:55:17 -0400 |
commit | d812e575822a2b7ab1a7cadae2571505ec6ec2bd (patch) | |
tree | b94dad3a91d968a7851b65ce9f3f4960d9d99d6b | |
parent | fc7f99cf36ebae853639dabb43bc2f0098c59aef (diff) | |
download | linux-3.10-d812e575822a2b7ab1a7cadae2571505ec6ec2bd.tar.gz linux-3.10-d812e575822a2b7ab1a7cadae2571505ec6ec2bd.tar.bz2 linux-3.10-d812e575822a2b7ab1a7cadae2571505ec6ec2bd.zip |
NFS: Prevent another deadlock in nfs_release_page()
We should not attempt to free the page if __GFP_FS is not set. Otherwise we
can deadlock as per
http://bugzilla.kernel.org/show_bug.cgi?id=15578
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Cc: stable@kernel.org
-rw-r--r-- | fs/nfs/file.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index ae8d02294e4..ae0d9273653 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -491,7 +491,8 @@ static int nfs_release_page(struct page *page, gfp_t gfp) { dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); - if (gfp & __GFP_WAIT) + /* Only do I/O if gfp is a superset of GFP_KERNEL */ + if ((gfp & GFP_KERNEL) == GFP_KERNEL) nfs_wb_page(page->mapping->host, page); /* If PagePrivate() is set, then the page is not freeable */ if (PagePrivate(page)) |