summaryrefslogtreecommitdiff
path: root/fs/bcachefs/inode.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-07 03:11:07 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-05-19 15:33:43 -0400
commit9f4d4cc59ff117bd026f1e68fc30f90275b0a14c (patch)
tree775716f69919156a4cc67f314f15563d29d396a5 /fs/bcachefs/inode.c
parent9f7874dcdd4e91bddc2bdb4d69c4169b36aff59c (diff)
bcachefs: Improved check_directory_structure()
Now that we have inode backpointers, we can simplify checking directory structure: instead of doing a DFS from the filesystem root and then checking if we found everything, we can iterate over every inode and see if we can go up until we get to the root. This patch also has a number of fixes and simplifications for the inode backpointer checks. Also, it turns out we don't actually need the BCH_INODE_BACKPTR_UNTRUSTED flag. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/inode.c')
-rw-r--r--fs/bcachefs/inode.c31
1 files changed, 5 insertions, 26 deletions
diff --git a/fs/bcachefs/inode.c b/fs/bcachefs/inode.c
index d4c328397156..dfde5ba3f1b7 100644
--- a/fs/bcachefs/inode.c
+++ b/fs/bcachefs/inode.c
@@ -307,7 +307,7 @@ struct btree_iter *bch2_inode_peek(struct btree_trans *trans,
if (ret)
goto err;
- ret = k.k->type == KEY_TYPE_inode ? 0 : -EIO;
+ ret = k.k->type == KEY_TYPE_inode ? 0 : -ENOENT;
if (ret)
goto err;
@@ -637,39 +637,18 @@ err:
return ret;
}
-int __bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
- struct bch_inode_unpacked *inode,
- unsigned flags)
+static int bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
+ struct bch_inode_unpacked *inode)
{
struct btree_iter *iter;
- struct bkey_s_c k;
int ret;
- iter = bch2_trans_get_iter(trans, BTREE_ID_inodes,
- 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;
-
- ret = k.k->type == KEY_TYPE_inode
- ? bch2_inode_unpack(bkey_s_c_to_inode(k), inode)
- : -ENOENT;
-err:
+ iter = bch2_inode_peek(trans, inode, inode_nr, 0);
+ ret = PTR_ERR_OR_ZERO(iter);
bch2_trans_iter_put(trans, iter);
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)
{