| 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 = { |