mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 21:50:43 +00:00
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>
This commit is contained in:
parent
e7084c9c81
commit
16ac8c9523
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue
Block a user