+++ /dev/null
-From 04e67b8c3e2626cc05fe7948653fa993903f303e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 12 Feb 2024 20:05:48 -0500
-Subject: bcachefs: Fix check_version_upgrade()
-
-From: Kent Overstreet <kent.overstreet@linux.dev>
-
-[ Upstream commit 2eeccee86dc75a584a8c7e67a8b824d5168c978f ]
-
-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>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/bcachefs/recovery.c | 11 ++++++-----
- 1 file changed, 6 insertions(+), 5 deletions(-)
-
-diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
-index 5cf7d0532002..841b356ae853 100644
---- a/fs/bcachefs/recovery.c
-+++ b/fs/bcachefs/recovery.c
-@@ -542,8 +542,9 @@ u64 bch2_recovery_passes_from_stable(u64 v)
-
- static bool check_version_upgrade(struct bch_fs *c)
- {
-- unsigned latest_compatible = bch2_latest_compatible_version(c->sb.version);
- unsigned latest_version = bcachefs_metadata_version_current;
-+ unsigned latest_compatible = min(latest_version,
-+ bch2_latest_compatible_version(c->sb.version));
- unsigned old_version = c->sb.version_upgrade_complete ?: c->sb.version;
- unsigned new_version = 0;
-
-@@ -562,7 +563,7 @@ static bool check_version_upgrade(struct bch_fs *c)
- new_version = latest_version;
- break;
- case BCH_VERSION_UPGRADE_none:
-- new_version = old_version;
-+ new_version = min(old_version, latest_version);
- break;
- }
- }
-@@ -718,7 +719,7 @@ int bch2_fs_recovery(struct bch_fs *c)
- goto err;
- }
-
-- if (!(c->opts.nochanges && c->opts.norecovery)) {
-+ if (!c->opts.nochanges) {
- mutex_lock(&c->sb_lock);
- bool write_sb = false;
-
-@@ -748,7 +749,7 @@ int bch2_fs_recovery(struct bch_fs *c)
- if (bch2_check_version_downgrade(c)) {
- struct printbuf buf = PRINTBUF;
-
-- prt_str(&buf, "Version downgrade required:\n");
-+ prt_str(&buf, "Version downgrade required:");
-
- __le64 passes = ext->recovery_passes_required[0];
- bch2_sb_set_downgrade(c,
-@@ -756,7 +757,7 @@ int bch2_fs_recovery(struct bch_fs *c)
- BCH_VERSION_MINOR(c->sb.version));
- passes = ext->recovery_passes_required[0] & ~passes;
- if (passes) {
-- prt_str(&buf, " running recovery passes: ");
-+ prt_str(&buf, "\n running recovery passes: ");
- prt_bitflags(&buf, bch2_recovery_passes,
- bch2_recovery_passes_from_stable(le64_to_cpu(passes)));
- }
---
-2.43.0
-