xfs: skip writeback from reclaim context

Allowing writeback from reclaim context causes massive problems with stack
overflows as we can call into the writeback code which tends to be a heavy
stack user both in the generic code and XFS from random contexts that
perform memory allocations.

Follow the example of btrfs (and in slightly different form ext4) and refuse
to write out data from reclaim context. This issue should really be handled
by the VM so that we can tune better for this case, but until we get it
sorted out there we have to hack around this in each filesystem with a
complex writeback path.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>


authored by Christoph Hellwig and committed by Dave Chinner 070ecdca 99a4d546

+15
+15
fs/xfs/linux-2.6/xfs_aops.c
··· 1333 trace_xfs_writepage(inode, page, 0); 1334 1335 /* 1336 * We need a transaction if: 1337 * 1. There are delalloc buffers on the page 1338 * 2. The page is uptodate and we have unmapped buffers
··· 1333 trace_xfs_writepage(inode, page, 0); 1334 1335 /* 1336 + * Refuse to write the page out if we are called from reclaim context. 1337 + * 1338 + * This is primarily to avoid stack overflows when called from deep 1339 + * used stacks in random callers for direct reclaim, but disabling 1340 + * reclaim for kswap is a nice side-effect as kswapd causes rather 1341 + * suboptimal I/O patters, too. 1342 + * 1343 + * This should really be done by the core VM, but until that happens 1344 + * filesystems like XFS, btrfs and ext4 have to take care of this 1345 + * by themselves. 1346 + */ 1347 + if (current->flags & PF_MEMALLOC) 1348 + goto out_fail; 1349 + 1350 + /* 1351 * We need a transaction if: 1352 * 1. There are delalloc buffers on the page 1353 * 2. The page is uptodate and we have unmapped buffers