Commit 249bf593 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: Fix snapshot.c assertion for online fsck

c->curr_recovery_pass can go backwards; this adds a non rewinding
version, c->recovery_pass_done.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent b56cee70
...@@ -1057,7 +1057,10 @@ struct bch_fs { ...@@ -1057,7 +1057,10 @@ struct bch_fs {
enum bch_recovery_pass curr_recovery_pass; enum bch_recovery_pass curr_recovery_pass;
/* bitmap of explicitly enabled recovery passes: */ /* bitmap of explicitly enabled recovery passes: */
u64 recovery_passes_explicit; u64 recovery_passes_explicit;
/* bitmask of recovery passes that we actually ran */
u64 recovery_passes_complete; u64 recovery_passes_complete;
/* never rewinds version of curr_recovery_pass */
enum bch_recovery_pass recovery_pass_done;
struct semaphore online_fsck_mutex; struct semaphore online_fsck_mutex;
/* DEBUG JUNK */ /* DEBUG JUNK */
......
...@@ -713,6 +713,7 @@ static int bch2_run_recovery_passes(struct bch_fs *c) ...@@ -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->recovery_passes_complete |= BIT_ULL(c->curr_recovery_pass);
} }
c->curr_recovery_pass++; c->curr_recovery_pass++;
c->recovery_pass_done = max(c->recovery_pass_done, c->curr_recovery_pass);
} }
return ret; return ret;
...@@ -1197,6 +1198,8 @@ int bch2_fs_initialize(struct bch_fs *c) ...@@ -1197,6 +1198,8 @@ int bch2_fs_initialize(struct bch_fs *c)
goto err; goto err;
} }
c->recovery_pass_done = ARRAY_SIZE(recovery_pass_fns) - 1;
if (enabled_qtypes(c)) { if (enabled_qtypes(c)) {
ret = bch2_fs_quota_read(c); ret = bch2_fs_quota_read(c);
if (ret) if (ret)
......
...@@ -123,7 +123,7 @@ bool __bch2_snapshot_is_ancestor(struct bch_fs *c, u32 id, u32 ancestor) ...@@ -123,7 +123,7 @@ bool __bch2_snapshot_is_ancestor(struct bch_fs *c, u32 id, u32 ancestor)
struct snapshot_table *t; struct snapshot_table *t;
bool ret; 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(); rcu_read_lock();
t = rcu_dereference(c->snapshots); t = rcu_dereference(c->snapshots);
......
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