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

bcachefs: Don't loop into topology repair

Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent 08061519
...@@ -498,6 +498,7 @@ enum { ...@@ -498,6 +498,7 @@ enum {
BCH_FS_ALLOCATOR_STOPPING, BCH_FS_ALLOCATOR_STOPPING,
BCH_FS_INITIAL_GC_DONE, BCH_FS_INITIAL_GC_DONE,
BCH_FS_INITIAL_GC_UNFIXED, BCH_FS_INITIAL_GC_UNFIXED,
BCH_FS_TOPOLOGY_REPAIR_DONE,
BCH_FS_BTREE_INTERIOR_REPLAY_DONE, BCH_FS_BTREE_INTERIOR_REPLAY_DONE,
BCH_FS_FSCK_DONE, BCH_FS_FSCK_DONE,
BCH_FS_STARTED, BCH_FS_STARTED,
......
...@@ -95,7 +95,8 @@ static int bch2_gc_check_topology(struct bch_fs *c, ...@@ -95,7 +95,8 @@ static int bch2_gc_check_topology(struct bch_fs *c,
" cur %s", " cur %s",
bch2_btree_ids[b->c.btree_id], b->c.level, bch2_btree_ids[b->c.btree_id], b->c.level,
buf1, buf1,
(bch2_bkey_val_to_text(&PBUF(buf2), c, bkey_i_to_s_c(cur.k)), buf2))) { (bch2_bkey_val_to_text(&PBUF(buf2), c, bkey_i_to_s_c(cur.k)), buf2)) &&
!test_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags)) {
bch_info(c, "Halting mark and sweep to start topology repair pass"); bch_info(c, "Halting mark and sweep to start topology repair pass");
return FSCK_ERR_START_TOPOLOGY_REPAIR; return FSCK_ERR_START_TOPOLOGY_REPAIR;
} else { } else {
...@@ -116,7 +117,8 @@ static int bch2_gc_check_topology(struct bch_fs *c, ...@@ -116,7 +117,8 @@ static int bch2_gc_check_topology(struct bch_fs *c,
" expected %s", " expected %s",
bch2_btree_ids[b->c.btree_id], b->c.level, bch2_btree_ids[b->c.btree_id], b->c.level,
(bch2_bkey_val_to_text(&PBUF(buf1), c, bkey_i_to_s_c(cur.k)), buf1), (bch2_bkey_val_to_text(&PBUF(buf1), c, bkey_i_to_s_c(cur.k)), buf1),
(bch2_bpos_to_text(&PBUF(buf2), node_end), buf2))) { (bch2_bpos_to_text(&PBUF(buf2), node_end), buf2)) &&
!test_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags)) {
bch_info(c, "Halting mark and sweep to start topology repair pass"); bch_info(c, "Halting mark and sweep to start topology repair pass");
return FSCK_ERR_START_TOPOLOGY_REPAIR; return FSCK_ERR_START_TOPOLOGY_REPAIR;
} else { } else {
...@@ -900,7 +902,8 @@ static int bch2_gc_btree_init_recurse(struct bch_fs *c, struct btree *b, ...@@ -900,7 +902,8 @@ static int bch2_gc_btree_init_recurse(struct bch_fs *c, struct btree *b,
" %s", " %s",
bch2_btree_ids[b->c.btree_id], bch2_btree_ids[b->c.btree_id],
b->c.level - 1, b->c.level - 1,
(bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(cur.k)), buf))) { (bch2_bkey_val_to_text(&PBUF(buf), c, bkey_i_to_s_c(cur.k)), buf)) &&
!test_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags)) {
ret = FSCK_ERR_START_TOPOLOGY_REPAIR; ret = FSCK_ERR_START_TOPOLOGY_REPAIR;
bch_info(c, "Halting mark and sweep to start topology repair pass"); bch_info(c, "Halting mark and sweep to start topology repair pass");
goto fsck_err; goto fsck_err;
...@@ -1599,11 +1602,14 @@ int bch2_gc(struct bch_fs *c, bool initial, bool metadata_only) ...@@ -1599,11 +1602,14 @@ int bch2_gc(struct bch_fs *c, bool initial, bool metadata_only)
if (ret) if (ret)
goto out; goto out;
bch_info(c, "topology repair pass done"); bch_info(c, "topology repair pass done");
set_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags);
} }
ret = bch2_gc_btrees(c, initial, metadata_only); ret = bch2_gc_btrees(c, initial, metadata_only);
if (ret == FSCK_ERR_START_TOPOLOGY_REPAIR && if (ret == FSCK_ERR_START_TOPOLOGY_REPAIR &&
!test_bit(BCH_FS_TOPOLOGY_REPAIR_DONE, &c->flags) &&
!test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags)) { !test_bit(BCH_FS_INITIAL_GC_DONE, &c->flags)) {
set_bit(BCH_FS_NEED_ANOTHER_GC, &c->flags); set_bit(BCH_FS_NEED_ANOTHER_GC, &c->flags);
ret = 0; ret = 0;
......
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