From: Nikita Danilov Date: Fri, 8 Sep 2006 00:09:36 +0000 (-0400) Subject: NFS: Fix a potential deadlock in nfs_release_page X-Git-Tag: v2.6.17.14~17 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=18807ffe4e541639abae40dcd2ebd7a20e9078d6;p=thirdparty%2Fkernel%2Fstable.git NFS: Fix a potential deadlock in nfs_release_page 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 Signed-off-by: Trond Myklebust Signed-off-by: Greg Kroah-Hartman --- diff --git a/fs/nfs/file.c b/fs/nfs/file.c index fade02c15e6ef..801cc0f1fa656 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -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 = {