summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-03-07 21:43:21 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2021-04-27 12:22:45 -0400
commitff14dabfbfbdc5be45ba53fea33d86a954e3211f (patch)
treea4f6fb1d5dc1c5f7c4f8c6f6aed95f037634cd72 /fs
parent644936a234db0cc44250c5ac835c8bac58cb2736 (diff)
bcachefs: Don't use inode btree key cache in fsck code
We had a cache coherency bug with the btree key cache in the fsck code - this fixes fsck to be consistent about not using it. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/fsck.c15
-rw-r--r--fs/bcachefs/inode.c19
-rw-r--r--fs/bcachefs/inode.h2
3 files changed, 26 insertions, 10 deletions
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index b2d9d55b1951..66c9dad2ef3e 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -58,7 +58,7 @@ static int __remove_dirent(struct btree_trans *trans,
buf[name.len] = '\0';
name.name = buf;
- ret = bch2_inode_find_by_inum_trans(trans, dir_inum, &dir_inode);
+ ret = __bch2_inode_find_by_inum_trans(trans, dir_inum, &dir_inode, 0);
if (ret && ret != -EINTR)
bch_err(c, "remove_dirent: err %i looking up directory inode", ret);
if (ret)
@@ -126,8 +126,8 @@ static int walk_inode(struct btree_trans *trans,
struct inode_walker *w, u64 inum)
{
if (inum != w->cur_inum) {
- int ret = bch2_inode_find_by_inum_trans(trans, inum,
- &w->inode);
+ int ret = __bch2_inode_find_by_inum_trans(trans, inum,
+ &w->inode, 0);
if (ret && ret != -ENOENT)
return ret;
@@ -673,7 +673,7 @@ retry:
continue;
}
- ret = bch2_inode_find_by_inum_trans(&trans, d_inum, &target);
+ ret = __bch2_inode_find_by_inum_trans(&trans, d_inum, &target, 0);
if (ret && ret != -ENOENT)
break;
@@ -787,7 +787,9 @@ static int check_root(struct bch_fs *c, struct bch_inode_unpacked *root_inode)
bch_verbose(c, "checking root directory");
- ret = bch2_inode_find_by_inum(c, BCACHEFS_ROOT_INO, root_inode);
+ ret = bch2_trans_do(c, NULL, NULL, 0,
+ __bch2_inode_find_by_inum_trans(&trans, BCACHEFS_ROOT_INO,
+ root_inode, 0));
if (ret && ret != -ENOENT)
return ret;
@@ -834,7 +836,8 @@ static int check_lostfound(struct bch_fs *c,
goto create_lostfound;
}
- ret = bch2_inode_find_by_inum(c, inum, lostfound_inode);
+ ret = bch2_trans_do(c, NULL, NULL, 0,
+ __bch2_inode_find_by_inum_trans(&trans, inum, lostfound_inode, 0));
if (ret && ret != -ENOENT)
return ret;
diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c
index 746173f15ae3..81feb47fe8f9 100644
--- a/fs/bcachefs/inode.c
+++ b/fs/bcachefs/inode.c
@@ -628,16 +628,19 @@ err:
return ret;
}
-int bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
- struct bch_inode_unpacked *inode)
+int __bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
+ struct bch_inode_unpacked *inode,
+ unsigned flags)
{
struct btree_iter *iter;
struct bkey_s_c k;
int ret;
iter = bch2_trans_get_iter(trans, BTREE_ID_INODES,
- POS(0, inode_nr), BTREE_ITER_CACHED);
- k = bch2_btree_iter_peek_cached(iter);
+ POS(0, inode_nr), flags);
+ k = (flags & BTREE_ITER_TYPE) == BTREE_ITER_CACHED
+ ? bch2_btree_iter_peek_cached(iter)
+ : bch2_btree_iter_peek_slot(iter);
ret = bkey_err(k);
if (ret)
goto err;
@@ -650,6 +653,14 @@ err:
return ret;
}
+int bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
+ struct bch_inode_unpacked *inode)
+{
+ return __bch2_inode_find_by_inum_trans(trans, inode_nr,
+ inode, BTREE_ITER_CACHED);
+
+}
+
int bch2_inode_find_by_inum(struct bch_fs *c, u64 inode_nr,
struct bch_inode_unpacked *inode)
{
diff --git a/fs/bcachefs/inode.h b/fs/bcachefs/inode.h
index dbdfcf63d079..1caf036ae928 100644
--- a/fs/bcachefs/inode.h
+++ b/fs/bcachefs/inode.h
@@ -73,6 +73,8 @@ int bch2_inode_create(struct btree_trans *, struct bch_inode_unpacked *);
int bch2_inode_rm(struct bch_fs *, u64, bool);
+int __bch2_inode_find_by_inum_trans(struct btree_trans *, u64,
+ struct bch_inode_unpacked *, unsigned);
int bch2_inode_find_by_inum_trans(struct btree_trans *, u64,
struct bch_inode_unpacked *);
int bch2_inode_find_by_inum(struct bch_fs *, u64, struct bch_inode_unpacked *);