Skip to content

Commit 2eeccee

Browse files
author
Kent Overstreet
committed
bcachefs: Fix check_version_upgrade()
When also downgrading, check_version_upgrade() could pick a new version greater than the latest supported version. Fixes: Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
1 parent 4e07447 commit 2eeccee

File tree

1 file changed

+6
-5
lines changed

1 file changed

+6
-5
lines changed

fs/bcachefs/recovery.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -577,8 +577,9 @@ u64 bch2_recovery_passes_from_stable(u64 v)
577577

578578
static bool check_version_upgrade(struct bch_fs *c)
579579
{
580-
unsigned latest_compatible = bch2_latest_compatible_version(c->sb.version);
581580
unsigned latest_version = bcachefs_metadata_version_current;
581+
unsigned latest_compatible = min(latest_version,
582+
bch2_latest_compatible_version(c->sb.version));
582583
unsigned old_version = c->sb.version_upgrade_complete ?: c->sb.version;
583584
unsigned new_version = 0;
584585

@@ -597,7 +598,7 @@ static bool check_version_upgrade(struct bch_fs *c)
597598
new_version = latest_version;
598599
break;
599600
case BCH_VERSION_UPGRADE_none:
600-
new_version = old_version;
601+
new_version = min(old_version, latest_version);
601602
break;
602603
}
603604
}
@@ -774,7 +775,7 @@ int bch2_fs_recovery(struct bch_fs *c)
774775
goto err;
775776
}
776777

777-
if (!(c->opts.nochanges && c->opts.norecovery)) {
778+
if (!c->opts.nochanges) {
778779
mutex_lock(&c->sb_lock);
779780
bool write_sb = false;
780781

@@ -804,15 +805,15 @@ int bch2_fs_recovery(struct bch_fs *c)
804805
if (bch2_check_version_downgrade(c)) {
805806
struct printbuf buf = PRINTBUF;
806807

807-
prt_str(&buf, "Version downgrade required:\n");
808+
prt_str(&buf, "Version downgrade required:");
808809

809810
__le64 passes = ext->recovery_passes_required[0];
810811
bch2_sb_set_downgrade(c,
811812
BCH_VERSION_MINOR(bcachefs_metadata_version_current),
812813
BCH_VERSION_MINOR(c->sb.version));
813814
passes = ext->recovery_passes_required[0] & ~passes;
814815
if (passes) {
815-
prt_str(&buf, " running recovery passes: ");
816+
prt_str(&buf, "\n running recovery passes: ");
816817
prt_bitflags(&buf, bch2_recovery_passes,
817818
bch2_recovery_passes_from_stable(le64_to_cpu(passes)));
818819
}

0 commit comments

Comments
 (0)