Commit ac958006 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Factor out bch2_ec_stripes_heap_start()

This fixes a bug where mark and sweep gc incorrectly was clearing out
the stripes heap and causing assertions to fire later - simpler to just
create the stripes heap after gc has finished.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent edfbba58
...@@ -607,8 +607,6 @@ static int bch2_gc_done(struct bch_fs *c, ...@@ -607,8 +607,6 @@ static int bch2_gc_done(struct bch_fs *c,
struct genradix_iter src_iter = genradix_iter_init(&c->stripes[1], 0); struct genradix_iter src_iter = genradix_iter_init(&c->stripes[1], 0);
struct stripe *dst, *src; struct stripe *dst, *src;
c->ec_stripes_heap.used = 0;
while ((dst = genradix_iter_peek(&dst_iter, &c->stripes[0])) && while ((dst = genradix_iter_peek(&dst_iter, &c->stripes[0])) &&
(src = genradix_iter_peek(&src_iter, &c->stripes[1]))) { (src = genradix_iter_peek(&src_iter, &c->stripes[1]))) {
BUG_ON(src_iter.pos != dst_iter.pos); BUG_ON(src_iter.pos != dst_iter.pos);
...@@ -625,12 +623,6 @@ static int bch2_gc_done(struct bch_fs *c, ...@@ -625,12 +623,6 @@ static int bch2_gc_done(struct bch_fs *c,
copy_stripe_field(block_sectors[i], copy_stripe_field(block_sectors[i],
"block_sectors[%u]", i); "block_sectors[%u]", i);
if (dst->alive) {
spin_lock(&c->ec_stripes_heap_lock);
bch2_stripes_heap_insert(c, dst, dst_iter.pos);
spin_unlock(&c->ec_stripes_heap_lock);
}
genradix_iter_advance(&dst_iter, &c->stripes[0]); genradix_iter_advance(&dst_iter, &c->stripes[0]);
genradix_iter_advance(&src_iter, &c->stripes[1]); genradix_iter_advance(&src_iter, &c->stripes[1]);
} }
......
...@@ -1450,6 +1450,16 @@ void bch2_ec_stop_dev(struct bch_fs *c, struct bch_dev *ca) ...@@ -1450,6 +1450,16 @@ void bch2_ec_stop_dev(struct bch_fs *c, struct bch_dev *ca)
mutex_unlock(&c->ec_stripe_head_lock); mutex_unlock(&c->ec_stripe_head_lock);
} }
void bch2_stripes_heap_start(struct bch_fs *c)
{
struct genradix_iter iter;
struct stripe *m;
genradix_for_each(&c->stripes[0], iter, m)
if (m->alive)
bch2_stripes_heap_insert(c, m, iter.pos);
}
static int __bch2_stripe_write_key(struct btree_trans *trans, static int __bch2_stripe_write_key(struct btree_trans *trans,
struct btree_iter *iter, struct btree_iter *iter,
struct stripe *m, struct stripe *m,
...@@ -1529,18 +1539,11 @@ static int bch2_stripes_read_fn(struct bch_fs *c, enum btree_id id, ...@@ -1529,18 +1539,11 @@ static int bch2_stripes_read_fn(struct bch_fs *c, enum btree_id id,
int ret = 0; int ret = 0;
if (k.k->type == KEY_TYPE_stripe) { if (k.k->type == KEY_TYPE_stripe) {
struct stripe *m;
ret = __ec_stripe_mem_alloc(c, k.k->p.offset, GFP_KERNEL) ?: ret = __ec_stripe_mem_alloc(c, k.k->p.offset, GFP_KERNEL) ?:
bch2_mark_key(c, k, 0, 0, NULL, 0, bch2_mark_key(c, k, 0, 0, NULL, 0,
BTREE_TRIGGER_NOATOMIC); BTREE_TRIGGER_NOATOMIC);
if (ret) if (ret)
return ret; return ret;
spin_lock(&c->ec_stripes_heap_lock);
m = genradix_ptr(&c->stripes[0], k.k->p.offset);
bch2_stripes_heap_insert(c, m, k.k->p.offset);
spin_unlock(&c->ec_stripes_heap_lock);
} }
return ret; return ret;
......
...@@ -200,6 +200,8 @@ void bch2_ec_stop_dev(struct bch_fs *, struct bch_dev *); ...@@ -200,6 +200,8 @@ void bch2_ec_stop_dev(struct bch_fs *, struct bch_dev *);
void bch2_ec_flush_new_stripes(struct bch_fs *); void bch2_ec_flush_new_stripes(struct bch_fs *);
void bch2_stripes_heap_start(struct bch_fs *);
struct journal_keys; struct journal_keys;
int bch2_stripes_read(struct bch_fs *, struct journal_keys *); int bch2_stripes_read(struct bch_fs *, struct journal_keys *);
int bch2_stripes_write(struct bch_fs *, unsigned); int bch2_stripes_write(struct bch_fs *, unsigned);
......
...@@ -1125,6 +1125,8 @@ int bch2_fs_recovery(struct bch_fs *c) ...@@ -1125,6 +1125,8 @@ int bch2_fs_recovery(struct bch_fs *c)
bch_verbose(c, "mark and sweep done"); bch_verbose(c, "mark and sweep done");
} }
bch2_stripes_heap_start(c);
clear_bit(BCH_FS_REBUILD_REPLICAS, &c->flags); clear_bit(BCH_FS_REBUILD_REPLICAS, &c->flags);
set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags); set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment