]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bcachefs: Kill dirent_occupied_size() in rename path
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 20 Feb 2025 17:58:21 +0000 (12:58 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 15 Mar 2025 01:02:15 +0000 (21:02 -0400)
Cc: Hongbo Li <lihongbo22@huawei.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/dirent.c
fs/bcachefs/dirent.h
fs/bcachefs/fs-common.c

index 600eee936f13653ed608de496793edb977df8629..17b767799cffa6282565def3736453162d87dc66 100644 (file)
@@ -275,8 +275,8 @@ int bch2_dirent_read_target(struct btree_trans *trans, subvol_inum dir,
 }
 
 int bch2_dirent_rename(struct btree_trans *trans,
-               subvol_inum src_dir, struct bch_hash_info *src_hash,
-               subvol_inum dst_dir, struct bch_hash_info *dst_hash,
+               subvol_inum src_dir, struct bch_hash_info *src_hash, u64 *src_dir_i_size,
+               subvol_inum dst_dir, struct bch_hash_info *dst_hash, u64 *dst_dir_i_size,
                const struct qstr *src_name, subvol_inum *src_inum, u64 *src_offset,
                const struct qstr *dst_name, subvol_inum *dst_inum, u64 *dst_offset,
                enum bch_rename_mode mode)
@@ -406,6 +406,14 @@ int bch2_dirent_rename(struct btree_trans *trans,
            new_src->v.d_type == DT_SUBVOL)
                new_src->v.d_parent_subvol = cpu_to_le32(src_dir.subvol);
 
+       if (old_dst.k)
+               *dst_dir_i_size -= bkey_bytes(old_dst.k);
+       *src_dir_i_size -= bkey_bytes(old_src.k);
+
+       if (mode == BCH_RENAME_EXCHANGE)
+               *src_dir_i_size += bkey_bytes(&new_src->k);
+       *dst_dir_i_size += bkey_bytes(&new_dst->k);
+
        ret = bch2_trans_update(trans, &dst_iter, &new_dst->k_i, 0);
        if (ret)
                goto out;
index 362b3b2f2f2e38f4b06e666960c51daf26c4551e..ec0ff2ea62751b880c1f722aa86fa660d87cff3e 100644 (file)
@@ -62,8 +62,8 @@ enum bch_rename_mode {
 };
 
 int bch2_dirent_rename(struct btree_trans *,
-                      subvol_inum, struct bch_hash_info *,
-                      subvol_inum, struct bch_hash_info *,
+                      subvol_inum, struct bch_hash_info *, u64 *,
+                      subvol_inum, struct bch_hash_info *, u64 *,
                       const struct qstr *, subvol_inum *, u64 *,
                       const struct qstr *, subvol_inum *, u64 *,
                       enum bch_rename_mode);
index 2c3d46ac70c61353ede8988443b8a55dc5386fb6..47e521e642295256b2e55135070e660b4096aa13 100644 (file)
@@ -417,8 +417,8 @@ int bch2_rename_trans(struct btree_trans *trans,
        }
 
        ret = bch2_dirent_rename(trans,
-                                src_dir, &src_hash,
-                                dst_dir, &dst_hash,
+                                src_dir, &src_hash, &src_dir_u->bi_size,
+                                dst_dir, &dst_hash, &dst_dir_u->bi_size,
                                 src_name, &src_inum, &src_offset,
                                 dst_name, &dst_inum, &dst_offset,
                                 mode);