vfree() can allocate memory, so we need to call memalloc_nofs_save().
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
unsigned long can_free;
unsigned long touched = 0;
unsigned long freed = 0;
- unsigned i;
+ unsigned i, flags;
if (btree_shrinker_disabled(c))
return SHRINK_STOP;
else if (!mutex_trylock(&bc->lock))
return -1;
+ flags = memalloc_nofs_save();
+
/*
* It's _really_ critical that we don't free too many btree nodes - we
* have to always leave ourselves a reserve. The reserve is how we
clear_btree_node_accessed(b);
}
+ memalloc_nofs_restore(flags);
mutex_unlock(&bc->lock);
out:
return (unsigned long) freed * btree_pages(c);