diff options
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r-- | fs/bcachefs/recovery.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c index 433e7745799b..dcd4f9f410ae 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -1262,17 +1262,16 @@ static int bch2_run_recovery_pass(struct bch_fs *c, enum bch_recovery_pass pass) static int bch2_run_recovery_passes(struct bch_fs *c) { int ret = 0; -again: + while (c->curr_recovery_pass < ARRAY_SIZE(recovery_passes)) { ret = bch2_run_recovery_pass(c, c->curr_recovery_pass); + if (bch2_err_matches(ret, BCH_ERR_restart_recovery)) + continue; if (ret) break; c->curr_recovery_pass++; } - if (bch2_err_matches(ret, BCH_ERR_restart_recovery)) - goto again; - return ret; } @@ -1450,6 +1449,11 @@ use_clean: if (ret) goto err; + if (c->opts.fsck && + (IS_ENABLED(CONFIG_BCACHEFS_DEBUG) || + BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb))) + c->recovery_passes_explicit |= BIT_ULL(BCH_RECOVERY_PASS_check_topology); + ret = bch2_run_recovery_passes(c); if (ret) goto err; |