summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_cache.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-10-15 21:48:58 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:44 -0400
commit97c0e19502549c0501581f9efff45022a10be2aa (patch)
tree6f56b10433fb3f7f40a6d13050ad0b735bbe1418 /fs/bcachefs/btree_cache.c
parent505b7a4c2844d8ee0004ab905874513776bc14da (diff)
bcachefs: Fix another lockdep splat
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>
Diffstat (limited to 'fs/bcachefs/btree_cache.c')
-rw-r--r--fs/bcachefs/btree_cache.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/bcachefs/btree_cache.c b/fs/bcachefs/btree_cache.c
index 5d1a7f138a54..90d884b18b70 100644
--- a/fs/bcachefs/btree_cache.c
+++ b/fs/bcachefs/btree_cache.c
@@ -253,7 +253,7 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink,
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;
@@ -264,6 +264,8 @@ static unsigned long bch2_btree_cache_scan(struct shrinker *shrink,
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
@@ -327,6 +329,7 @@ restart:
clear_btree_node_accessed(b);
}
+ memalloc_nofs_restore(flags);
mutex_unlock(&bc->lock);
out:
return (unsigned long) freed * btree_pages(c);