bcachefs: Run upgrade/downgrade even in -o nochanges mode
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 29 Apr 2024 01:24:45 +0000 (21:24 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 8 May 2024 21:29:17 +0000 (17:29 -0400)
We need to be able to test these paths in dry run mode.

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

index 8091d0686029f40a694042f860c91de8840576ed..08c0422a722dc32fde7129d1fc5fd8d45f13c6d7 100644 (file)
@@ -597,56 +597,54 @@ int bch2_fs_recovery(struct bch_fs *c)
        if (c->opts.norecovery)
                c->opts.recovery_pass_last = BCH_RECOVERY_PASS_journal_replay - 1;
 
-       if (!c->opts.nochanges) {
-               mutex_lock(&c->sb_lock);
-               struct bch_sb_field_ext *ext = bch2_sb_field_get(c->disk_sb.sb, ext);
-               bool write_sb = false;
-
-               if (BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb)) {
-                       ext->recovery_passes_required[0] |=
-                               cpu_to_le64(bch2_recovery_passes_to_stable(BIT_ULL(BCH_RECOVERY_PASS_check_topology)));
-                       write_sb = true;
-               }
+       mutex_lock(&c->sb_lock);
+       struct bch_sb_field_ext *ext = bch2_sb_field_get(c->disk_sb.sb, ext);
+       bool write_sb = false;
 
-               u64 sb_passes = bch2_recovery_passes_from_stable(le64_to_cpu(ext->recovery_passes_required[0]));
-               if (sb_passes) {
-                       struct printbuf buf = PRINTBUF;
-                       prt_str(&buf, "superblock requires following recovery passes to be run:\n  ");
-                       prt_bitflags(&buf, bch2_recovery_passes, sb_passes);
-                       bch_info(c, "%s", buf.buf);
-                       printbuf_exit(&buf);
-               }
+       if (BCH_SB_HAS_TOPOLOGY_ERRORS(c->disk_sb.sb)) {
+               ext->recovery_passes_required[0] |=
+                       cpu_to_le64(bch2_recovery_passes_to_stable(BIT_ULL(BCH_RECOVERY_PASS_check_topology)));
+               write_sb = true;
+       }
 
-               if (bch2_check_version_downgrade(c)) {
-                       struct printbuf buf = PRINTBUF;
+       u64 sb_passes = bch2_recovery_passes_from_stable(le64_to_cpu(ext->recovery_passes_required[0]));
+       if (sb_passes) {
+               struct printbuf buf = PRINTBUF;
+               prt_str(&buf, "superblock requires following recovery passes to be run:\n  ");
+               prt_bitflags(&buf, bch2_recovery_passes, sb_passes);
+               bch_info(c, "%s", buf.buf);
+               printbuf_exit(&buf);
+       }
 
-                       prt_str(&buf, "Version downgrade required:");
+       if (bch2_check_version_downgrade(c)) {
+               struct printbuf buf = PRINTBUF;
 
-                       __le64 passes = ext->recovery_passes_required[0];
-                       bch2_sb_set_downgrade(c,
-                                       BCH_VERSION_MINOR(bcachefs_metadata_version_current),
-                                       BCH_VERSION_MINOR(c->sb.version));
-                       passes = ext->recovery_passes_required[0] & ~passes;
-                       if (passes) {
-                               prt_str(&buf, "\n  running recovery passes: ");
-                               prt_bitflags(&buf, bch2_recovery_passes,
-                                            bch2_recovery_passes_from_stable(le64_to_cpu(passes)));
-                       }
+               prt_str(&buf, "Version downgrade required:");
 
-                       bch_info(c, "%s", buf.buf);
-                       printbuf_exit(&buf);
-                       write_sb = true;
+               __le64 passes = ext->recovery_passes_required[0];
+               bch2_sb_set_downgrade(c,
+                                     BCH_VERSION_MINOR(bcachefs_metadata_version_current),
+                                     BCH_VERSION_MINOR(c->sb.version));
+               passes = ext->recovery_passes_required[0] & ~passes;
+               if (passes) {
+                       prt_str(&buf, "\n  running recovery passes: ");
+                       prt_bitflags(&buf, bch2_recovery_passes,
+                                    bch2_recovery_passes_from_stable(le64_to_cpu(passes)));
                }
 
-               if (check_version_upgrade(c))
-                       write_sb = true;
+               bch_info(c, "%s", buf.buf);
+               printbuf_exit(&buf);
+               write_sb = true;
+       }
 
-               if (write_sb)
-                       bch2_write_super(c);
+       if (check_version_upgrade(c))
+               write_sb = true;
 
-               c->recovery_passes_explicit |= bch2_recovery_passes_from_stable(le64_to_cpu(ext->recovery_passes_required[0]));
-               mutex_unlock(&c->sb_lock);
-       }
+       if (write_sb)
+               bch2_write_super(c);
+
+       c->recovery_passes_explicit |= bch2_recovery_passes_from_stable(le64_to_cpu(ext->recovery_passes_required[0]));
+       mutex_unlock(&c->sb_lock);
 
        if (c->opts.fsck && IS_ENABLED(CONFIG_BCACHEFS_DEBUG))
                c->recovery_passes_explicit |= BIT_ULL(BCH_RECOVERY_PASS_check_topology);
@@ -832,8 +830,8 @@ use_clean:
        }
 
        mutex_lock(&c->sb_lock);
-       struct bch_sb_field_ext *ext = bch2_sb_field_get(c->disk_sb.sb, ext);
-       bool write_sb = false;
+       ext = bch2_sb_field_get(c->disk_sb.sb, ext);
+       write_sb = false;
 
        if (BCH_SB_VERSION_UPGRADE_COMPLETE(c->disk_sb.sb) != le16_to_cpu(c->disk_sb.sb->version)) {
                SET_BCH_SB_VERSION_UPGRADE_COMPLETE(c->disk_sb.sb, le16_to_cpu(c->disk_sb.sb->version));