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 36a5e74f51b4..f036153d9f50 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/pagemap.h> | 27 | #include <linux/pagemap.h> |
| 28 | #include <linux/aio.h> | 28 | #include <linux/aio.h> |
| 29 | #include <linux/gfp.h> | 29 | #include <linux/gfp.h> |
| 30 | #include <linux/swap.h> | ||
| 30 | 31 | ||
| 31 | #include <asm/uaccess.h> | 32 | #include <asm/uaccess.h> |
| 32 | #include <asm/system.h> | 33 | #include <asm/system.h> |
| @@ -493,11 +494,19 @@ static void nfs_invalidate_page(struct page *page, unsigned long offset) | |||
| 493 | */ | 494 | */ |
| 494 | static int nfs_release_page(struct page *page, gfp_t gfp) | 495 | static int nfs_release_page(struct page *page, gfp_t gfp) |
| 495 | { | 496 | { |
| 497 | struct address_space *mapping = page->mapping; | ||
| 498 | |||
| 496 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); | 499 | dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page); |
| 497 | 500 | ||
| 498 | /* Only do I/O if gfp is a superset of GFP_KERNEL */ | 501 | /* Only do I/O if gfp is a superset of GFP_KERNEL */ |
| 499 | if ((gfp & GFP_KERNEL) == GFP_KERNEL) | 502 | if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL) { |
| 500 | nfs_wb_page(page->mapping->host, page); | 503 | int how = FLUSH_SYNC; |
| 504 | |||
| 505 | /* Don't let kswapd deadlock waiting for OOM RPC calls */ | ||
| 506 | if (current_is_kswapd()) | ||
| 507 | how = 0; | ||
| 508 | nfs_commit_inode(mapping->host, how); | ||
| 509 | } | ||
| 501 | /* If PagePrivate() is set, then the page is not freeable */ | 510 | /* If PagePrivate() is set, then the page is not freeable */ |
| 502 | if (PagePrivate(page)) | 511 | if (PagePrivate(page)) |
| 503 | return 0; | 512 | return 0; |
