diff mbox series

[04/19] btrfs: move ref_root into btrfs_ref

Message ID c744c3adf986c3f2907492c33e3cfb88fb4d3aef.1713052088.git.josef@toxicpanda.com (mailing list archive)
State New, archived
Headers show
Series btrfs: delayed refs cleanups | expand

Commit Message

Josef Bacik April 13, 2024, 11:53 p.m. UTC
We have this in both btrfs_tree_ref and btrfs_data_ref, which is just
wasting space and making the code more complicated.  Move this into
btrfs_ref proper and update all the call sites to do the assignment in
btrfs_ref.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/btrfs/delayed-ref.c | 29 +++++++++++++----------------
 fs/btrfs/delayed-ref.h | 22 +++++++++-------------
 fs/btrfs/extent-tree.c | 38 ++++++++++++++++----------------------
 fs/btrfs/file.c        | 30 ++++++++++++++----------------
 fs/btrfs/inode-item.c  |  6 +++---
 fs/btrfs/ref-verify.c  |  4 ++--
 fs/btrfs/relocation.c  | 26 +++++++++++++-------------
 fs/btrfs/tree-log.c    |  6 +++---
 8 files changed, 73 insertions(+), 88 deletions(-)

Comments

Filipe Manana April 15, 2024, 12:40 p.m. UTC | #1
On Sun, Apr 14, 2024 at 12:54 AM Josef Bacik <josef@toxicpanda.com> wrote:
>
> We have this in both btrfs_tree_ref and btrfs_data_ref, which is just
> wasting space and making the code more complicated.  Move this into
> btrfs_ref proper and update all the call sites to do the assignment in
> btrfs_ref.
>
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>

Reviewed-by: Filipe Manana <fdmanana@suse.com>

Looks good, thanks.

