aboutsummaryrefslogtreecommitdiff
path: root/fs/xfs/linux-2.6/xfs_aops.c
diff options
context:
space:
mode:
authorAlex Elder <aelder@sgi.com>2010-06-04 13:22:30 -0500
committerAlex Elder <aelder@sgi.com>2010-06-04 13:22:30 -0500
commit1bf7dbfde8fe7ddaa8e2e1b4e0fc41a9fc6aa7a5 (patch)
treefdb99e686fa40e79cc53f80dfed58e9b548ed4eb /fs/xfs/linux-2.6/xfs_aops.c
parentad8456361fa19068cf49b50a4f98e41b73c08e76 (diff)
parentf9369729496a0f4c607a4cc1ea4dfeddbbfc505a (diff)
Merge branch 'master' into for-linus
Diffstat (limited to 'fs/xfs/linux-2.6/xfs_aops.c')
-rw-r--r--fs/xfs/linux-2.6/xfs_aops.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c
index 089eaca860b..a0fa3bf0d1b 100644
--- a/fs/xfs/linux-2.6/xfs_aops.c
+++ b/fs/xfs/linux-2.6/xfs_aops.c
@@ -1333,6 +1333,21 @@ xfs_vm_writepage(
trace_xfs_writepage(inode, page, 0);
/*
+ * Refuse to write the page out if we are called from reclaim context.
+ *
+ * This is primarily to avoid stack overflows when called from deep
+ * used stacks in random callers for direct reclaim, but disabling
+ * reclaim for kswap is a nice side-effect as kswapd causes rather
+ * suboptimal I/O patters, too.
+ *
+ * This should really be done by the core VM, but until that happens
+ * filesystems like XFS, btrfs and ext4 have to take care of this
+ * by themselves.
+ */
+ if (current->flags & PF_MEMALLOC)
+ goto out_fail;
+
+ /*
* We need a transaction if:
* 1. There are delalloc buffers on the page
* 2. The page is uptodate and we have unmapped buffers