diff mbox series

[11/19] btrfs: move ->parent and ->ref_root into btrfs_delayed_ref_node

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

Commit Message

Josef Bacik April 13, 2024, 11:53 p.m. UTC
These two members are shared by both the tree refs and data refs, so
move them into btrfs_delayed_ref_node proper.  This allows us to greatly
simplify the comparison code, as the shared refs always only sort on
parent, and the non shared refs always sort first on ref_root, and then
only data refs sort on their specific fields.

Signed-off-by: Josef Bacik <josef@toxicpanda.com>
---
 fs/btrfs/backref.c           | 12 ++----
 fs/btrfs/delayed-ref.c       | 82 ++++++++++++------------------------
 fs/btrfs/delayed-ref.h       | 13 ++++--
 fs/btrfs/extent-tree.c       | 18 ++++----
 include/trace/events/btrfs.h |  8 ++--
 5 files changed, 52 insertions(+), 81 deletions(-)

Comments

Filipe Manana April 15, 2024, 12:56 p.m. UTC | #1
On Sun, Apr 14, 2024 at 12:54 AM Josef Bacik <josef@toxicpanda.com> wrote:
>
> These two members are shared by both the tree refs and data refs, so
> move them into btrfs_delayed_ref_node proper.  This allows us to greatly
> simplify the comparison code, as the shared refs always only sort on
> parent, and the non shared refs always sort first on ref_root, and then
> only data refs sort on their specific fields.
>
> Signed-off-by: Josef Bacik <josef@toxicpanda.com>
> ---
>  fs/btrfs/backref.c           | 12 ++----
>  fs/btrfs/delayed-ref.c       | 82 ++++++++++++------------------------
>  fs/btrfs/delayed-ref.h       | 13 ++++--
>  fs/btrfs/extent-tree.c       | 18 ++++----
>  include/trace/events/btrfs.h |  8 ++--
>  5 files changed, 52 insertions(+), 81 deletions(-)
>
> diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
> index c1e6a5bbeeaf..98a0cf68d198 100644
> --- a/fs/btrfs/backref.c
> +++ b/fs/btrfs/backref.c
> @@ -928,7 +928,7 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
>                         }
>
>                         ref = btrfs_delayed_node_to_tree_ref(node);
> -                       ret = add_indirect_ref(fs_info, preftrees, ref->root,
> +                       ret = add_indirect_ref(fs_info, preftrees, node->ref_root,
>                                                key_ptr, ref->level + 1,
>                                                node->bytenr, count, sc,
>                                                GFP_ATOMIC);
> @@ -941,7 +941,7 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
>                         ref = btrfs_delayed_node_to_tree_ref(node);
>
>                         ret = add_direct_ref(fs_info, preftrees, ref->level + 1,
> -                                            ref->parent, node->bytenr, count,
> +                                            node->parent, node->bytenr, count,
>                                              sc, GFP_ATOMIC);
>                         break;
>                 }
> @@ -972,18 +972,14 @@ static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
>                         if (sc && count < 0)
>                                 sc->have_delayed_delete_refs = true;
>
> -                       ret = add_indirect_ref(fs_info, preftrees, ref->root,
> +                       ret = add_indirect_ref(fs_info, preftrees, node->ref_root,
>                                                &key, 0, node->bytenr, count, sc,
>                                                GFP_ATOMIC);
>                         break;
>                 }
>                 case BTRFS_SHARED_DATA_REF_KEY: {
>                         /* SHARED DIRECT FULL backref */
> -                       struct btrfs_delayed_data_ref *ref;
> -
> -                       ref = btrfs_delayed_node_to_data_ref(node);
> -
> -                       ret = add_direct_ref(fs_info, preftrees, 0, ref->parent,
> +                       ret = add_direct_ref(fs_info, preftrees, 0, node->parent,
>                                              node->bytenr, count, sc,
>                                              GFP_ATOMIC);
>                         break;
> diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
> index a3eb3eb2f321..f9779142a174 100644
> --- a/fs/btrfs/delayed-ref.c
> +++ b/fs/btrfs/delayed-ref.c
> @@ -303,55 +303,20 @@ int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
>         return 0;
>  }
>
> -/*
> - * compare two delayed tree backrefs with same bytenr and type
> - */
> -static int comp_tree_refs(struct btrfs_delayed_tree_ref *ref1,
> -                         struct btrfs_delayed_tree_ref *ref2)
> -{
> -       struct btrfs_delayed_ref_node *node = btrfs_delayed_tree_ref_to_node(ref1);
> -
> -       if (node->type == BTRFS_TREE_BLOCK_REF_KEY) {
> -               if (ref1->root < ref2->root)
> -                       return -1;
> -               if (ref1->root > ref2->root)
> -                       return 1;
> -       } else {
> -               if (ref1->parent < ref2->parent)
> -                       return -1;
> -               if (ref1->parent > ref2->parent)
> -                       return 1;
> -       }
> -       return 0;
> -}
> -
>  /*
>   * compare two delayed data backrefs with same bytenr and type
>   */
> -static int comp_data_refs(struct btrfs_delayed_data_ref *ref1,
> -                         struct btrfs_delayed_data_ref *ref2)
> +static int comp_data_refs(struct btrfs_delayed_ref_node *ref1,
> +                         struct btrfs_delayed_ref_node *ref2)
>  {
> -       struct btrfs_delayed_ref_node *node = btrfs_delayed_data_ref_to_node(ref1);
> -
> -       if (node->type == BTRFS_EXTENT_DATA_REF_KEY) {
> -               if (ref1->root < ref2->root)
> -                       return -1;
> -               if (ref1->root > ref2->root)
> -                       return 1;
> -               if (ref1->objectid < ref2->objectid)
> -                       return -1;
> -               if (ref1->objectid > ref2->objectid)
> -                       return 1;
> -               if (ref1->offset < ref2->offset)
> -                       return -1;
> -               if (ref1->offset > ref2->offset)
> -                       return 1;
> -       } else {
> -               if (ref1->parent < ref2->parent)
> -                       return -1;
> -               if (ref1->parent > ref2->parent)
> -                       return 1;
> -       }
> +       if (ref1->data_ref.objectid < ref2->data_ref.objectid)
> +               return -1;
> +       if (ref1->data_ref.objectid > ref2->data_ref.objectid)
> +               return 1;
> +       if (ref1->data_ref.offset < ref2->data_ref.offset)
> +               return -1;
> +       if (ref1->data_ref.offset > ref2->data_ref.offset)
> +               return 1;
>         return 0;
>  }
>
> @@ -365,13 +330,20 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
>                 return -1;
>         if (ref1->type > ref2->type)
>                 return 1;
> -       if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY ||
> -           ref1->type == BTRFS_SHARED_BLOCK_REF_KEY)
> -               ret = comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref1),
> -                                    btrfs_delayed_node_to_tree_ref(ref2));
> -       else
> -               ret = comp_data_refs(btrfs_delayed_node_to_data_ref(ref1),
> -                                    btrfs_delayed_node_to_data_ref(ref2));
> +       if (ref1->type == BTRFS_SHARED_BLOCK_REF_KEY ||
> +           ref1->type == BTRFS_SHARED_DATA_REF_KEY) {
> +               if (ref1->parent < ref2->parent)
> +                       return -1;
> +               if (ref1->parent > ref2->parent)
> +                       return 1;
> +       } else {
> +               if (ref1->ref_root < ref2->ref_root)
> +                       return -1;
> +               if (ref1->ref_root > ref2->ref_root)
> +                       return -1;
> +               if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY)
> +                       ret = comp_data_refs(ref1, ref2);
> +       }
>         if (ret)
>                 return ret;
>         if (check_seq) {
> @@ -1005,17 +977,15 @@ static void init_delayed_ref_common(struct btrfs_fs_info *fs_info,
>         ref->action = action;
>         ref->seq = seq;
>         ref->type = btrfs_ref_type(generic_ref);
> +       ref->ref_root = generic_ref->ref_root;
> +       ref->parent = generic_ref->parent;
>         RB_CLEAR_NODE(&ref->ref_node);
>         INIT_LIST_HEAD(&ref->add_list);
>
>         if (generic_ref->type == BTRFS_REF_DATA) {
> -               ref->data_ref.root = generic_ref->ref_root;
> -               ref->data_ref.parent = generic_ref->parent;
>                 ref->data_ref.objectid = generic_ref->data_ref.ino;
>                 ref->data_ref.offset = generic_ref->data_ref.offset;
>         } else {
> -               ref->tree_ref.root = generic_ref->ref_root;
> -               ref->tree_ref.parent = generic_ref->parent;
>                 ref->tree_ref.level = generic_ref->tree_ref.level;
>         }
>  }
> diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h
> index 000fdcaf2314..6ad48e0a0a1a 100644
> --- a/fs/btrfs/delayed-ref.h
> +++ b/fs/btrfs/delayed-ref.h
> @@ -31,14 +31,10 @@ enum btrfs_delayed_ref_action {
>  } __packed;
>
>  struct btrfs_delayed_tree_ref {
> -       u64 root;
> -       u64 parent;
>         int level;
>  };
>
>  struct btrfs_delayed_data_ref {
> -       u64 root;
> -       u64 parent;
>         u64 objectid;
>         u64 offset;
>  };
> @@ -61,6 +57,15 @@ struct btrfs_delayed_ref_node {
>         /* seq number to keep track of insertion order */
>         u64 seq;
>
> +       /* the ref_root for this ref */

Please capitalize the first world and add punctuation at the end of
the sentence.

> +       u64 ref_root;
> +
> +       /*
> +        * the parent for this ref, if this isn't set the ref_root is the
> +        * reference owner.

Same here, capitalize the first word of the sentence.

Other than that it looks good, so:

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

Thanks.


> +        */
> +       u64 parent;
> +
>         /* ref count on this data structure */
>         refcount_t refs;
>
> diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
> index 268516003927..0e42c8bddc0c 100644
> --- a/fs/btrfs/extent-tree.c
> +++ b/fs/btrfs/extent-tree.c
> @@ -1577,7 +1577,7 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
>         trace_run_delayed_data_ref(trans->fs_info, node);
>
>         if (node->type == BTRFS_SHARED_DATA_REF_KEY)
> -               parent = ref->parent;
> +               parent = node->parent;
>
>         if (node->action == BTRFS_ADD_DELAYED_REF && insert_reserved) {
>                 struct btrfs_key key;
> @@ -1596,7 +1596,7 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
>                 key.type = BTRFS_EXTENT_ITEM_KEY;
>                 key.offset = node->num_bytes;
>
> -               ret = alloc_reserved_file_extent(trans, parent, ref->root,
> +               ret = alloc_reserved_file_extent(trans, parent, node->ref_root,
>                                                  flags, ref->objectid,
>                                                  ref->offset, &key,
>                                                  node->ref_mod, href->owning_root);
> @@ -1604,12 +1604,12 @@ static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
>                 if (!ret)
>                         ret = btrfs_record_squota_delta(trans->fs_info, &delta);
>         } else if (node->action == BTRFS_ADD_DELAYED_REF) {
> -               ret = __btrfs_inc_extent_ref(trans, node, parent, ref->root,
> +               ret = __btrfs_inc_extent_ref(trans, node, parent, node->ref_root,
>                                              ref->objectid, ref->offset,
>                                              extent_op);
>         } else if (node->action == BTRFS_DROP_DELAYED_REF) {
>                 ret = __btrfs_free_extent(trans, href, node, parent,
> -                                         ref->root, ref->objectid,
> +                                         node->ref_root, ref->objectid,
>                                           ref->offset, extent_op);
>         } else {
>                 BUG();
> @@ -1740,8 +1740,8 @@ static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
>         trace_run_delayed_tree_ref(trans->fs_info, node);
>
>         if (node->type == BTRFS_SHARED_BLOCK_REF_KEY)
> -               parent = ref->parent;
> -       ref_root = ref->root;
> +               parent = node->parent;
> +       ref_root = node->ref_root;
>
>         if (unlikely(node->ref_mod != 1)) {
>                 btrfs_err(trans->fs_info,
> @@ -2359,7 +2359,7 @@ static noinline int check_delayed_ref(struct btrfs_root *root,
>                  * If our ref doesn't match the one we're currently looking at
>                  * then we have a cross reference.
>                  */
> -               if (data_ref->root != root->root_key.objectid ||
> +               if (ref->ref_root != root->root_key.objectid ||
>                     data_ref->objectid != objectid ||
>                     data_ref->offset != offset) {
>                         ret = 1;
> @@ -4946,11 +4946,11 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
>         if (node->type == BTRFS_SHARED_BLOCK_REF_KEY) {
>                 btrfs_set_extent_inline_ref_type(leaf, iref,
>                                                  BTRFS_SHARED_BLOCK_REF_KEY);
> -               btrfs_set_extent_inline_ref_offset(leaf, iref, ref->parent);
> +               btrfs_set_extent_inline_ref_offset(leaf, iref, node->parent);
>         } else {
>                 btrfs_set_extent_inline_ref_type(leaf, iref,
>                                                  BTRFS_TREE_BLOCK_REF_KEY);
> -               btrfs_set_extent_inline_ref_offset(leaf, iref, ref->root);
> +               btrfs_set_extent_inline_ref_offset(leaf, iref, node->ref_root);
>         }
>
>         btrfs_mark_buffer_dirty(trans, leaf);
> diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
> index dae29f6d6b4c..e6cee75c384c 100644
> --- a/include/trace/events/btrfs.h
> +++ b/include/trace/events/btrfs.h
> @@ -887,8 +887,8 @@ DECLARE_EVENT_CLASS(btrfs_delayed_tree_ref,
>                 __entry->bytenr         = ref->bytenr;
>                 __entry->num_bytes      = ref->num_bytes;
>                 __entry->action         = ref->action;
> -               __entry->parent         = ref->tree_ref.parent;
> -               __entry->ref_root       = ref->tree_ref.root;
> +               __entry->parent         = ref->parent;
> +               __entry->ref_root       = ref->ref_root;
>                 __entry->level          = ref->tree_ref.level;
>                 __entry->type           = ref->type;
>                 __entry->seq            = ref->seq;
> @@ -945,8 +945,8 @@ DECLARE_EVENT_CLASS(btrfs_delayed_data_ref,
>                 __entry->bytenr         = ref->bytenr;
>                 __entry->num_bytes      = ref->num_bytes;
>                 __entry->action         = ref->action;
> -               __entry->parent         = ref->data_ref.parent;
> -               __entry->ref_root       = ref->data_ref.root;
> +               __entry->parent         = ref->parent;
> +               __entry->ref_root       = ref->ref_root;
>                 __entry->owner          = ref->data_ref.objectid;
>                 __entry->offset         = ref->data_ref.offset;
>                 __entry->type           = ref->type;
> --
> 2.43.0
>
>
diff mbox series

Patch

diff --git a/fs/btrfs/backref.c b/fs/btrfs/backref.c
index c1e6a5bbeeaf..98a0cf68d198 100644
--- a/fs/btrfs/backref.c
+++ b/fs/btrfs/backref.c
@@ -928,7 +928,7 @@  static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
 			}
 
 			ref = btrfs_delayed_node_to_tree_ref(node);
-			ret = add_indirect_ref(fs_info, preftrees, ref->root,
+			ret = add_indirect_ref(fs_info, preftrees, node->ref_root,
 					       key_ptr, ref->level + 1,
 					       node->bytenr, count, sc,
 					       GFP_ATOMIC);
@@ -941,7 +941,7 @@  static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
 			ref = btrfs_delayed_node_to_tree_ref(node);
 
 			ret = add_direct_ref(fs_info, preftrees, ref->level + 1,
-					     ref->parent, node->bytenr, count,
+					     node->parent, node->bytenr, count,
 					     sc, GFP_ATOMIC);
 			break;
 		}
@@ -972,18 +972,14 @@  static int add_delayed_refs(const struct btrfs_fs_info *fs_info,
 			if (sc && count < 0)
 				sc->have_delayed_delete_refs = true;
 
-			ret = add_indirect_ref(fs_info, preftrees, ref->root,
+			ret = add_indirect_ref(fs_info, preftrees, node->ref_root,
 					       &key, 0, node->bytenr, count, sc,
 					       GFP_ATOMIC);
 			break;
 		}
 		case BTRFS_SHARED_DATA_REF_KEY: {
 			/* SHARED DIRECT FULL backref */
-			struct btrfs_delayed_data_ref *ref;
-
-			ref = btrfs_delayed_node_to_data_ref(node);
-
-			ret = add_direct_ref(fs_info, preftrees, 0, ref->parent,
+			ret = add_direct_ref(fs_info, preftrees, 0, node->parent,
 					     node->bytenr, count, sc,
 					     GFP_ATOMIC);
 			break;
diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c
index a3eb3eb2f321..f9779142a174 100644
--- a/fs/btrfs/delayed-ref.c
+++ b/fs/btrfs/delayed-ref.c
@@ -303,55 +303,20 @@  int btrfs_delayed_refs_rsv_refill(struct btrfs_fs_info *fs_info,
 	return 0;
 }
 
-/*
- * compare two delayed tree backrefs with same bytenr and type
- */
-static int comp_tree_refs(struct btrfs_delayed_tree_ref *ref1,
-			  struct btrfs_delayed_tree_ref *ref2)
-{
-	struct btrfs_delayed_ref_node *node = btrfs_delayed_tree_ref_to_node(ref1);
-
-	if (node->type == BTRFS_TREE_BLOCK_REF_KEY) {
-		if (ref1->root < ref2->root)
-			return -1;
-		if (ref1->root > ref2->root)
-			return 1;
-	} else {
-		if (ref1->parent < ref2->parent)
-			return -1;
-		if (ref1->parent > ref2->parent)
-			return 1;
-	}
-	return 0;
-}
-
 /*
  * compare two delayed data backrefs with same bytenr and type
  */
-static int comp_data_refs(struct btrfs_delayed_data_ref *ref1,
-			  struct btrfs_delayed_data_ref *ref2)
+static int comp_data_refs(struct btrfs_delayed_ref_node *ref1,
+			  struct btrfs_delayed_ref_node *ref2)
 {
-	struct btrfs_delayed_ref_node *node = btrfs_delayed_data_ref_to_node(ref1);
-
-	if (node->type == BTRFS_EXTENT_DATA_REF_KEY) {
-		if (ref1->root < ref2->root)
-			return -1;
-		if (ref1->root > ref2->root)
-			return 1;
-		if (ref1->objectid < ref2->objectid)
-			return -1;
-		if (ref1->objectid > ref2->objectid)
-			return 1;
-		if (ref1->offset < ref2->offset)
-			return -1;
-		if (ref1->offset > ref2->offset)
-			return 1;
-	} else {
-		if (ref1->parent < ref2->parent)
-			return -1;
-		if (ref1->parent > ref2->parent)
-			return 1;
-	}
+	if (ref1->data_ref.objectid < ref2->data_ref.objectid)
+		return -1;
+	if (ref1->data_ref.objectid > ref2->data_ref.objectid)
+		return 1;
+	if (ref1->data_ref.offset < ref2->data_ref.offset)
+		return -1;
+	if (ref1->data_ref.offset > ref2->data_ref.offset)
+		return 1;
 	return 0;
 }
 
@@ -365,13 +330,20 @@  static int comp_refs(struct btrfs_delayed_ref_node *ref1,
 		return -1;
 	if (ref1->type > ref2->type)
 		return 1;
-	if (ref1->type == BTRFS_TREE_BLOCK_REF_KEY ||
-	    ref1->type == BTRFS_SHARED_BLOCK_REF_KEY)
-		ret = comp_tree_refs(btrfs_delayed_node_to_tree_ref(ref1),
-				     btrfs_delayed_node_to_tree_ref(ref2));
-	else
-		ret = comp_data_refs(btrfs_delayed_node_to_data_ref(ref1),
-				     btrfs_delayed_node_to_data_ref(ref2));
+	if (ref1->type == BTRFS_SHARED_BLOCK_REF_KEY ||
+	    ref1->type == BTRFS_SHARED_DATA_REF_KEY) {
+		if (ref1->parent < ref2->parent)
+			return -1;
+		if (ref1->parent > ref2->parent)
+			return 1;
+	} else {
+		if (ref1->ref_root < ref2->ref_root)
+			return -1;
+		if (ref1->ref_root > ref2->ref_root)
+			return -1;
+		if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY)
+			ret = comp_data_refs(ref1, ref2);
+	}
 	if (ret)
 		return ret;
 	if (check_seq) {
@@ -1005,17 +977,15 @@  static void init_delayed_ref_common(struct btrfs_fs_info *fs_info,
 	ref->action = action;
 	ref->seq = seq;
 	ref->type = btrfs_ref_type(generic_ref);
+	ref->ref_root = generic_ref->ref_root;
+	ref->parent = generic_ref->parent;
 	RB_CLEAR_NODE(&ref->ref_node);
 	INIT_LIST_HEAD(&ref->add_list);
 
 	if (generic_ref->type == BTRFS_REF_DATA) {
-		ref->data_ref.root = generic_ref->ref_root;
-		ref->data_ref.parent = generic_ref->parent;
 		ref->data_ref.objectid = generic_ref->data_ref.ino;
 		ref->data_ref.offset = generic_ref->data_ref.offset;
 	} else {
-		ref->tree_ref.root = generic_ref->ref_root;
-		ref->tree_ref.parent = generic_ref->parent;
 		ref->tree_ref.level = generic_ref->tree_ref.level;
 	}
 }
diff --git a/fs/btrfs/delayed-ref.h b/fs/btrfs/delayed-ref.h
index 000fdcaf2314..6ad48e0a0a1a 100644
--- a/fs/btrfs/delayed-ref.h
+++ b/fs/btrfs/delayed-ref.h
@@ -31,14 +31,10 @@  enum btrfs_delayed_ref_action {
 } __packed;
 
 struct btrfs_delayed_tree_ref {
-	u64 root;
-	u64 parent;
 	int level;
 };
 
 struct btrfs_delayed_data_ref {
-	u64 root;
-	u64 parent;
 	u64 objectid;
 	u64 offset;
 };
@@ -61,6 +57,15 @@  struct btrfs_delayed_ref_node {
 	/* seq number to keep track of insertion order */
 	u64 seq;
 
+	/* the ref_root for this ref */
+	u64 ref_root;
+
+	/*
+	 * the parent for this ref, if this isn't set the ref_root is the
+	 * reference owner.
+	 */
+	u64 parent;
+
 	/* ref count on this data structure */
 	refcount_t refs;
 
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 268516003927..0e42c8bddc0c 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -1577,7 +1577,7 @@  static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
 	trace_run_delayed_data_ref(trans->fs_info, node);
 
 	if (node->type == BTRFS_SHARED_DATA_REF_KEY)
-		parent = ref->parent;
+		parent = node->parent;
 
 	if (node->action == BTRFS_ADD_DELAYED_REF && insert_reserved) {
 		struct btrfs_key key;
@@ -1596,7 +1596,7 @@  static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
 		key.type = BTRFS_EXTENT_ITEM_KEY;
 		key.offset = node->num_bytes;
 
-		ret = alloc_reserved_file_extent(trans, parent, ref->root,
+		ret = alloc_reserved_file_extent(trans, parent, node->ref_root,
 						 flags, ref->objectid,
 						 ref->offset, &key,
 						 node->ref_mod, href->owning_root);
@@ -1604,12 +1604,12 @@  static int run_delayed_data_ref(struct btrfs_trans_handle *trans,
 		if (!ret)
 			ret = btrfs_record_squota_delta(trans->fs_info, &delta);
 	} else if (node->action == BTRFS_ADD_DELAYED_REF) {
-		ret = __btrfs_inc_extent_ref(trans, node, parent, ref->root,
+		ret = __btrfs_inc_extent_ref(trans, node, parent, node->ref_root,
 					     ref->objectid, ref->offset,
 					     extent_op);
 	} else if (node->action == BTRFS_DROP_DELAYED_REF) {
 		ret = __btrfs_free_extent(trans, href, node, parent,
-					  ref->root, ref->objectid,
+					  node->ref_root, ref->objectid,
 					  ref->offset, extent_op);
 	} else {
 		BUG();
@@ -1740,8 +1740,8 @@  static int run_delayed_tree_ref(struct btrfs_trans_handle *trans,
 	trace_run_delayed_tree_ref(trans->fs_info, node);
 
 	if (node->type == BTRFS_SHARED_BLOCK_REF_KEY)
-		parent = ref->parent;
-	ref_root = ref->root;
+		parent = node->parent;
+	ref_root = node->ref_root;
 
 	if (unlikely(node->ref_mod != 1)) {
 		btrfs_err(trans->fs_info,
@@ -2359,7 +2359,7 @@  static noinline int check_delayed_ref(struct btrfs_root *root,
 		 * If our ref doesn't match the one we're currently looking at
 		 * then we have a cross reference.
 		 */
-		if (data_ref->root != root->root_key.objectid ||
+		if (ref->ref_root != root->root_key.objectid ||
 		    data_ref->objectid != objectid ||
 		    data_ref->offset != offset) {
 			ret = 1;
@@ -4946,11 +4946,11 @@  static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans,
 	if (node->type == BTRFS_SHARED_BLOCK_REF_KEY) {
 		btrfs_set_extent_inline_ref_type(leaf, iref,
 						 BTRFS_SHARED_BLOCK_REF_KEY);
-		btrfs_set_extent_inline_ref_offset(leaf, iref, ref->parent);
+		btrfs_set_extent_inline_ref_offset(leaf, iref, node->parent);
 	} else {
 		btrfs_set_extent_inline_ref_type(leaf, iref,
 						 BTRFS_TREE_BLOCK_REF_KEY);
-		btrfs_set_extent_inline_ref_offset(leaf, iref, ref->root);
+		btrfs_set_extent_inline_ref_offset(leaf, iref, node->ref_root);
 	}
 
 	btrfs_mark_buffer_dirty(trans, leaf);
diff --git a/include/trace/events/btrfs.h b/include/trace/events/btrfs.h
index dae29f6d6b4c..e6cee75c384c 100644
--- a/include/trace/events/btrfs.h
+++ b/include/trace/events/btrfs.h
@@ -887,8 +887,8 @@  DECLARE_EVENT_CLASS(btrfs_delayed_tree_ref,
 		__entry->bytenr		= ref->bytenr;
 		__entry->num_bytes	= ref->num_bytes;
 		__entry->action		= ref->action;
-		__entry->parent		= ref->tree_ref.parent;
-		__entry->ref_root	= ref->tree_ref.root;
+		__entry->parent		= ref->parent;
+		__entry->ref_root	= ref->ref_root;
 		__entry->level		= ref->tree_ref.level;
 		__entry->type		= ref->type;
 		__entry->seq		= ref->seq;
@@ -945,8 +945,8 @@  DECLARE_EVENT_CLASS(btrfs_delayed_data_ref,
 		__entry->bytenr		= ref->bytenr;
 		__entry->num_bytes	= ref->num_bytes;
 		__entry->action		= ref->action;
-		__entry->parent		= ref->data_ref.parent;
-		__entry->ref_root	= ref->data_ref.root;
+		__entry->parent		= ref->parent;
+		__entry->ref_root	= ref->ref_root;
 		__entry->owner		= ref->data_ref.objectid;
 		__entry->offset		= ref->data_ref.offset;
 		__entry->type		= ref->type;