diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-11-29 23:48:20 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:08:48 -0400 |
commit | d0022290b81c15db3c81936cdb254663598ef35f (patch) | |
tree | 299c3c760b0cb3ceb1aad6a91f01b54c881920df /fs/bcachefs/btree_key_cache.c | |
parent | 5731cf01567da4f354bbff4a040b53f3f86328ad (diff) |
bcachefs: Fix error in filesystem initialization
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>
Diffstat (limited to 'fs/bcachefs/btree_key_cache.c')
-rw-r--r-- | fs/bcachefs/btree_key_cache.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c index d1f226e66158..ae3d5880f84e 100644 --- a/fs/bcachefs/btree_key_cache.c +++ b/fs/bcachefs/btree_key_cache.c @@ -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) |