int ret = 0;
        int level;
        struct btrfs_disk_key disk_key;
+       u64 reloc_src_root = 0;
 
        WARN_ON(test_bit(BTRFS_ROOT_SHAREABLE, &root->state) &&
                trans->transid != fs_info->running_transaction->transid);
        else
                btrfs_node_key(buf, &disk_key, 0);
 
+       if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
+               reloc_src_root = btrfs_header_owner(buf);
        cow = btrfs_alloc_tree_block(trans, root, 0, new_root_objectid,
                                     &disk_key, level, buf->start, 0,
-                                    BTRFS_NESTING_NEW_ROOT);
+                                    reloc_src_root, BTRFS_NESTING_NEW_ROOT);
        if (IS_ERR(cow))
                return PTR_ERR(cow);
 
        int last_ref = 0;
        int unlock_orig = 0;
        u64 parent_start = 0;
+       u64 reloc_src_root = 0;
 
        if (*cow_ret == buf)
                unlock_orig = 1;
        else
                btrfs_node_key(buf, &disk_key, 0);
 
-       if ((root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) && parent)
-               parent_start = parent->start;
-
+       if (root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) {
+               if (parent)
+                       parent_start = parent->start;
+               reloc_src_root = btrfs_header_owner(buf);
+       }
        cow = btrfs_alloc_tree_block(trans, root, parent_start,
                                     root->root_key.objectid, &disk_key, level,
-                                    search_start, empty_size, nest);
+                                    search_start, empty_size, reloc_src_root, nest);
        if (IS_ERR(cow))
                return PTR_ERR(cow);
 
 
        c = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
                                   &lower_key, level, root->node->start, 0,
-                                  BTRFS_NESTING_NEW_ROOT);
+                                  0, BTRFS_NESTING_NEW_ROOT);
        if (IS_ERR(c))
                return PTR_ERR(c);
 
 
        split = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
                                       &disk_key, level, c->start, 0,
-                                      BTRFS_NESTING_SPLIT);
+                                      0, BTRFS_NESTING_SPLIT);
        if (IS_ERR(split))
                return PTR_ERR(split);
 
         * use BTRFS_NESTING_NEW_ROOT.
         */
        right = btrfs_alloc_tree_block(trans, root, 0, root->root_key.objectid,
-                                      &disk_key, 0, l->start, 0,
+                                      &disk_key, 0, l->start, 0, 0,
                                       num_doubles ? BTRFS_NESTING_NEW_ROOT :
                                       BTRFS_NESTING_SPLIT);
        if (IS_ERR(right))
 
        root->root_key.offset = 0;
 
        leaf = btrfs_alloc_tree_block(trans, root, 0, objectid, NULL, 0, 0, 0,
-                                     BTRFS_NESTING_NORMAL);
+                                     0, BTRFS_NESTING_NORMAL);
        if (IS_ERR(leaf)) {
                ret = PTR_ERR(leaf);
                leaf = NULL;
         */
 
        leaf = btrfs_alloc_tree_block(trans, root, 0, BTRFS_TREE_LOG_OBJECTID,
-                       NULL, 0, 0, 0, BTRFS_NESTING_NORMAL);
+                       NULL, 0, 0, 0, 0, BTRFS_NESTING_NORMAL);
        if (IS_ERR(leaf))
                return PTR_ERR(leaf);
 
 
                                             const struct btrfs_disk_key *key,
                                             int level, u64 hint,
                                             u64 empty_size,
+                                            u64 reloc_src_root,
                                             enum btrfs_lock_nesting nest)
 {
        struct btrfs_fs_info *fs_info = root->fs_info;
        int ret;
        u32 blocksize = fs_info->nodesize;
        bool skinny_metadata = btrfs_fs_incompat(fs_info, SKINNY_METADATA);
+       u64 owning_root;
 
 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
        if (btrfs_is_testing(fs_info)) {
                ret = PTR_ERR(buf);
                goto out_free_reserved;
        }
+       owning_root = btrfs_header_owner(buf);
 
        if (root_objectid == BTRFS_TREE_RELOC_OBJECTID) {
                if (parent == 0)
                        parent = ins.objectid;
                flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;
+               owning_root = reloc_src_root;
        } else
                BUG_ON(parent > 0);
 
                extent_op->level = level;
 
                btrfs_init_generic_ref(&generic_ref, BTRFS_ADD_DELAYED_EXTENT,
-                                      ins.objectid, ins.offset, parent,
-                                      btrfs_header_owner(buf));
+                                      ins.objectid, ins.offset, parent, owning_root);
                btrfs_init_tree_ref(&generic_ref, level, root_objectid,
                                    root->root_key.objectid, false);
                btrfs_ref_tree_mod(fs_info, &generic_ref);