summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-02-09 19:45:36 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2019-02-09 19:53:42 -0500
commit09a546543006b60d44c4c51e7b40cd3ec7837a5e (patch)
treeb568ccfccbccf4370b7d577d211139ea3e9ae0f0
parent1fb86353c7a15b20812a3bfe092044a281b702c9 (diff)
bcachefs: Don't need to walk inodes on clean shutdown
-rw-r--r--fs/bcachefs/fsck.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index 955ab8bec904..42bd2f7a271f 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -1186,6 +1186,11 @@ static int check_inode(struct bch_fs *c,
}
if (u.bi_flags & BCH_INODE_UNLINKED) {
+ fsck_err_on(c->sb.clean, c,
+ "filesystem marked clean, "
+ "but inode %llu unlinked",
+ u.bi_inum);
+
bch_verbose(c, "deleting inode %llu", u.bi_inum);
ret = bch2_inode_rm(c, u.bi_inum);
@@ -1388,16 +1393,13 @@ static int check_inodes_fast(struct bch_fs *c)
(BCH_INODE_I_SIZE_DIRTY|
BCH_INODE_I_SECTORS_DIRTY|
BCH_INODE_UNLINKED)) {
- fsck_err_on(c->sb.clean, c,
- "filesystem marked clean but found inode %llu with flags %x",
- inode.k->p.inode, inode.v->bi_flags);
ret = check_inode(c, NULL, &iter, inode, NULL);
BUG_ON(ret == -EINTR);
if (ret)
break;
}
}
-fsck_err:
+
return bch2_btree_iter_unlock(&iter) ?: ret;
}
@@ -1459,9 +1461,10 @@ int bch2_fsck(struct bch_fs *c)
if (c->opts.fsck)
return bch2_fsck_full(c);
- if (!c->sb.clean &&
- !(c->sb.features & (1 << BCH_FEATURE_ATOMIC_NLINK)))
- return bch2_fsck_inode_nlink(c);
+ if (c->sb.clean)
+ return 0;
- return bch2_fsck_walk_inodes_only(c);
+ return c->sb.features & (1 << BCH_FEATURE_ATOMIC_NLINK)
+ ? bch2_fsck_walk_inodes_only(c)
+ : bch2_fsck_inode_nlink(c);
}