> ---
>  fs/btrfs/delayed-ref.c | 29 +++++++++++++----------------
>  fs/btrfs/delayed-ref.h | 22 +++++++++-------------
>  fs/btrfs/extent-tree.c | 38 ++++++++++++++++----------------------
>  fs/btrfs/file.c        | 30 ++++++++++++++----------------
>  fs/btrfs/inode-item.c  |  6 +++---
>  fs/btrfs/ref-verify.c  |  4 ++--
>  fs/btrfs/relocation.c  | 26 +++++++++++++-------------
>  fs/btrfs/tree-log.c    |  6 +++---
>  8 files changed, 73 insertions(+), 88 deletions(-)
>
> diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
> index 1d0795aeba12..c6a1b6938654 100644
> --- a/fs/btrfs/delayed-ref.c
> +++ b/fs/btrfs/delayed-ref.c
> @@ -1007,17 +1007,16 @@ static void init_delayed_ref_common(struct btrfs_fs_info *fs_info,
>         INIT_LIST_HEAD(&ref->add_list);
>  }
>
> -void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
> -                        u64 mod_root, bool skip_qgroup)
> +void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 mod_root,
> +                        bool skip_qgroup)
>  {
>  #ifdef CONFIG_BTRFS_FS_REF_VERIFY
>         /* If @real_root not set, use @root as fallback */
> -       generic_ref->real_root = mod_root ?: root;
> +       generic_ref->real_root = mod_root ?: generic_ref->ref_root;
>  #endif
>         generic_ref->tree_ref.level = level;
> -       generic_ref->tree_ref.ref_root = root;
>         generic_ref->type = BTRFS_REF_METADATA;
> -       if (skip_qgroup || !(is_fstree(root) &&
> +       if (skip_qgroup || !(is_fstree(generic_ref->ref_root) &&
>                              (!mod_root || is_fstree(mod_root))))
>                 generic_ref->skip_qgroup = true;
>         else
> @@ -1025,18 +1024,17 @@ void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
>
>  }
>
> -void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ref_root, u64 ino,
> -                        u64 offset, u64 mod_root, bool skip_qgroup)
> +void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ino, u64 offset,
> +                        u64 mod_root, bool skip_qgroup)
>  {
>  #ifdef CONFIG_BTRFS_FS_REF_VERIFY
>         /* If @real_root not set, use @root as fallback */
> -       generic_ref->real_root = mod_root ?: ref_root;
> +       generic_ref->real_root = mod_root ?: generic_ref->ref_root;
>  #endif
> -       generic_ref->data_ref.ref_root = ref_root;
>         generic_ref->data_ref.ino = ino;
>         generic_ref->data_ref.offset = offset;
>         generic_ref->type = BTRFS_REF_DATA;
> -       if (skip_qgroup || !(is_fstree(ref_root) &&
> +       if (skip_qgroup || !(is_fstree(generic_ref->ref_root) &&
>                              (!mod_root || is_fstree(mod_root))))
>                 generic_ref->skip_qgroup = true;
>         else
> @@ -1068,7 +1066,7 @@ int btrfs_add_delayed_tree_ref(struct btrfs_trans_handle *trans,
>         u64 parent = generic_ref->parent;
>         u8 ref_type;
>
> -       is_system = (generic_ref->tree_ref.ref_root == BTRFS_CHUNK_TREE_OBJECTID);
> +       is_system = (generic_ref->ref_root == BTRFS_CHUNK_TREE_OBJECTID);
>
>         ASSERT(generic_ref->type == BTRFS_REF_METADATA && generic_ref->action);
>         node = kmem_cache_alloc(btrfs_delayed_ref_node_cachep, GFP_NOFS);
> @@ -1098,14 +1096,13 @@ int btrfs_add_delayed_tree_ref(struct btrfs_trans_handle *trans,
>                 ref_type = BTRFS_TREE_BLOCK_REF_KEY;
>
>         init_delayed_ref_common(fs_info, node, bytenr, num_bytes,
> -                               generic_ref->tree_ref.ref_root, action,
> -                               ref_type);
> -       ref->root = generic_ref->tree_ref.ref_root;
> +                               generic_ref->ref_root, action, ref_type);
> +       ref->root = generic_ref->ref_root;
>         ref->parent = parent;
>         ref->level = level;
>
>         init_delayed_ref_head(head_ref, record, bytenr, num_bytes,
> -                             generic_ref->tree_ref.ref_root, 0, action,
> +                             generic_ref->ref_root, 0, action,
>                               false, is_system, generic_ref->owning_root);
>         head_ref->extent_op = extent_op;
>
> @@ -1159,7 +1156,7 @@ int btrfs_add_delayed_data_ref(struct btrfs_trans_handle *trans,
>         u64 bytenr = generic_ref->bytenr;
>         u64 num_bytes = generic_ref->len;
>         u64 parent = generic_ref->parent;
> -       u64 ref_root = generic_ref->data_ref.ref_root;
> +       u64 ref_root = generic_ref->ref_root;
>         u64 owner = generic_ref->data_ref.ino;
>         u64 offset = generic_ref->data_ref.offset;
>         u8 ref_type;
> diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h
> index b0b2d0e93996..bf2916906bb8 100644
> --- a/fs/btrfs/delayed-ref.h
> +++ b/fs/btrfs/delayed-ref.h
> @@ -220,9 +220,6 @@ enum btrfs_ref_type {
>  struct btrfs_data_ref {
>         /* For EXTENT_DATA_REF */
>
> -       /* Root which owns this data reference. */
> -       u64 ref_root;
> -
>         /* Inode which refers to this data extent */
>         u64 ino;
>
> @@ -243,13 +240,6 @@ struct btrfs_tree_ref {
>          */
>         int level;
>
> -       /*
> -        * Root which owns this tree block reference.
> -        *
> -        * For TREE_BLOCK_REF (skinny metadata, either inline or keyed)
> -        */
> -       u64 ref_root;
> -
>         /* For non-skinny metadata, no special member needed */
>  };
>
> @@ -273,6 +263,12 @@ struct btrfs_ref {
>         u64 len;
>         u64 owning_root;
>
> +       /*
> +        * The root that owns the reference for this reference, this will be set
> +        * or ->parent will be set, depending on what type of reference this is.
> +        */
> +       u64 ref_root;
> +
>         /* Bytenr of the parent tree block */
>         u64 parent;
>         union {
> @@ -320,10 +316,10 @@ static inline u64 btrfs_calc_delayed_ref_csum_bytes(const struct btrfs_fs_info *
>         return btrfs_calc_metadata_size(fs_info, num_csum_items);
>  }
>
> -void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
> +void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 mod_root,
> +                        bool skip_qgroup);
> +void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ino, u64 offset,
>                          u64 mod_root, bool skip_qgroup);
> -void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ref_root, u64 ino,
> -                        u64 offset, u64 mod_root, bool skip_qgroup);
>
>  static inline struct btrfs_delayed_extent_op *
>  btrfs_alloc_delayed_extent_op(void)
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 7d38f1c15a25..275e3141dc1e 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -1439,7 +1439,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
>         ASSERT(generic_ref->type != BTRFS_REF_NOT_SET &&
>                generic_ref->action);
>         BUG_ON(generic_ref->type == BTRFS_REF_METADATA &&
> -              generic_ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID);
> +              generic_ref->ref_root == BTRFS_TREE_LOG_OBJECTID);
>
>         if (generic_ref->type == BTRFS_REF_METADATA)
>                 ret = btrfs_add_delayed_tree_ref(trans, generic_ref, NULL);
> @@ -2526,6 +2526,7 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
>                 struct btrfs_ref ref = {
>                         .action = action,
>                         .parent = parent,
> +                       .ref_root = ref_root,
>                 };
>
>                 if (level == 0) {
> @@ -2545,9 +2546,8 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
>                         ref.owning_root = ref_root;
>
>                         key.offset -= btrfs_file_extent_offset(buf, fi);
> -                       btrfs_init_data_ref(&ref, ref_root, key.objectid,
> -                                           key.offset, root->root_key.objectid,
> -                                           for_reloc);
> +                       btrfs_init_data_ref(&ref, key.objectid, key.offset,
> +                                           root->root_key.objectid, for_reloc);
>                         if (inc)
>                                 ret = btrfs_inc_extent_ref(trans, &ref);
>                         else
> @@ -2559,7 +2559,7 @@ static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
>                         ref.bytenr = btrfs_node_blockptr(buf, i);
>                         ref.len = fs_info->nodesize;
>
> -                       btrfs_init_tree_ref(&ref, level - 1, ref_root,
> +                       btrfs_init_tree_ref(&ref, level - 1,
>                                             root->root_key.objectid, for_reloc);
>                         if (inc)
>                                 ret = btrfs_inc_extent_ref(trans, &ref);
> @@ -3469,6 +3469,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
>                         .len = buf->len,
>                         .parent = parent,
>                         .owning_root = btrfs_header_owner(buf),
> +                       .ref_root = root_id,
>                 };
>
>                 /*
> @@ -3479,8 +3480,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
>                  */
>                 ASSERT(btrfs_header_bytenr(buf) != 0);
>
> -               btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf),
> -                                   root_id, 0, false);
> +               btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf), 0, false);
>                 btrfs_ref_tree_mod(fs_info, &generic_ref);
>                 ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);
>                 BUG_ON(ret); /* -ENOMEM */
> @@ -3559,10 +3559,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref)
>          * tree log blocks never actually go into the extent allocation
>          * tree, just update pinning info and exit early.
>          */
> -       if ((ref->type == BTRFS_REF_METADATA &&
> -            ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID) ||
> -           (ref->type == BTRFS_REF_DATA &&
> -            ref->data_ref.ref_root == BTRFS_TREE_LOG_OBJECTID)) {
> +       if (ref->ref_root == BTRFS_TREE_LOG_OBJECTID) {
>                 btrfs_pin_extent(trans, ref->bytenr, ref->len, 1);
>                 ret = 0;
>         } else if (ref->type == BTRFS_REF_METADATA) {
> @@ -3571,10 +3568,7 @@ int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref)
>                 ret = btrfs_add_delayed_data_ref(trans, ref, 0);
>         }
>
> -       if (!((ref->type == BTRFS_REF_METADATA &&
> -              ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID) ||
> -             (ref->type == BTRFS_REF_DATA &&
> -              ref->data_ref.ref_root == BTRFS_TREE_LOG_OBJECTID)))
> +       if (ref->ref_root != BTRFS_TREE_LOG_OBJECTID)
>                 btrfs_ref_tree_mod(fs_info, ref);
>
>         return ret;
> @@ -4975,16 +4969,15 @@ int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
>                 .bytenr = ins->objectid,
>                 .len = ins->offset,
>                 .owning_root = root->root_key.objectid,
> +               .ref_root = root->root_key.objectid,
>         };
> -       u64 root_objectid = root->root_key.objectid;
>
> -       ASSERT(root_objectid != BTRFS_TREE_LOG_OBJECTID);
> +       ASSERT(generic_ref.ref_root != BTRFS_TREE_LOG_OBJECTID);
>
>         if (btrfs_is_data_reloc_root(root) && is_fstree(root->relocation_src_root))
>                 generic_ref.owning_root = root->relocation_src_root;
>
> -       btrfs_init_data_ref(&generic_ref, root_objectid, owner,
> -                           offset, 0, false);
> +       btrfs_init_data_ref(&generic_ref, owner, offset, 0, false);
>         btrfs_ref_tree_mod(root->fs_info, &generic_ref);
>
>         return btrfs_add_delayed_data_ref(trans, &generic_ref, ram_bytes);
> @@ -5219,6 +5212,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
>                         .len = ins.offset,
>                         .parent = parent,
>                         .owning_root = owning_root,
> +                       .ref_root = root_objectid,
>                 };
>                 extent_op = btrfs_alloc_delayed_extent_op();
>                 if (!extent_op) {
> @@ -5234,7 +5228,7 @@ struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
>                 extent_op->update_flags = true;
>                 extent_op->level = level;
>
> -               btrfs_init_tree_ref(&generic_ref, level, root_objectid,
> +               btrfs_init_tree_ref(&generic_ref, level,
>                                     root->root_key.objectid, false);
>                 btrfs_ref_tree_mod(fs_info, &generic_ref);
>                 ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, extent_op);
> @@ -5602,6 +5596,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
>                         .bytenr = bytenr,
>                         .len = fs_info->nodesize,
>                         .owning_root = owner_root,
> +                       .ref_root = root->root_key.objectid,
>                 };
>                 if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
>                         ref.parent = path->nodes[level]->start;
> @@ -5659,8 +5654,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
>                 wc->drop_level = level;
>                 find_next_key(path, level, &wc->drop_progress);
>
> -               btrfs_init_tree_ref(&ref, level - 1, root->root_key.objectid,
> -                                   0, false);
> +               btrfs_init_tree_ref(&ref, level - 1, 0, false);
>                 ret = btrfs_free_extent(trans, &ref);
>                 if (ret)
>                         goto out_unlock;
> diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
> index 013bcd336215..416fa1f48fe5 100644
> --- a/fs/btrfs/file.c
> +++ b/fs/btrfs/file.c
> @@ -378,12 +378,11 @@ int btrfs_drop_extents(struct btrfs_trans_handle *trans,
>                                         .len = num_bytes,
>                                         .parent = 0,
>                                         .owning_root = root->root_key.objectid,
> +                                       .ref_root = root->root_key.objectid,
>                                 };
> -                               btrfs_init_data_ref(&ref,
> -                                               root->root_key.objectid,
> -                                               new_key.objectid,
> -                                               args->start - extent_offset,
> -                                               0, false);
> +                               btrfs_init_data_ref(&ref, new_key.objectid,
> +                                                   args->start - extent_offset,
> +                                                   0, false);
>                                 ret = btrfs_inc_extent_ref(trans, &ref);
>                                 if (ret) {
>                                         btrfs_abort_transaction(trans, ret);
> @@ -472,12 +471,11 @@ int btrfs_drop_extents(struct btrfs_trans_handle *trans,
>                                         .len = num_bytes,
>                                         .parent = 0,
>                                         .owning_root = root->root_key.objectid,
> +                                       .ref_root = root->root_key.objectid,
>                                 };
> -                               btrfs_init_data_ref(&ref,
> -                                               root->root_key.objectid,
> -                                               key.objectid,
> -                                               key.offset - extent_offset, 0,
> -                                               false);
> +                               btrfs_init_data_ref(&ref, key.objectid,
> +                                                   key.offset - extent_offset,
> +                                                   0, false);
>                                 ret = btrfs_free_extent(trans, &ref);
>                                 if (ret) {
>                                         btrfs_abort_transaction(trans, ret);
> @@ -758,8 +756,8 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
>                 ref.len = num_bytes;
>                 ref.parent = 0;
>                 ref.owning_root = root->root_key.objectid;
> -               btrfs_init_data_ref(&ref, root->root_key.objectid, ino,
> -                                   orig_offset, 0, false);
> +               ref.ref_root = root->root_key.objectid;
> +               btrfs_init_data_ref(&ref, ino, orig_offset, 0, false);
>                 ret = btrfs_inc_extent_ref(trans, &ref);
>                 if (ret) {
>                         btrfs_abort_transaction(trans, ret);
> @@ -788,8 +786,8 @@ int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
>         ref.len = num_bytes;
>         ref.parent = 0;
>         ref.owning_root = root->root_key.objectid;
> -       btrfs_init_data_ref(&ref, root->root_key.objectid, ino, orig_offset,
> -                           0, false);
> +       ref.ref_root = root->root_key.objectid;
> +       btrfs_init_data_ref(&ref, ino, orig_offset, 0, false);
>         if (extent_mergeable(leaf, path->slots[0] + 1,
>                              ino, bytenr, orig_offset,
>                              &other_start, &other_end)) {
> @@ -2330,12 +2328,12 @@ static int btrfs_insert_replace_extent(struct btrfs_trans_handle *trans,
>                         .bytenr = extent_info->disk_offset,
>                         .len = extent_info->disk_len,
>                         .owning_root = root->root_key.objectid,
> +                       .ref_root = root->root_key.objectid,
>                 };
>                 u64 ref_offset;
>
>                 ref_offset = extent_info->file_offset - extent_info->data_offset;
> -               btrfs_init_data_ref(&ref, root->root_key.objectid,
> -                                   btrfs_ino(inode), ref_offset, 0, false);
> +               btrfs_init_data_ref(&ref, btrfs_ino(inode), ref_offset, 0, false);
>                 ret = btrfs_inc_extent_ref(trans, &ref);
>         }
>
> diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c
> index d61bb65859a5..e24605df35bb 100644
> --- a/fs/btrfs/inode-item.c
> +++ b/fs/btrfs/inode-item.c
> @@ -675,13 +675,13 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
>                                 .bytenr = extent_start,
>                                 .len = extent_num_bytes,
>                                 .owning_root = root->root_key.objectid,
> +                               .ref_root = btrfs_header_owner(leaf),
>                         };
>
>                         bytes_deleted += extent_num_bytes;
>
> -                       btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
> -                                       control->ino, extent_offset,
> -                                       root->root_key.objectid, false);
> +                       btrfs_init_data_ref(&ref, control->ino, extent_offset,
> +                                           root->root_key.objectid, false);
>                         ret = btrfs_free_extent(trans, &ref);
>                         if (ret) {
>                                 btrfs_abort_transaction(trans, ret);
> diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c
> index 8c4fc98ca9ce..1108be7a050c 100644
> --- a/fs/btrfs/ref-verify.c
> +++ b/fs/btrfs/ref-verify.c
> @@ -684,10 +684,10 @@ int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
>
>         if (generic_ref->type == BTRFS_REF_METADATA) {
>                 if (!parent)
> -                       ref_root = generic_ref->tree_ref.ref_root;
> +                       ref_root = generic_ref->ref_root;
>                 owner = generic_ref->tree_ref.level;
>         } else if (!parent) {
> -               ref_root = generic_ref->data_ref.ref_root;
> +               ref_root = generic_ref->ref_root;
>                 owner = generic_ref->data_ref.ino;
>                 offset = generic_ref->data_ref.offset;
>         }
> diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
> index 9a739e33a5fe..9e460b79f8b2 100644
> --- a/fs/btrfs/relocation.c
> +++ b/fs/btrfs/relocation.c
> @@ -1165,8 +1165,8 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
>                 ref.len = num_bytes;
>                 ref.parent = parent;
>                 ref.owning_root = root->root_key.objectid;
> -               btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
> -                                   key.objectid, key.offset,
> +               ref.ref_root = btrfs_header_owner(leaf);
> +               btrfs_init_data_ref(&ref, key.objectid, key.offset,
>                                     root->root_key.objectid, false);
>                 ret = btrfs_inc_extent_ref(trans, &ref);
>                 if (ret) {
> @@ -1179,8 +1179,8 @@ int replace_file_extents(struct btrfs_trans_handle *trans,
>                 ref.len = num_bytes;
>                 ref.parent = parent;
>                 ref.owning_root = root->root_key.objectid;
> -               btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
> -                                   key.objectid, key.offset,
> +               ref.ref_root = btrfs_header_owner(leaf);
> +               btrfs_init_data_ref(&ref, key.objectid, key.offset,
>                                     root->root_key.objectid, false);
>                 ret = btrfs_free_extent(trans, &ref);
>                 if (ret) {
> @@ -1395,8 +1395,8 @@ int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
>                 ref.len = blocksize;
>                 ref.parent = path->nodes[level]->start;
>                 ref.owning_root = src->root_key.objectid;
> -               btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
> -                                   0, true);
> +               ref.ref_root = src->root_key.objectid;
> +               btrfs_init_tree_ref(&ref, level - 1, 0, true);
>                 ret = btrfs_inc_extent_ref(trans, &ref);
>                 if (ret) {
>                         btrfs_abort_transaction(trans, ret);
> @@ -1408,8 +1408,8 @@ int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
>                 ref.len = blocksize;
>                 ref.parent = 0;
>                 ref.owning_root = dest->root_key.objectid;
> -               btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid, 0,
> -                                   true);
> +               ref.ref_root = dest->root_key.objectid;
> +               btrfs_init_tree_ref(&ref, level - 1, 0, true);
>                 ret = btrfs_inc_extent_ref(trans, &ref);
>                 if (ret) {
>                         btrfs_abort_transaction(trans, ret);
> @@ -1422,8 +1422,8 @@ int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
>                 ref.len = blocksize;
>                 ref.parent = path->nodes[level]->start;
>                 ref.owning_root = 0;
> -               btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
> -                                   0, true);
> +               ref.ref_root = src->root_key.objectid;
> +               btrfs_init_tree_ref(&ref, level - 1, 0, true);
>                 ret = btrfs_free_extent(trans, &ref);
>                 if (ret) {
>                         btrfs_abort_transaction(trans, ret);
> @@ -1436,8 +1436,8 @@ int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
>                 ref.len = blocksize;
>                 ref.parent = 0;
>                 ref.owning_root = 0;
> -               btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid,
> -                                   0, true);
> +               ref.ref_root = dest->root_key.objectid;
> +               btrfs_init_tree_ref(&ref, level - 1, 0, true);
>                 ret = btrfs_free_extent(trans, &ref);
>                 if (ret) {
>                         btrfs_abort_transaction(trans, ret);
> @@ -2540,6 +2540,7 @@ static int do_relocation(struct btrfs_trans_handle *trans,
>                                 .len = blocksize,
>                                 .parent = upper->eb->start,
>                                 .owning_root = btrfs_header_owner(upper->eb),
> +                               .ref_root = btrfs_header_owner(upper->eb),
>                         };
>
>                         btrfs_set_node_blockptr(upper->eb, slot,
> @@ -2549,7 +2550,6 @@ static int do_relocation(struct btrfs_trans_handle *trans,
>                         btrfs_mark_buffer_dirty(trans, upper->eb);
>
>                         btrfs_init_tree_ref(&ref, node->level,
> -                                           btrfs_header_owner(upper->eb),
>                                             root->root_key.objectid, false);
>                         ret = btrfs_inc_extent_ref(trans, &ref);
>                         if (!ret)
> diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
> index 27084c7519f9..da319ffda4ee 100644
> --- a/fs/btrfs/tree-log.c
> +++ b/fs/btrfs/tree-log.c
> @@ -766,10 +766,10 @@ static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
>                                         .bytenr = ins.objectid,
>                                         .len = ins.offset,
>                                         .owning_root = root->root_key.objectid,
> +                                       .ref_root = root->root_key.objectid,
>                                 };
> -                               btrfs_init_data_ref(&ref,
> -                                               root->root_key.objectid,
> -                                               key->objectid, offset, 0, false);
> +                               btrfs_init_data_ref(&ref, key->objectid, offset,
> +                                                   0, false);
>                                 ret = btrfs_inc_extent_ref(trans, &ref);
>                                 if (ret)
>                                         goto out;
> --
> 2.43.0
>
>
diff mbox series

Patch

diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
index 1d0795aeba12..c6a1b6938654 100644
--- a/fs/btrfs/delayed-ref.c
+++ b/fs/btrfs/delayed-ref.c
@@ -1007,17 +1007,16 @@  static void init_delayed_ref_common(struct btrfs_fs_info *fs_info,
 	INIT_LIST_HEAD(&ref->add_list);
 }
 
-void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
-			 u64 mod_root, bool skip_qgroup)
+void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 mod_root,
+			 bool skip_qgroup)
 {
 #ifdef CONFIG_BTRFS_FS_REF_VERIFY
 	/* If @real_root not set, use @root as fallback */
-	generic_ref->real_root = mod_root ?: root;
+	generic_ref->real_root = mod_root ?: generic_ref->ref_root;
 #endif
 	generic_ref->tree_ref.level = level;
-	generic_ref->tree_ref.ref_root = root;
 	generic_ref->type = BTRFS_REF_METADATA;
-	if (skip_qgroup || !(is_fstree(root) &&
+	if (skip_qgroup || !(is_fstree(generic_ref->ref_root) &&
 			     (!mod_root || is_fstree(mod_root))))
 		generic_ref->skip_qgroup = true;
 	else
@@ -1025,18 +1024,17 @@  void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
 
 }
 
-void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ref_root, u64 ino,
-			 u64 offset, u64 mod_root, bool skip_qgroup)
+void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ino, u64 offset,
+			 u64 mod_root, bool skip_qgroup)
 {
 #ifdef CONFIG_BTRFS_FS_REF_VERIFY
 	/* If @real_root not set, use @root as fallback */
-	generic_ref->real_root = mod_root ?: ref_root;
+	generic_ref->real_root = mod_root ?: generic_ref->ref_root;
 #endif
-	generic_ref->data_ref.ref_root = ref_root;
 	generic_ref->data_ref.ino = ino;
 	generic_ref->data_ref.offset = offset;
 	generic_ref->type = BTRFS_REF_DATA;
-	if (skip_qgroup || !(is_fstree(ref_root) &&
+	if (skip_qgroup || !(is_fstree(generic_ref->ref_root) &&
 			     (!mod_root || is_fstree(mod_root))))
 		generic_ref->skip_qgroup = true;
 	else
@@ -1068,7 +1066,7 @@  int btrfs_add_delayed_tree_ref(struct btrfs_trans_handle *trans,
 	u64 parent = generic_ref->parent;
 	u8 ref_type;
 
-	is_system = (generic_ref->tree_ref.ref_root == BTRFS_CHUNK_TREE_OBJECTID);
+	is_system = (generic_ref->ref_root == BTRFS_CHUNK_TREE_OBJECTID);
 
 	ASSERT(generic_ref->type == BTRFS_REF_METADATA && generic_ref->action);
 	node = kmem_cache_alloc(btrfs_delayed_ref_node_cachep, GFP_NOFS);
@@ -1098,14 +1096,13 @@  int btrfs_add_delayed_tree_ref(struct btrfs_trans_handle *trans,
 		ref_type = BTRFS_TREE_BLOCK_REF_KEY;
 
 	init_delayed_ref_common(fs_info, node, bytenr, num_bytes,
-				generic_ref->tree_ref.ref_root, action,
-				ref_type);
-	ref->root = generic_ref->tree_ref.ref_root;
+				generic_ref->ref_root, action, ref_type);
+	ref->root = generic_ref->ref_root;
 	ref->parent = parent;
 	ref->level = level;
 
 	init_delayed_ref_head(head_ref, record, bytenr, num_bytes,
-			      generic_ref->tree_ref.ref_root, 0, action,
+			      generic_ref->ref_root, 0, action,
 			      false, is_system, generic_ref->owning_root);
 	head_ref->extent_op = extent_op;
 
@@ -1159,7 +1156,7 @@  int btrfs_add_delayed_data_ref(struct btrfs_trans_handle *trans,
 	u64 bytenr = generic_ref->bytenr;
 	u64 num_bytes = generic_ref->len;
 	u64 parent = generic_ref->parent;
-	u64 ref_root = generic_ref->data_ref.ref_root;
+	u64 ref_root = generic_ref->ref_root;
 	u64 owner = generic_ref->data_ref.ino;
 	u64 offset = generic_ref->data_ref.offset;
 	u8 ref_type;
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h
index b0b2d0e93996..bf2916906bb8 100644
--- a/fs/btrfs/delayed-ref.h
+++ b/fs/btrfs/delayed-ref.h
@@ -220,9 +220,6 @@  enum btrfs_ref_type {
 struct btrfs_data_ref {
 	/* For EXTENT_DATA_REF */
 
-	/* Root which owns this data reference. */
-	u64 ref_root;
-
 	/* Inode which refers to this data extent */
 	u64 ino;
 
@@ -243,13 +240,6 @@  struct btrfs_tree_ref {
 	 */
 	int level;
 
-	/*
-	 * Root which owns this tree block reference.
-	 *
-	 * For TREE_BLOCK_REF (skinny metadata, either inline or keyed)
-	 */
-	u64 ref_root;
-
 	/* For non-skinny metadata, no special member needed */
 };
 
@@ -273,6 +263,12 @@  struct btrfs_ref {
 	u64 len;
 	u64 owning_root;
 
+	/*
+	 * The root that owns the reference for this reference, this will be set
+	 * or ->parent will be set, depending on what type of reference this is.
+	 */
+	u64 ref_root;
+
 	/* Bytenr of the parent tree block */
 	u64 parent;
 	union {
@@ -320,10 +316,10 @@  static inline u64 btrfs_calc_delayed_ref_csum_bytes(const struct btrfs_fs_info *
 	return btrfs_calc_metadata_size(fs_info, num_csum_items);
 }
 
-void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 root,
+void btrfs_init_tree_ref(struct btrfs_ref *generic_ref, int level, u64 mod_root,
+			 bool skip_qgroup);
+void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ino, u64 offset,
 			 u64 mod_root, bool skip_qgroup);
-void btrfs_init_data_ref(struct btrfs_ref *generic_ref, u64 ref_root, u64 ino,
-			 u64 offset, u64 mod_root, bool skip_qgroup);
 
 static inline struct btrfs_delayed_extent_op *
 btrfs_alloc_delayed_extent_op(void)
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 7d38f1c15a25..275e3141dc1e 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -1439,7 +1439,7 @@  int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
 	ASSERT(generic_ref->type != BTRFS_REF_NOT_SET &&
 	       generic_ref->action);
 	BUG_ON(generic_ref->type == BTRFS_REF_METADATA &&
-	       generic_ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID);
+	       generic_ref->ref_root == BTRFS_TREE_LOG_OBJECTID);
 
 	if (generic_ref->type == BTRFS_REF_METADATA)
 		ret = btrfs_add_delayed_tree_ref(trans, generic_ref, NULL);
@@ -2526,6 +2526,7 @@  static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
 		struct btrfs_ref ref = {
 			.action = action,
 			.parent = parent,
+			.ref_root = ref_root,
 		};
 
 		if (level == 0) {
@@ -2545,9 +2546,8 @@  static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
 			ref.owning_root = ref_root;
 
 			key.offset -= btrfs_file_extent_offset(buf, fi);
-			btrfs_init_data_ref(&ref, ref_root, key.objectid,
-					    key.offset, root->root_key.objectid,
-					    for_reloc);
+			btrfs_init_data_ref(&ref, key.objectid, key.offset,
+					    root->root_key.objectid, for_reloc);
 			if (inc)
 				ret = btrfs_inc_extent_ref(trans, &ref);
 			else
@@ -2559,7 +2559,7 @@  static int __btrfs_mod_ref(struct btrfs_trans_handle *trans,
 			ref.bytenr = btrfs_node_blockptr(buf, i);
 			ref.len = fs_info->nodesize;
 
-			btrfs_init_tree_ref(&ref, level - 1, ref_root,
+			btrfs_init_tree_ref(&ref, level - 1,
 					    root->root_key.objectid, for_reloc);
 			if (inc)
 				ret = btrfs_inc_extent_ref(trans, &ref);
@@ -3469,6 +3469,7 @@  void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
 			.len = buf->len,
 			.parent = parent,
 			.owning_root = btrfs_header_owner(buf),
+			.ref_root = root_id,
 		};
 
 		/*
@@ -3479,8 +3480,7 @@  void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
 		 */
 		ASSERT(btrfs_header_bytenr(buf) != 0);
 
-		btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf),
-				    root_id, 0, false);
+		btrfs_init_tree_ref(&generic_ref, btrfs_header_level(buf), 0, false);
 		btrfs_ref_tree_mod(fs_info, &generic_ref);
 		ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, NULL);
 		BUG_ON(ret); /* -ENOMEM */
@@ -3559,10 +3559,7 @@  int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref)
 	 * tree log blocks never actually go into the extent allocation
 	 * tree, just update pinning info and exit early.
 	 */
-	if ((ref->type == BTRFS_REF_METADATA &&
-	     ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID) ||
-	    (ref->type == BTRFS_REF_DATA &&
-	     ref->data_ref.ref_root == BTRFS_TREE_LOG_OBJECTID)) {
+	if (ref->ref_root == BTRFS_TREE_LOG_OBJECTID) {
 		btrfs_pin_extent(trans, ref->bytenr, ref->len, 1);
 		ret = 0;
 	} else if (ref->type == BTRFS_REF_METADATA) {
@@ -3571,10 +3568,7 @@  int btrfs_free_extent(struct btrfs_trans_handle *trans, struct btrfs_ref *ref)
 		ret = btrfs_add_delayed_data_ref(trans, ref, 0);
 	}
 
-	if (!((ref->type == BTRFS_REF_METADATA &&
-	       ref->tree_ref.ref_root == BTRFS_TREE_LOG_OBJECTID) ||
-	      (ref->type == BTRFS_REF_DATA &&
-	       ref->data_ref.ref_root == BTRFS_TREE_LOG_OBJECTID)))
+	if (ref->ref_root != BTRFS_TREE_LOG_OBJECTID)
 		btrfs_ref_tree_mod(fs_info, ref);
 
 	return ret;
@@ -4975,16 +4969,15 @@  int btrfs_alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
 		.bytenr = ins->objectid,
 		.len = ins->offset,
 		.owning_root = root->root_key.objectid,
+		.ref_root = root->root_key.objectid,
 	};
-	u64 root_objectid = root->root_key.objectid;
 
-	ASSERT(root_objectid != BTRFS_TREE_LOG_OBJECTID);
+	ASSERT(generic_ref.ref_root != BTRFS_TREE_LOG_OBJECTID);
 
 	if (btrfs_is_data_reloc_root(root) && is_fstree(root->relocation_src_root))
 		generic_ref.owning_root = root->relocation_src_root;
 
-	btrfs_init_data_ref(&generic_ref, root_objectid, owner,
-			    offset, 0, false);
+	btrfs_init_data_ref(&generic_ref, owner, offset, 0, false);
 	btrfs_ref_tree_mod(root->fs_info, &generic_ref);
 
 	return btrfs_add_delayed_data_ref(trans, &generic_ref, ram_bytes);
@@ -5219,6 +5212,7 @@  struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
 			.len = ins.offset,
 			.parent = parent,
 			.owning_root = owning_root,
+			.ref_root = root_objectid,
 		};
 		extent_op = btrfs_alloc_delayed_extent_op();
 		if (!extent_op) {
@@ -5234,7 +5228,7 @@  struct extent_buffer *btrfs_alloc_tree_block(struct btrfs_trans_handle *trans,
 		extent_op->update_flags = true;
 		extent_op->level = level;
 
-		btrfs_init_tree_ref(&generic_ref, level, root_objectid,
+		btrfs_init_tree_ref(&generic_ref, level,
 				    root->root_key.objectid, false);
 		btrfs_ref_tree_mod(fs_info, &generic_ref);
 		ret = btrfs_add_delayed_tree_ref(trans, &generic_ref, extent_op);
@@ -5602,6 +5596,7 @@  static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 			.bytenr = bytenr,
 			.len = fs_info->nodesize,
 			.owning_root = owner_root,
+			.ref_root = root->root_key.objectid,
 		};
 		if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
 			ref.parent = path->nodes[level]->start;
@@ -5659,8 +5654,7 @@  static noinline int do_walk_down(struct btrfs_trans_handle *trans,
 		wc->drop_level = level;
 		find_next_key(path, level, &wc->drop_progress);
 
-		btrfs_init_tree_ref(&ref, level - 1, root->root_key.objectid,
-				    0, false);
+		btrfs_init_tree_ref(&ref, level - 1, 0, false);
 		ret = btrfs_free_extent(trans, &ref);
 		if (ret)
 			goto out_unlock;
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index 013bcd336215..416fa1f48fe5 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -378,12 +378,11 @@  int btrfs_drop_extents(struct btrfs_trans_handle *trans,
 					.len = num_bytes,
 					.parent = 0,
 					.owning_root = root->root_key.objectid,
+					.ref_root = root->root_key.objectid,
 				};
-				btrfs_init_data_ref(&ref,
-						root->root_key.objectid,
-						new_key.objectid,
-						args->start - extent_offset,
-						0, false);
+				btrfs_init_data_ref(&ref, new_key.objectid,
+						    args->start - extent_offset,
+						    0, false);
 				ret = btrfs_inc_extent_ref(trans, &ref);
 				if (ret) {
 					btrfs_abort_transaction(trans, ret);
@@ -472,12 +471,11 @@  int btrfs_drop_extents(struct btrfs_trans_handle *trans,
 					.len = num_bytes,
 					.parent = 0,
 					.owning_root = root->root_key.objectid,
+					.ref_root = root->root_key.objectid,
 				};
-				btrfs_init_data_ref(&ref,
-						root->root_key.objectid,
-						key.objectid,
-						key.offset - extent_offset, 0,
-						false);
+				btrfs_init_data_ref(&ref, key.objectid,
+						    key.offset - extent_offset,
+						    0, false);
 				ret = btrfs_free_extent(trans, &ref);
 				if (ret) {
 					btrfs_abort_transaction(trans, ret);
@@ -758,8 +756,8 @@  int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
 		ref.len = num_bytes;
 		ref.parent = 0;
 		ref.owning_root = root->root_key.objectid;
-		btrfs_init_data_ref(&ref, root->root_key.objectid, ino,
-				    orig_offset, 0, false);
+		ref.ref_root = root->root_key.objectid;
+		btrfs_init_data_ref(&ref, ino, orig_offset, 0, false);
 		ret = btrfs_inc_extent_ref(trans, &ref);
 		if (ret) {
 			btrfs_abort_transaction(trans, ret);
@@ -788,8 +786,8 @@  int btrfs_mark_extent_written(struct btrfs_trans_handle *trans,
 	ref.len = num_bytes;
 	ref.parent = 0;
 	ref.owning_root = root->root_key.objectid;
-	btrfs_init_data_ref(&ref, root->root_key.objectid, ino, orig_offset,
-			    0, false);
+	ref.ref_root = root->root_key.objectid;
+	btrfs_init_data_ref(&ref, ino, orig_offset, 0, false);
 	if (extent_mergeable(leaf, path->slots[0] + 1,
 			     ino, bytenr, orig_offset,
 			     &other_start, &other_end)) {
@@ -2330,12 +2328,12 @@  static int btrfs_insert_replace_extent(struct btrfs_trans_handle *trans,
 			.bytenr = extent_info->disk_offset,
 			.len = extent_info->disk_len,
 			.owning_root = root->root_key.objectid,
+			.ref_root = root->root_key.objectid,
 		};
 		u64 ref_offset;
 
 		ref_offset = extent_info->file_offset - extent_info->data_offset;
-		btrfs_init_data_ref(&ref, root->root_key.objectid,
-				    btrfs_ino(inode), ref_offset, 0, false);
+		btrfs_init_data_ref(&ref, btrfs_ino(inode), ref_offset, 0, false);
 		ret = btrfs_inc_extent_ref(trans, &ref);
 	}
 
diff --git a/fs/btrfs/inode-item.c b/fs/btrfs/inode-item.c
index d61bb65859a5..e24605df35bb 100644
--- a/fs/btrfs/inode-item.c
+++ b/fs/btrfs/inode-item.c
@@ -675,13 +675,13 @@  int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans,
 				.bytenr = extent_start,
 				.len = extent_num_bytes,
 				.owning_root = root->root_key.objectid,
+				.ref_root = btrfs_header_owner(leaf),
 			};
 
 			bytes_deleted += extent_num_bytes;
 
-			btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
-					control->ino, extent_offset,
-					root->root_key.objectid, false);
+			btrfs_init_data_ref(&ref, control->ino, extent_offset,
+					    root->root_key.objectid, false);
 			ret = btrfs_free_extent(trans, &ref);
 			if (ret) {
 				btrfs_abort_transaction(trans, ret);
diff --git a/fs/btrfs/ref-verify.c b/fs/btrfs/ref-verify.c
index 8c4fc98ca9ce..1108be7a050c 100644
--- a/fs/btrfs/ref-verify.c
+++ b/fs/btrfs/ref-verify.c
@@ -684,10 +684,10 @@  int btrfs_ref_tree_mod(struct btrfs_fs_info *fs_info,
 
 	if (generic_ref->type == BTRFS_REF_METADATA) {
 		if (!parent)
-			ref_root = generic_ref->tree_ref.ref_root;
+			ref_root = generic_ref->ref_root;
 		owner = generic_ref->tree_ref.level;
 	} else if (!parent) {
-		ref_root = generic_ref->data_ref.ref_root;
+		ref_root = generic_ref->ref_root;
 		owner = generic_ref->data_ref.ino;
 		offset = generic_ref->data_ref.offset;
 	}
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index 9a739e33a5fe..9e460b79f8b2 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -1165,8 +1165,8 @@  int replace_file_extents(struct btrfs_trans_handle *trans,
 		ref.len = num_bytes;
 		ref.parent = parent;
 		ref.owning_root = root->root_key.objectid;
-		btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
-				    key.objectid, key.offset,
+		ref.ref_root = btrfs_header_owner(leaf);
+		btrfs_init_data_ref(&ref, key.objectid, key.offset,
 				    root->root_key.objectid, false);
 		ret = btrfs_inc_extent_ref(trans, &ref);
 		if (ret) {
@@ -1179,8 +1179,8 @@  int replace_file_extents(struct btrfs_trans_handle *trans,
 		ref.len = num_bytes;
 		ref.parent = parent;
 		ref.owning_root = root->root_key.objectid;
-		btrfs_init_data_ref(&ref, btrfs_header_owner(leaf),
-				    key.objectid, key.offset,
+		ref.ref_root = btrfs_header_owner(leaf);
+		btrfs_init_data_ref(&ref, key.objectid, key.offset,
 				    root->root_key.objectid, false);
 		ret = btrfs_free_extent(trans, &ref);
 		if (ret) {
@@ -1395,8 +1395,8 @@  int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
 		ref.len = blocksize;
 		ref.parent = path->nodes[level]->start;
 		ref.owning_root = src->root_key.objectid;
-		btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
-				    0, true);
+		ref.ref_root = src->root_key.objectid;
+		btrfs_init_tree_ref(&ref, level - 1, 0, true);
 		ret = btrfs_inc_extent_ref(trans, &ref);
 		if (ret) {
 			btrfs_abort_transaction(trans, ret);
@@ -1408,8 +1408,8 @@  int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
 		ref.len = blocksize;
 		ref.parent = 0;
 		ref.owning_root = dest->root_key.objectid;
-		btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid, 0,
-				    true);
+		ref.ref_root = dest->root_key.objectid;
+		btrfs_init_tree_ref(&ref, level - 1, 0, true);
 		ret = btrfs_inc_extent_ref(trans, &ref);
 		if (ret) {
 			btrfs_abort_transaction(trans, ret);
@@ -1422,8 +1422,8 @@  int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
 		ref.len = blocksize;
 		ref.parent = path->nodes[level]->start;
 		ref.owning_root = 0;
-		btrfs_init_tree_ref(&ref, level - 1, src->root_key.objectid,
-				    0, true);
+		ref.ref_root = src->root_key.objectid;
+		btrfs_init_tree_ref(&ref, level - 1, 0, true);
 		ret = btrfs_free_extent(trans, &ref);
 		if (ret) {
 			btrfs_abort_transaction(trans, ret);
@@ -1436,8 +1436,8 @@  int replace_path(struct btrfs_trans_handle *trans, struct reloc_control *rc,
 		ref.len = blocksize;
 		ref.parent = 0;
 		ref.owning_root = 0;
-		btrfs_init_tree_ref(&ref, level - 1, dest->root_key.objectid,
-				    0, true);
+		ref.ref_root = dest->root_key.objectid;
+		btrfs_init_tree_ref(&ref, level - 1, 0, true);
 		ret = btrfs_free_extent(trans, &ref);
 		if (ret) {
 			btrfs_abort_transaction(trans, ret);
@@ -2540,6 +2540,7 @@  static int do_relocation(struct btrfs_trans_handle *trans,
 				.len = blocksize,
 				.parent = upper->eb->start,
 				.owning_root = btrfs_header_owner(upper->eb),
+				.ref_root = btrfs_header_owner(upper->eb),
 			};
 
 			btrfs_set_node_blockptr(upper->eb, slot,
@@ -2549,7 +2550,6 @@  static int do_relocation(struct btrfs_trans_handle *trans,
 			btrfs_mark_buffer_dirty(trans, upper->eb);
 
 			btrfs_init_tree_ref(&ref, node->level,
-					    btrfs_header_owner(upper->eb),
 					    root->root_key.objectid, false);
 			ret = btrfs_inc_extent_ref(trans, &ref);
 			if (!ret)
diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
index 27084c7519f9..da319ffda4ee 100644
--- a/fs/btrfs/tree-log.c
+++ b/fs/btrfs/tree-log.c
@@ -766,10 +766,10 @@  static noinline int replay_one_extent(struct btrfs_trans_handle *trans,
 					.bytenr = ins.objectid,
 					.len = ins.offset,
 					.owning_root = root->root_key.objectid,
+					.ref_root = root->root_key.objectid,
 				};
-				btrfs_init_data_ref(&ref,
-						root->root_key.objectid,
-						key->objectid, offset, 0, false);
+				btrfs_init_data_ref(&ref, key->objectid, offset,
+						    0, false);
 				ret = btrfs_inc_extent_ref(trans, &ref);
 				if (ret)
 					goto out;