summaryrefslogtreecommitdiff
path: root/fs/bcachefs/recovery.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/bcachefs/recovery.c')
-rw-r--r--fs/bcachefs/recovery.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index a3a6abb88d6f..24c0646913a8 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -1005,6 +1005,13 @@ int bch2_fs_recovery(struct bch_fs *c)
}
+ if (!c->sb.clean &&
+ !(c->sb.features & (1 << BCH_FEATURE_atomic_nlink))) {
+ bch_info(c, "BCH_FEATURE_atomic_nlink not set and filesystem dirty, fsck required");
+ c->opts.fsck = true;
+ c->opts.fix_errors = FSCK_OPT_YES;
+ }
+
if (!(c->sb.features & (1ULL << BCH_FEATURE_alloc_v2))) {
bch_info(c, "alloc_v2 feature bit not set, fsck required");
c->opts.fsck = true;
@@ -1181,25 +1188,6 @@ use_clean:
bch_verbose(c, "alloc write done");
}
- if (!c->sb.clean) {
- if (!(c->sb.features & (1 << BCH_FEATURE_atomic_nlink))) {
- bch_info(c, "checking inode link counts");
- err = "error in recovery";
- ret = bch2_fsck_inode_nlink(c);
- if (ret)
- goto err;
- bch_verbose(c, "check inodes done");
-
- } else {
- bch_verbose(c, "checking for deleted inodes");
- err = "error in recovery";
- ret = bch2_fsck_walk_inodes_only(c);
- if (ret)
- goto err;
- bch_verbose(c, "check inodes done");
- }
- }
-
if (c->opts.fsck) {
bch_info(c, "starting fsck");
err = "error in fsck";
@@ -1207,6 +1195,13 @@ use_clean:
if (ret)
goto err;
bch_verbose(c, "fsck done");
+ } else if (!c->sb.clean) {
+ bch_verbose(c, "checking for deleted inodes");
+ err = "error in recovery";
+ ret = bch2_fsck_walk_inodes_only(c);
+ if (ret)
+ goto err;
+ bch_verbose(c, "check inodes done");
}
if (enabled_qtypes(c)) {