summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/fs-common.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-07 03:11:07 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:00 -0400
commitd3ff7fec9c604e2cac3d0126f6764c5c0392a271 (patch)
tree652277adf8c1b6c6a1a9984d4ec9e9a3ca1d38ef /fs/bcachefs/fs-common.c
parent176cf4bf59014d03be6cef33cabb677d2117dbb2 (diff)
downloadlinux-d3ff7fec9c604e2cac3d0126f6764c5c0392a271.tar.gz
linux-d3ff7fec9c604e2cac3d0126f6764c5c0392a271.tar.bz2
linux-d3ff7fec9c604e2cac3d0126f6764c5c0392a271.zip
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> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/fs-common.c')
-rw-r--r--fs/bcachefs/fs-common.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/fs/bcachefs/fs-common.c b/fs/bcachefs/fs-common.c
index 281a6135e599..34d69c3f6680 100644
--- a/fs/bcachefs/fs-common.c
+++ b/fs/bcachefs/fs-common.c
@@ -110,8 +110,6 @@ int bch2_link_trans(struct btree_trans *trans, u64 dir_inum,
inode_u->bi_ctime = now;
bch2_inode_nlink_inc(inode_u);
- inode_u->bi_flags |= BCH_INODE_BACKPTR_UNTRUSTED;
-
dir_iter = bch2_inode_peek(trans, dir_u, dir_inum, 0);
ret = PTR_ERR_OR_ZERO(dir_iter);
if (ret)
@@ -175,6 +173,12 @@ int bch2_unlink_trans(struct btree_trans *trans,
if (ret)
goto err;
+ if (inode_u->bi_dir == k.k->p.inode &&
+ inode_u->bi_dir_offset == k.k->p.offset) {
+ inode_u->bi_dir = 0;
+ inode_u->bi_dir_offset = 0;
+ }
+
dir_u->bi_mtime = dir_u->bi_ctime = inode_u->bi_ctime = now;
dir_u->bi_nlink -= S_ISDIR(inode_u->bi_mode);
bch2_inode_nlink_dec(inode_u);