summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByoungyoung Lee <blee@gatech.edu>2015-03-25 14:57:53 +1100
committerDave Chinner <david@fromorbit.com>2015-03-25 14:57:53 +1100
commit20dafeefac97d1a690b113f2a954dc84fdf8f290 (patch)
tree826d1ee45edb8545a27af8bc1f4f494665b1c534
parent65dd297ac25565701fead5e4ee69b9ca62729f0e (diff)
downloadlwn-20dafeefac97d1a690b113f2a954dc84fdf8f290.tar.gz
lwn-20dafeefac97d1a690b113f2a954dc84fdf8f290.zip
xfs: xfs_mru_cache_insert() should use GFP_NOFS
xfs_mru_cache_insert() can be called from within transaction context during block allocation like so: write(2) .... xfs_get_blocks xfs_iomap_write_direct start transaction xfs_bmapi_write xfs_bmapi_allocate xfs_bmap_btalloc xfs_bmap_btalloc_filestreams xfs_filestream_new_ag xfs_filestream_pick_ag xfs_mru_cache_insert radix_tree_preload(GFP_KERNEL) In this case, GFP_KERNEL is incorrect and can potentially lead to deadlocks in memory reclaim. It should use GFP_NOFS allocations to avoid lock recursion problems. [dchinner: rewrote commit message] Signed-off-by: Byoungyoung Lee <blee@gatech.edu> Signed-off-by: Sanidhya Kashyap <sanidhya.gatech@gmail.com> Reviewed-by: Dave Chinner <dchinner@redhat.com> Signed-off-by: Dave Chinner <david@fromorbit.com>
-rw-r--r--fs/xfs/xfs_mru_cache.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/xfs/xfs_mru_cache.c b/fs/xfs/xfs_mru_cache.c
index 30ecca3037e3..f8a674d7f092 100644
--- a/fs/xfs/xfs_mru_cache.c
+++ b/fs/xfs/xfs_mru_cache.c
@@ -437,7 +437,7 @@ xfs_mru_cache_insert(
if (!mru || !mru->lists)
return -EINVAL;
- if (radix_tree_preload(GFP_KERNEL))
+ if (radix_tree_preload(GFP_NOFS))
return -ENOMEM;
INIT_LIST_HEAD(&elem->list_node);