Commit 16ac8c95 authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

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: default avatarKent Overstreet <kent.overstreet@gmail.com>
parent e7084c9c
...@@ -210,6 +210,8 @@ int bch2_dirent_rename(struct btree_trans *trans, ...@@ -210,6 +210,8 @@ int bch2_dirent_rename(struct btree_trans *trans,
if (mode != BCH_RENAME) if (mode != BCH_RENAME)
*dst_inum = le64_to_cpu(bkey_s_c_to_dirent(old_dst).v->d_inum); *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: */ /* Lookup src: */
src_iter = bch2_hash_lookup(trans, bch2_dirent_hash_desc, src_iter = bch2_hash_lookup(trans, bch2_dirent_hash_desc,
...@@ -290,7 +292,8 @@ int bch2_dirent_rename(struct btree_trans *trans, ...@@ -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, src_iter, &new_src->k_i, 0);
bch2_trans_update(trans, dst_iter, &new_dst->k_i, 0); bch2_trans_update(trans, dst_iter, &new_dst->k_i, 0);
out_set_offset: 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; *dst_offset = new_dst->k.p.offset;
out: out:
bch2_trans_iter_put(trans, src_iter); bch2_trans_iter_put(trans, src_iter);
......
...@@ -289,6 +289,13 @@ int bch2_rename_trans(struct btree_trans *trans, ...@@ -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 = src_dir_u->bi_inum;
dst_inode_u->bi_dir_offset = src_offset; 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) { if (mode == BCH_RENAME_OVERWRITE) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment