bcachefs: Ensure topology repair runs
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 4 Aug 2023 00:57:06 +0000 (20:57 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:09 +0000 (17:10 -0400)
This fixes should_restart_for_topology_repair() - previously it was
returning false if the btree io path had already seleceted topology
repair to run, even if it hadn't run yet.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_gc.c
fs/bcachefs/recovery.c
fs/bcachefs/recovery.h

index 019d534..3b39597 100644 (file)
@@ -995,6 +995,7 @@ struct bch_fs {
        enum bch_recovery_pass  curr_recovery_pass;
        /* bitmap of explicitly enabled recovery passes: */
        u64                     recovery_passes_explicit;
+       u64                     recovery_passes_complete;
 
        /* DEBUG JUNK */
        struct dentry           *fs_debug_dir;
index 43e6222..3f5b4d8 100644 (file)
@@ -43,7 +43,7 @@
 static bool should_restart_for_topology_repair(struct bch_fs *c)
 {
        return c->opts.fix_errors != FSCK_FIX_no &&
-               !(c->recovery_passes_explicit & BIT_ULL(BCH_RECOVERY_PASS_check_topology));
+               !(c->recovery_passes_complete & BIT_ULL(BCH_RECOVERY_PASS_check_topology));
 }
 
 static inline void __gc_pos_set(struct bch_fs *c, struct gc_pos new_pos)
index 3fd7f96..edc9830 100644 (file)
@@ -1266,6 +1266,8 @@ static int bch2_run_recovery_pass(struct bch_fs *c, enum bch_recovery_pass pass)
                        return ret;
                if (!(p->when & PASS_SILENT))
                        printk(KERN_CONT " done\n");
+
+               c->recovery_passes_complete |= BIT_ULL(pass);
        }
 
        return 0;
index 26cd6a2..0cd6b8a 100644 (file)
@@ -68,6 +68,7 @@ static inline int bch2_run_explicit_recovery_pass(struct bch_fs *c,
 
        if (c->curr_recovery_pass >= pass) {
                c->curr_recovery_pass = pass;
+               c->recovery_passes_complete &= (1ULL << pass) >> 1;
                return -BCH_ERR_restart_recovery;
        } else {
                return 0;