|
@@ -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;
|