summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_key_cache.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-11-29 23:48:20 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:48 -0400
commitd0022290b81c15db3c81936cdb254663598ef35f (patch)
tree299c3c760b0cb3ceb1aad6a91f01b54c881920df /fs/bcachefs/btree_key_cache.c
parent5731cf01567da4f354bbff4a040b53f3f86328ad (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.c11
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)