diff options
Diffstat (limited to 'fs/nfs/file.c')
| -rw-r--r-- | fs/nfs/file.c | 13 | 
1 files changed, 11 insertions, 2 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index 36a5e74f51b..f036153d9f5 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c @@ -27,6 +27,7 @@  #include <linux/pagemap.h>  #include <linux/aio.h>  #include <linux/gfp.h> +#include <linux/swap.h>  #include <asm/uaccess.h>  #include <asm/system.h> @@ -493,11 +494,19 @@ static void nfs_invalidate_page(struct page *page, unsigned long offset)   */  static int nfs_release_page(struct page *page, gfp_t gfp)  { +	struct address_space *mapping = page->mapping; +  	dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);  	/* 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 (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL) { +		int how = FLUSH_SYNC; + +		/* Don't let kswapd deadlock waiting for OOM RPC calls */ +		if (current_is_kswapd()) +			how = 0; +		nfs_commit_inode(mapping->host, how); +	}  	/* If PagePrivate() is set, then the page is not freeable */  	if (PagePrivate(page))  		return 0;  |