If we're autofixing topology errors, we shouldn't shutdown if we're
still in recovery.

Signed-off-by: Kent Overstreet <[email protected]>
---
 fs/bcachefs/bcachefs.h | 1 +
 fs/bcachefs/error.c    | 2 +-
 fs/bcachefs/recovery.c | 2 ++
 3 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index a85b3bcc6383..d88129503bc5 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -614,6 +614,7 @@ struct bch_dev {
        x(going_ro)                     \
        x(write_disable_complete)       \
        x(clean_shutdown)               \
+       x(recovery_running)             \
        x(fsck_running)                 \
        x(initial_gc_unfixed)           \
        x(need_delete_dead_snapshots)   \
diff --git a/fs/bcachefs/error.c b/fs/bcachefs/error.c
index 9a695322b33c..5b67361b0cf1 100644
--- a/fs/bcachefs/error.c
+++ b/fs/bcachefs/error.c
@@ -34,7 +34,7 @@ bool bch2_inconsistent_error(struct bch_fs *c)
 int bch2_topology_error(struct bch_fs *c)
 {
        set_bit(BCH_FS_topology_error, &c->flags);
-       if (!test_bit(BCH_FS_fsck_running, &c->flags)) {
+       if (!test_bit(BCH_FS_recovery_running, &c->flags)) {
                bch2_inconsistent_error(c);
                return -BCH_ERR_btree_need_topology_repair;
        } else {
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index 64bb330eac86..c50dede64785 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -774,6 +774,7 @@ int bch2_fs_recovery(struct bch_fs *c)
                set_bit(BCH_FS_fsck_running, &c->flags);
        if (c->sb.clean)
                set_bit(BCH_FS_clean_recovery, &c->flags);
+       set_bit(BCH_FS_recovery_running, &c->flags);
 
        ret = bch2_blacklist_table_initialize(c);
        if (ret) {
@@ -925,6 +926,7 @@ int bch2_fs_recovery(struct bch_fs *c)
         */
        set_bit(BCH_FS_may_go_rw, &c->flags);
        clear_bit(BCH_FS_fsck_running, &c->flags);
+       clear_bit(BCH_FS_recovery_running, &c->flags);
 
        /* in case we don't run journal replay, i.e. norecovery mode */
        set_bit(BCH_FS_accounting_replay_done, &c->flags);
-- 
2.45.2


Reply via email to