check_inode_nlinks(c, &lostfound_inode);
}
-int bch2_fsck_inode_nlink(struct bch_fs *c)
-{
- struct bch_inode_unpacked root_inode, lostfound_inode;
-
- return check_root(c, &root_inode) ?:
- check_lostfound(c, &root_inode, &lostfound_inode) ?:
- check_inode_nlinks(c, &lostfound_inode);
-}
-
int bch2_fsck_walk_inodes_only(struct bch_fs *c)
{
struct btree_trans trans;
}
+ 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;
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";
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)) {