]> www.infradead.org Git - users/hch/block.git/commitdiff
bcachefs: Fix snapshot.c assertion for online fsck
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 10 Dec 2023 17:42:49 +0000 (12:42 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 1 Jan 2024 16:47:41 +0000 (11:47 -0500)
c->curr_recovery_pass can go backwards; this adds a non rewinding
version, c->recovery_pass_done.

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

index b42e3854c51f77a899816106f5a07f4fd025b8e9..f33f510463d1b5d8bfc98c4921ead12fcceb2f74 100644 (file)
@@ -1057,7 +1057,10 @@ struct bch_fs {
        enum bch_recovery_pass  curr_recovery_pass;
        /* bitmap of explicitly enabled recovery passes: */
        u64                     recovery_passes_explicit;
+       /* bitmask of recovery passes that we actually ran */
        u64                     recovery_passes_complete;
+       /* never rewinds version of curr_recovery_pass */
+       enum bch_recovery_pass  recovery_pass_done;
        struct semaphore        online_fsck_mutex;
 
        /* DEBUG JUNK */
index ed366b35a1f2805db692d853875313bdab6c4154..1099b2f51252d69af7640a95023bc2da4e14a98b 100644 (file)
@@ -713,6 +713,7 @@ static int bch2_run_recovery_passes(struct bch_fs *c)
                        c->recovery_passes_complete |= BIT_ULL(c->curr_recovery_pass);
                }
                c->curr_recovery_pass++;
+               c->recovery_pass_done = max(c->recovery_pass_done, c->curr_recovery_pass);
        }
 
        return ret;
@@ -1197,6 +1198,8 @@ int bch2_fs_initialize(struct bch_fs *c)
                goto err;
        }
 
+       c->recovery_pass_done = ARRAY_SIZE(recovery_pass_fns) - 1;
+
        if (enabled_qtypes(c)) {
                ret = bch2_fs_quota_read(c);
                if (ret)
index 1b1b7e76167e4936764a971b6fc583056d2715b2..8d1800ef22b568648f7fa21c742aa3bd06bc33f3 100644 (file)
@@ -123,7 +123,7 @@ bool __bch2_snapshot_is_ancestor(struct bch_fs *c, u32 id, u32 ancestor)
        struct snapshot_table *t;
        bool ret;
 
-       EBUG_ON(c->curr_recovery_pass <= BCH_RECOVERY_PASS_check_snapshots);
+       EBUG_ON(c->recovery_pass_done <= BCH_RECOVERY_PASS_check_snapshots);
 
        rcu_read_lock();
        t = rcu_dereference(c->snapshots);