BUG_ON(ref->key_for_search.type);
                BUG_ON(!ref->wanted_disk_byte);
 
-               eb = read_tree_block(fs_info, ref->wanted_disk_byte, 0,
-                                    ref->level - 1, NULL);
+               eb = read_tree_block(fs_info, ref->wanted_disk_byte,
+                                    ref->root_id, 0, ref->level - 1, NULL);
                if (IS_ERR(eb)) {
                        free_pref(ref);
                        return PTR_ERR(eb);
                                struct extent_buffer *eb;
 
                                eb = read_tree_block(fs_info, ref->parent, 0,
-                                                    ref->level, NULL);
+                                                    0, ref->level, NULL);
                                if (IS_ERR(eb)) {
                                        ret = PTR_ERR(eb);
                                        goto out;
 
        if (old_root && tm && tm->op != MOD_LOG_KEY_REMOVE_WHILE_FREEING) {
                btrfs_tree_read_unlock(eb_root);
                free_extent_buffer(eb_root);
-               old = read_tree_block(fs_info, logical, 0, level, NULL);
+               old = read_tree_block(fs_info, logical, root->root_key.objectid,
+                                     0, level, NULL);
                if (WARN_ON(IS_ERR(old) || !extent_buffer_uptodate(old))) {
                        if (!IS_ERR(old))
                                free_extent_buffer(old);
 
        btrfs_node_key_to_cpu(parent, &first_key, slot);
        eb = read_tree_block(parent->fs_info, btrfs_node_blockptr(parent, slot),
+                            btrfs_header_owner(parent),
                             btrfs_node_ptr_generation(parent, slot),
                             level - 1, &first_key);
        if (!IS_ERR(eb) && !extent_buffer_uptodate(eb)) {
                reada_for_search(fs_info, p, level, slot, key->objectid);
 
        ret = -EAGAIN;
-       tmp = read_tree_block(fs_info, blocknr, gen, parent_level - 1,
-                             &first_key);
+       tmp = read_tree_block(fs_info, blocknr, root->root_key.objectid,
+                             gen, parent_level - 1, &first_key);
        if (!IS_ERR(tmp)) {
                /*
                 * If the read above didn't mark this buffer up to date,
 
  * Read tree block at logical address @bytenr and do variant basic but critical
  * verification.
  *
+ * @owner_root:                the objectid of the root owner for this block.
  * @parent_transid:    expected transid of this tree block, skip check if 0
  * @level:             expected level, mandatory check
  * @first_key:         expected key in slot 0, skip check if NULL
  */
 struct extent_buffer *read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
-                                     u64 parent_transid, int level,
-                                     struct btrfs_key *first_key)
+                                     u64 owner_root, u64 parent_transid,
+                                     int level, struct btrfs_key *first_key)
 {
        struct extent_buffer *buf = NULL;
        int ret;
        level = btrfs_root_level(&root->root_item);
        root->node = read_tree_block(fs_info,
                                     btrfs_root_bytenr(&root->root_item),
-                                    generation, level, NULL);
+                                    key->objectid, generation, level, NULL);
        if (IS_ERR(root->node)) {
                ret = PTR_ERR(root->node);
                root->node = NULL;
                return -ENOMEM;
 
        log_tree_root->node = read_tree_block(fs_info, bytenr,
-                                             fs_info->generation + 1,
-                                             level, NULL);
+                                             BTRFS_TREE_LOG_OBJECTID,
+                                             fs_info->generation + 1, level,
+                                             NULL);
        if (IS_ERR(log_tree_root->node)) {
                btrfs_warn(fs_info, "failed to read log tree");
                ret = PTR_ERR(log_tree_root->node);
                generation = btrfs_super_generation(sb);
                level = btrfs_super_root_level(sb);
                tree_root->node = read_tree_block(fs_info, btrfs_super_root(sb),
+                                                 BTRFS_ROOT_TREE_OBJECTID,
                                                  generation, level, NULL);
                if (IS_ERR(tree_root->node)) {
                        handle_error = true;
 
        chunk_root->node = read_tree_block(fs_info,
                                           btrfs_super_chunk_root(disk_super),
+                                          BTRFS_CHUNK_TREE_OBJECTID,
                                           generation, level, NULL);
        if (IS_ERR(chunk_root->node) ||
            !extent_buffer_uptodate(chunk_root->node)) {
 
 int btrfs_verify_level_key(struct extent_buffer *eb, int level,
                           struct btrfs_key *first_key, u64 parent_transid);
 struct extent_buffer *read_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr,
-                                     u64 parent_transid, int level,
-                                     struct btrfs_key *first_key);
+                                     u64 owner_root, u64 parent_transid,
+                                     int level, struct btrfs_key *first_key);
 struct extent_buffer *btrfs_find_create_tree_block(
                                                struct btrfs_fs_info *fs_info,
                                                u64 bytenr);
 
        if (!next) {
                if (reada && level == 1)
                        reada_walk_down(trans, root, wc, path);
-               next = read_tree_block(fs_info, bytenr, generation, level - 1,
-                                      &first_key);
+               next = read_tree_block(fs_info, bytenr, root->root_key.objectid,
+                                      generation, level - 1, &first_key);
                if (IS_ERR(next)) {
                        return PTR_ERR(next);
                } else if (!extent_buffer_uptodate(next)) {
 
 
                btrfs_node_key_to_cpu(c, &first_key, i);
                next = read_tree_block(fs_info, btrfs_node_blockptr(c, i),
+                                      btrfs_header_owner(c),
                                       btrfs_node_ptr_generation(c, i),
                                       level - 1, &first_key);
                if (IS_ERR(next)) {
 
        spin_unlock(&blocks->lock);
 
        /* Read out reloc subtree root */
-       reloc_eb = read_tree_block(fs_info, block->reloc_bytenr,
+       reloc_eb = read_tree_block(fs_info, block->reloc_bytenr, 0,
                                   block->reloc_generation, block->level,
                                   &block->first_key);
        if (IS_ERR(reloc_eb)) {
 
 {
        struct extent_buffer *eb;
 
-       eb = read_tree_block(fs_info, block->bytenr, block->key.offset,
+       eb = read_tree_block(fs_info, block->bytenr, 0, block->key.offset,
                             block->level, NULL);
        if (IS_ERR(eb)) {
                return PTR_ERR(eb);
        while ((ref_node = ulist_next(leaves, &leaf_uiter))) {
                struct extent_buffer *eb;
 
-               eb = read_tree_block(fs_info, ref_node->val, 0, 0, NULL);
+               eb = read_tree_block(fs_info, ref_node->val, 0, 0, 0, NULL);
                if (IS_ERR(eb)) {
                        ret = PTR_ERR(eb);
                        break;