summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-05-20 00:09:47 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-05-20 00:12:33 -0400
commit456b7fe8a12c06dd30b089692b0b87e8c21a50e5 (patch)
tree99162cbf7e110c73e482a7ba3e56065b7f86b126
parent83462182b7f1d3bf9205fed508ffee5235c43256 (diff)
bcachefs: Fix inode backpointers in RENAME_OVERWRITE
When we delete the dirent an inode points to, we need to zero out the backpointer fields - this was missed in the RENAME_OVERWRITE case. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r--fs/bcachefs/dirent.c5
-rw-r--r--fs/bcachefs/fs-common.c7
2 files changed, 11 insertions, 1 deletions
diff --git a/fs/bcachefs/dirent.c b/fs/bcachefs/dirent.c
index ec4666143f23..3bf6379cefe6 100644
--- a/fs/bcachefs/dirent.c
+++ b/fs/bcachefs/dirent.c
@@ -210,6 +210,8 @@ int bch2_dirent_rename(struct btree_trans *trans,
if (mode != BCH_RENAME)
*dst_inum = le64_to_cpu(bkey_s_c_to_dirent(old_dst).v->d_inum);
+ if (mode != BCH_RENAME_EXCHANGE)
+ *src_offset = dst_iter->pos.offset;
/* Lookup src: */
src_iter = bch2_hash_lookup(trans, bch2_dirent_hash_desc,
@@ -290,7 +292,8 @@ int bch2_dirent_rename(struct btree_trans *trans,
bch2_trans_update(trans, src_iter, &new_src->k_i, 0);
bch2_trans_update(trans, dst_iter, &new_dst->k_i, 0);
out_set_offset:
- *src_offset = new_src->k.p.offset;
+ if (mode == BCH_RENAME_EXCHANGE)
+ *src_offset = new_src->k.p.offset;
*dst_offset = new_dst->k.p.offset;
out:
bch2_trans_iter_put(trans, src_iter);
diff --git a/fs/bcachefs/fs-common.c b/fs/bcachefs/fs-common.c
index 34d69c3f6680..08c6af886df7 100644
--- a/fs/bcachefs/fs-common.c
+++ b/fs/bcachefs/fs-common.c
@@ -289,6 +289,13 @@ int bch2_rename_trans(struct btree_trans *trans,
dst_inode_u->bi_dir = src_dir_u->bi_inum;
dst_inode_u->bi_dir_offset = src_offset;
}
+
+ if (mode == BCH_RENAME_OVERWRITE &&
+ dst_inode_u->bi_dir == dst_dir_u->bi_inum &&
+ dst_inode_u->bi_dir_offset == src_offset) {
+ dst_inode_u->bi_dir = 0;
+ dst_inode_u->bi_dir_offset = 0;
+ }
}
if (mode == BCH_RENAME_OVERWRITE) {