diff options
Diffstat (limited to 'fs/xfs/xfs_icache.c')
| -rw-r--r-- | fs/xfs/xfs_icache.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index f35e2cee5265..ddeaccc04aec 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c @@ -1853,12 +1853,20 @@ xfs_inodegc_worker(  						struct xfs_inodegc, work);  	struct llist_node	*node = llist_del_all(&gc->list);  	struct xfs_inode	*ip, *n; +	unsigned int		nofs_flag;  	WRITE_ONCE(gc->items, 0);  	if (!node)  		return; +	/* +	 * We can allocate memory here while doing writeback on behalf of +	 * memory reclaim.  To avoid memory allocation deadlocks set the +	 * task-wide nofs context for the following operations. +	 */ +	nofs_flag = memalloc_nofs_save(); +  	ip = llist_entry(node, struct xfs_inode, i_gclist);  	trace_xfs_inodegc_worker(ip->i_mount, READ_ONCE(gc->shrinker_hits)); @@ -1867,6 +1875,8 @@ xfs_inodegc_worker(  		xfs_iflags_set(ip, XFS_INACTIVATING);  		xfs_inodegc_inactivate(ip);  	} + +	memalloc_nofs_restore(nofs_flag);  }  /*  | 
