bcachefs: Don't do upgrades in nochanges mode
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 27 Oct 2021 21:53:20 +0000 (17:53 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:15 +0000 (17:09 -0400)
nochanges mode is often used for getting data off of otherwise
nonrecoverable filesystems, which is often because of errors hit during
fsck.

Don't force version upgrade & fsck in nochanges mode, so that it's more
likely to mount.

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

index 6bf9c48a787169ab6822d2e8c52d6085b6a75120..da9c3ea528e76d00eaad3d6acb3eaa737193bcb9 100644 (file)
@@ -1081,15 +1081,17 @@ int bch2_fs_recovery(struct bch_fs *c)
                set_bit(BCH_FS_REBUILD_REPLICAS, &c->flags);
        }
 
-       if (c->sb.version < bcachefs_metadata_version_inode_backpointers) {
-               bch_info(c, "version prior to inode backpointers, upgrade and fsck required");
-               c->opts.version_upgrade = true;
-               c->opts.fsck            = true;
-               c->opts.fix_errors      = FSCK_OPT_YES;
-       } else if (c->sb.version < bcachefs_metadata_version_subvol_dirent) {
-               bch_info(c, "filesystem version is prior to subvol_dirent - upgrading");
-               c->opts.version_upgrade = true;
-               c->opts.fsck            = true;
+       if (!c->opts.nochanges) {
+               if (c->sb.version < bcachefs_metadata_version_inode_backpointers) {
+                       bch_info(c, "version prior to inode backpointers, upgrade and fsck required");
+                       c->opts.version_upgrade = true;
+                       c->opts.fsck            = true;
+                       c->opts.fix_errors      = FSCK_OPT_YES;
+               } else if (c->sb.version < bcachefs_metadata_version_subvol_dirent) {
+                       bch_info(c, "filesystem version is prior to subvol_dirent - upgrading");
+                       c->opts.version_upgrade = true;
+                       c->opts.fsck            = true;
+               }
        }
 
        ret = bch2_blacklist_table_initialize(c);