diff options
-rw-r--r-- | fs/bcachefs/btree_key_cache.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 |
2 files changed, 15 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c index a8d05b4739b7..a21dc485c677 100644 --- a/fs/bcachefs/btree_key_cache.c +++ b/fs/bcachefs/btree_key_cache.c @@ -607,7 +607,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) @@ -620,12 +621,22 @@ void bch2_fs_btree_key_cache_init_early(struct btree_key_cache *c) int bch2_fs_btree_key_cache_init(struct btree_key_cache *c) { + int ret; + c->shrink.seeks = 1; c->shrink.count_objects = bch2_btree_key_cache_count; c->shrink.scan_objects = bch2_btree_key_cache_scan; - return register_shrinker(&c->shrink) ?: - rhashtable_init(&c->table, &bch2_btree_key_cache_params); + ret = register_shrinker(&c->shrink); + if (ret) + return ret; + + ret = rhashtable_init(&c->table, &bch2_btree_key_cache_params); + if (ret) + return ret; + + c->table_init_done = true; + return 0; } void bch2_btree_key_cache_to_text(struct printbuf *out, struct btree_key_cache *c) diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index 2d142ef601e1..cf59f1224741 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -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; |