struct btrfs_root *quota_root;
        struct btrfs_root *uuid_root;
        struct btrfs_root *free_space_root;
+       struct btrfs_root *data_reloc_root;
 
        /* the log root tree is a directory of all the other log roots */
        struct btrfs_root *log_root_tree;
 
        if (ret)
                goto fail;
 
-       if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID) {
+       if (root->root_key.objectid != BTRFS_TREE_LOG_OBJECTID &&
+           root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) {
                set_bit(BTRFS_ROOT_SHAREABLE, &root->state);
                btrfs_check_and_init_root_item(&root->root_item);
        }
        btrfs_put_root(fs_info->uuid_root);
        btrfs_put_root(fs_info->free_space_root);
        btrfs_put_root(fs_info->fs_root);
+       btrfs_put_root(fs_info->data_reloc_root);
        btrfs_check_leaked_roots(fs_info);
        btrfs_extent_buffer_leak_debug_check(fs_info);
        kfree(fs_info->super_copy);
        free_root_extent_buffers(info->quota_root);
        free_root_extent_buffers(info->uuid_root);
        free_root_extent_buffers(info->fs_root);
+       free_root_extent_buffers(info->data_reloc_root);
        if (free_chunk_root)
                free_root_extent_buffers(info->chunk_root);
        free_root_extent_buffers(info->free_space_root);
        set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
        fs_info->csum_root = root;
 
+       /*
+        * This tree can share blocks with some other fs tree during relocation
+        * and we need a proper setup by btrfs_get_fs_root
+        */
+       location.objectid = BTRFS_DATA_RELOC_TREE_OBJECTID;
+       root = btrfs_get_fs_root(tree_root->fs_info, &location, true);
+       if (IS_ERR(root)) {
+               ret = PTR_ERR(root);
+               goto out;
+       }
+       set_bit(BTRFS_ROOT_TRACK_DIRTY, &root->state);
+       fs_info->data_reloc_root = root;
+
        location.objectid = BTRFS_QUOTA_TREE_OBJECTID;
        root = btrfs_read_tree_root(tree_root, &location);
        if (!IS_ERR(root)) {
 
        u64 objectid;
        int err = 0;
 
-       root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID);
-       if (IS_ERR(root))
-               return ERR_CAST(root);
-
+       root = btrfs_grab_root(fs_info->data_reloc_root);
        trans = btrfs_start_transaction(root, 6);
        if (IS_ERR(trans)) {
                btrfs_put_root(root);
 
        if (err == 0) {
                /* cleanup orphan inode in data relocation tree */
-               fs_root = read_fs_root(fs_info, BTRFS_DATA_RELOC_TREE_OBJECTID);
-               if (IS_ERR(fs_root)) {
-                       err = PTR_ERR(fs_root);
-               } else {
-                       err = btrfs_orphan_cleanup(fs_root);
-                       btrfs_put_root(fs_root);
-               }
+               fs_root = btrfs_grab_root(fs_info->data_reloc_root);
+               ASSERT(fs_root);
+               err = btrfs_orphan_cleanup(fs_root);
+               btrfs_put_root(fs_root);
        }
        return err;
 }