bcachefs: Fix another lockdep splat
authorKent Overstreet <kent.overstreet@gmail.com>
Fri, 16 Oct 2020 01:48:58 +0000 (21:48 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:44 +0000 (17:08 -0400)
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>
fs/bcachefs/btree_cache.c

index 5d1a7f138a5413906966a26581d72a56296f94d4..90d884b18b70d0bf8dc11cd46d61f4b5e7b4c341 100644 (file)
@@ -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);