summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2020-11-29 23:48:20 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2020-12-16 15:29:08 -0500
commit1fa75b3fe98cb8ad45d18e00f5f63c7794e60731 (patch)
tree860c84d36b2a3f9869177396bf2a071a00b9899a
parenteb0d0c344c074acaee05b69550c1904f3cf179b8 (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>
-rw-r--r--fs/bcachefs/btree_key_cache.c17
-rw-r--r--fs/bcachefs/btree_types.h1
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;