bcachefs: Fix error in filesystem initialization
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 30 Nov 2020 04:48:20 +0000 (23:48 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:48 +0000 (17:08 -0400)
The rhashtable code doesn't like when we destroy an rhashtable that was
never initialized

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_key_cache.c
fs/bcachefs/btree_types.h

index d1f226e66158d3114b4eaba460ab5a5b642dfcbd..ae3d5880f84eb03b76a88a4a260de734f43c04b3 100644 (file)
@@ -608,7 +608,8 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
        }
        mutex_unlock(&bc->lock);
 
-       rhashtable_destroy(&bc->table);
+       if (bc->table_init_done)
+               rhashtable_destroy(&bc->table);
 }
 
 void bch2_fs_btree_key_cache_init_early(struct btree_key_cache *c)
@@ -622,13 +623,19 @@ void bch2_fs_btree_key_cache_init_early(struct btree_key_cache *c)
 int bch2_fs_btree_key_cache_init(struct btree_key_cache *bc)
 {
        struct bch_fs *c = container_of(bc, struct bch_fs, btree_key_cache);
+       int ret;
 
        bc->shrink.seeks                = 1;
        bc->shrink.count_objects        = bch2_btree_key_cache_count;
        bc->shrink.scan_objects         = bch2_btree_key_cache_scan;
 
-       return  register_shrinker(&bc->shrink, "%s/btree_key_cache", c->name) ?:
+       ret =   register_shrinker(&bc->shrink, "%s/btree_key_cache", c->name) ?:
                rhashtable_init(&bc->table, &bch2_btree_key_cache_params);
+       if (ret)
+               return ret;
+
+       bc->table_init_done = true;
+       return 0;
 }
 
 void bch2_btree_key_cache_to_text(struct printbuf *out, struct btree_key_cache *c)
index d861d94242a46750cbc27983d1dba3bceddaf622..28f0d7b85ad6ef3815131213611864db9b4e1bb4 100644 (file)
@@ -293,6 +293,7 @@ static inline struct btree_iter_level *iter_l(struct btree_iter *iter)
 struct btree_key_cache {
        struct mutex            lock;
        struct rhashtable       table;
+       bool                    table_init_done;
        struct list_head        freed;
        struct list_head        clean;
        struct list_head        dirty;