const u64 *extent_item_pos, bool ignore_offset)
 {
        struct btrfs_root *root;
-       struct btrfs_key root_key;
        struct extent_buffer *eb;
        int ret = 0;
        int root_level;
        int level = ref->level;
        struct btrfs_key search_key = ref->key_for_search;
 
-       root_key.objectid = ref->root_id;
-       root_key.type = BTRFS_ROOT_ITEM_KEY;
-       root_key.offset = (u64)-1;
-
-       root = btrfs_get_fs_root(fs_info, &root_key, false);
+       root = btrfs_get_fs_root(fs_info, ref->root_id, false);
        if (IS_ERR(root)) {
                ret = PTR_ERR(root);
                goto out_free;
        struct btrfs_backref_edge *edge;
        struct extent_buffer *eb;
        struct btrfs_root *root;
-       struct btrfs_key root_key;
        struct rb_node *rb_node;
        int level;
        bool need_check = true;
        int ret;
 
-       root_key.objectid = ref_key->offset;
-       root_key.type = BTRFS_ROOT_ITEM_KEY;
-       root_key.offset = (u64)-1;
-       root = btrfs_get_fs_root(fs_info, &root_key, false);
+       root = btrfs_get_fs_root(fs_info, ref_key->offset, false);
        if (IS_ERR(root))
                return PTR_ERR(root);
        if (!test_bit(BTRFS_ROOT_SHAREABLE, &root->state))
 
 
 
 struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
-                                    struct btrfs_key *location,
-                                    bool check_ref)
+                                    u64 objectid, bool check_ref)
 {
        struct btrfs_root *root;
        struct btrfs_path *path;
        struct btrfs_key key;
        int ret;
 
-       if (location->objectid == BTRFS_ROOT_TREE_OBJECTID)
+       if (objectid == BTRFS_ROOT_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->tree_root);
-       if (location->objectid == BTRFS_EXTENT_TREE_OBJECTID)
+       if (objectid == BTRFS_EXTENT_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->extent_root);
-       if (location->objectid == BTRFS_CHUNK_TREE_OBJECTID)
+       if (objectid == BTRFS_CHUNK_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->chunk_root);
-       if (location->objectid == BTRFS_DEV_TREE_OBJECTID)
+       if (objectid == BTRFS_DEV_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->dev_root);
-       if (location->objectid == BTRFS_CSUM_TREE_OBJECTID)
+       if (objectid == BTRFS_CSUM_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->csum_root);
-       if (location->objectid == BTRFS_QUOTA_TREE_OBJECTID)
+       if (objectid == BTRFS_QUOTA_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->quota_root) ?
                        fs_info->quota_root : ERR_PTR(-ENOENT);
-       if (location->objectid == BTRFS_UUID_TREE_OBJECTID)
+       if (objectid == BTRFS_UUID_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->uuid_root) ?
                        fs_info->uuid_root : ERR_PTR(-ENOENT);
-       if (location->objectid == BTRFS_FREE_SPACE_TREE_OBJECTID)
+       if (objectid == BTRFS_FREE_SPACE_TREE_OBJECTID)
                return btrfs_grab_root(fs_info->free_space_root) ?
                        fs_info->free_space_root : ERR_PTR(-ENOENT);
 again:
-       root = btrfs_lookup_fs_root(fs_info, location->objectid);
+       root = btrfs_lookup_fs_root(fs_info, objectid);
        if (root) {
                if (check_ref && btrfs_root_refs(&root->root_item) == 0) {
                        btrfs_put_root(root);
                return root;
        }
 
-       root = btrfs_read_tree_root(fs_info->tree_root, location);
+       key.objectid = objectid;
+       key.type = BTRFS_ROOT_ITEM_KEY;
+       key.offset = (u64)-1;
+       root = btrfs_read_tree_root(fs_info->tree_root, &key);
        if (IS_ERR(root))
                return root;
 
        }
        key.objectid = BTRFS_ORPHAN_OBJECTID;
        key.type = BTRFS_ORPHAN_ITEM_KEY;
-       key.offset = location->objectid;
+       key.offset = objectid;
 
        ret = btrfs_search_slot(NULL, fs_info->tree_root, &key, path, 0, 0);
        btrfs_free_path(path);
         * 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);
+       root = btrfs_get_fs_root(tree_root->fs_info,
+                                BTRFS_DATA_RELOC_TREE_OBJECTID, true);
        if (IS_ERR(root)) {
                ret = PTR_ERR(root);
                goto out;
        u64 generation;
        u64 features;
        u16 csum_type;
-       struct btrfs_key location;
        struct btrfs_super_block *disk_super;
        struct btrfs_fs_info *fs_info = btrfs_sb(sb);
        struct btrfs_root *tree_root;
                }
        }
 
-       location.objectid = BTRFS_FS_TREE_OBJECTID;
-       location.type = BTRFS_ROOT_ITEM_KEY;
-       location.offset = 0;
-
-       fs_info->fs_root = btrfs_get_fs_root(fs_info, &location, true);
+       fs_info->fs_root = btrfs_get_fs_root(fs_info, BTRFS_FS_TREE_OBJECTID, true);
        if (IS_ERR(fs_info->fs_root)) {
                err = PTR_ERR(fs_info->fs_root);
                btrfs_warn(fs_info, "failed to read fs tree: %d", err);
 
 void btrfs_free_fs_roots(struct btrfs_fs_info *fs_info);
 
 struct btrfs_root *btrfs_get_fs_root(struct btrfs_fs_info *fs_info,
-                                    struct btrfs_key *key,
-                                    bool check_ref);
+                                    u64 objectid, bool check_ref);
 
 void btrfs_free_fs_info(struct btrfs_fs_info *fs_info);
 int btrfs_cleanup_fs_roots(struct btrfs_fs_info *fs_info);
 
        if (objectid < BTRFS_FIRST_FREE_OBJECTID)
                return ERR_PTR(-ESTALE);
 
-       key.objectid = root_objectid;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-
-       root = btrfs_get_fs_root(fs_info, &key, true);
+       root = btrfs_get_fs_root(fs_info, root_objectid, true);
        if (IS_ERR(root))
                return ERR_CAST(root);
 
 
        int ret;
 
        /* get the inode */
-       key.objectid = defrag->root;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-
-       inode_root = btrfs_get_fs_root(fs_info, &key, true);
+       inode_root = btrfs_get_fs_root(fs_info, defrag->root, true);
        if (IS_ERR(inode_root)) {
                ret = PTR_ERR(inode_root);
                goto cleanup;
 
 
        btrfs_release_path(path);
 
-       new_root = btrfs_get_fs_root(fs_info, location, true);
+       new_root = btrfs_get_fs_root(fs_info, location->objectid, true);
        if (IS_ERR(new_root)) {
                err = PTR_ERR(new_root);
                goto out;
 
                goto fail;
 
        key.offset = (u64)-1;
-       new_root = btrfs_get_fs_root(fs_info, &key, true);
+       new_root = btrfs_get_fs_root(fs_info, objectid, true);
        if (IS_ERR(new_root)) {
                ret = PTR_ERR(new_root);
                btrfs_abort_transaction(trans, ret);
                /* search the root of the inode that was passed */
                root = btrfs_grab_root(BTRFS_I(inode)->root);
        } else {
-               key.objectid = sk->tree_id;
-               key.type = BTRFS_ROOT_ITEM_KEY;
-               key.offset = (u64)-1;
-               root = btrfs_get_fs_root(info, &key, true);
+               root = btrfs_get_fs_root(info, sk->tree_id, true);
                if (IS_ERR(root)) {
                        btrfs_free_path(path);
                        return PTR_ERR(root);
 
        ptr = &name[BTRFS_INO_LOOKUP_PATH_MAX - 1];
 
-       key.objectid = tree_id;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-       root = btrfs_get_fs_root(info, &key, true);
+       root = btrfs_get_fs_root(info, tree_id, true);
        if (IS_ERR(root)) {
                ret = PTR_ERR(root);
                root = NULL;
        if (dirid != upper_limit.objectid) {
                ptr = &args->path[BTRFS_INO_LOOKUP_USER_PATH_MAX - 1];
 
-               key.objectid = treeid;
-               key.type = BTRFS_ROOT_ITEM_KEY;
-               key.offset = (u64)-1;
-               root = btrfs_get_fs_root(fs_info, &key, true);
+               root = btrfs_get_fs_root(fs_info, treeid, true);
                if (IS_ERR(root)) {
                        ret = PTR_ERR(root);
                        goto out;
 
        /* Get root_item of inode's subvolume */
        key.objectid = BTRFS_I(inode)->root->root_key.objectid;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-       root = btrfs_get_fs_root(fs_info, &key, true);
+       root = btrfs_get_fs_root(fs_info, key.objectid, true);
        if (IS_ERR(root)) {
                ret = PTR_ERR(root);
                goto out_free;
        struct btrfs_dir_item *di;
        struct btrfs_trans_handle *trans;
        struct btrfs_path *path = NULL;
-       struct btrfs_key location;
        struct btrfs_disk_key disk_key;
        u64 objectid = 0;
        u64 dir_id;
        if (!objectid)
                objectid = BTRFS_FS_TREE_OBJECTID;
 
-       location.objectid = objectid;
-       location.type = BTRFS_ROOT_ITEM_KEY;
-       location.offset = (u64)-1;
-
-       new_root = btrfs_get_fs_root(fs_info, &location, true);
+       new_root = btrfs_get_fs_root(fs_info, objectid, true);
        if (IS_ERR(new_root)) {
                ret = PTR_ERR(new_root);
                goto out;
 
 static struct btrfs_root *read_fs_root(struct btrfs_fs_info *fs_info,
                                        u64 root_objectid)
 {
-       struct btrfs_key key;
-
-       key.objectid = root_objectid;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-
-       return btrfs_get_fs_root(fs_info, &key, false);
+       return btrfs_get_fs_root(fs_info, root_objectid, false);
 }
 
 /*
 
        struct extent_buffer *leaf;
        struct btrfs_path *path;
        struct btrfs_key key;
-       struct btrfs_key root_key;
        struct btrfs_root *root;
        int err = 0;
        int ret;
        key.type = BTRFS_ORPHAN_ITEM_KEY;
        key.offset = 0;
 
-       root_key.type = BTRFS_ROOT_ITEM_KEY;
-       root_key.offset = (u64)-1;
-
        while (1) {
+               u64 root_objectid;
+
                ret = btrfs_search_slot(NULL, tree_root, &key, path, 0, 0);
                if (ret < 0) {
                        err = ret;
                    key.type != BTRFS_ORPHAN_ITEM_KEY)
                        break;
 
-               root_key.objectid = key.offset;
+               root_objectid = key.offset;
                key.offset++;
 
-               root = btrfs_get_fs_root(fs_info, &root_key, false);
+               root = btrfs_get_fs_root(fs_info, root_objectid, false);
                err = PTR_ERR_OR_ZERO(root);
                if (err && err != -ENOENT) {
                        break;
                                break;
                        }
                        err = btrfs_del_orphan_item(trans, tree_root,
-                                                   root_key.objectid);
+                                                   root_objectid);
                        btrfs_end_transaction(trans);
                        if (err) {
                                btrfs_handle_fs_error(fs_info, err,
 
        struct btrfs_fs_info *fs_info = swarn->dev->fs_info;
        struct inode_fs_paths *ipath = NULL;
        struct btrfs_root *local_root;
-       struct btrfs_key root_key;
        struct btrfs_key key;
 
-       root_key.objectid = root;
-       root_key.type = BTRFS_ROOT_ITEM_KEY;
-       root_key.offset = (u64)-1;
-       local_root = btrfs_get_fs_root(fs_info, &root_key, true);
+       local_root = btrfs_get_fs_root(fs_info, root, true);
        if (IS_ERR(local_root)) {
                ret = PTR_ERR(local_root);
                goto err;
 
        struct btrfs_root *send_root = BTRFS_I(file_inode(mnt_file))->root;
        struct btrfs_fs_info *fs_info = send_root->fs_info;
        struct btrfs_root *clone_root;
-       struct btrfs_key key;
        struct send_ctx *sctx = NULL;
        u32 i;
        u64 *clone_sources_tmp = NULL;
                }
 
                for (i = 0; i < arg->clone_sources_count; i++) {
-                       key.objectid = clone_sources_tmp[i];
-                       key.type = BTRFS_ROOT_ITEM_KEY;
-                       key.offset = (u64)-1;
-
-                       clone_root = btrfs_get_fs_root(fs_info, &key, true);
+                       clone_root = btrfs_get_fs_root(fs_info,
+                                               clone_sources_tmp[i], true);
                        if (IS_ERR(clone_root)) {
                                ret = PTR_ERR(clone_root);
                                goto out;
        }
 
        if (arg->parent_root) {
-               key.objectid = arg->parent_root;
-               key.type = BTRFS_ROOT_ITEM_KEY;
-               key.offset = (u64)-1;
-
-               sctx->parent_root = btrfs_get_fs_root(fs_info, &key, true);
+               sctx->parent_root = btrfs_get_fs_root(fs_info, arg->parent_root,
+                                                     true);
                if (IS_ERR(sctx->parent_root)) {
                        ret = PTR_ERR(sctx->parent_root);
                        goto out;
 
                dirid = btrfs_root_ref_dirid(path->nodes[0], root_ref);
                btrfs_release_path(path);
 
-               key.objectid = subvol_objectid;
-               key.type = BTRFS_ROOT_ITEM_KEY;
-               key.offset = (u64)-1;
-               fs_root = btrfs_get_fs_root(fs_info, &key, true);
+               fs_root = btrfs_get_fs_root(fs_info, subvol_objectid, true);
                if (IS_ERR(fs_root)) {
                        ret = PTR_ERR(fs_root);
                        fs_root = NULL;
 
        }
 
        key.offset = (u64)-1;
-       pending->snap = btrfs_get_fs_root(fs_info, &key, true);
+       pending->snap = btrfs_get_fs_root(fs_info, objectid, true);
        if (IS_ERR(pending->snap)) {
                ret = PTR_ERR(pending->snap);
                btrfs_abort_transaction(trans, ret);
 
        struct btrfs_trans_handle *trans;
        struct btrfs_key key;
        struct btrfs_key found_key;
-       struct btrfs_key tmp_key;
        struct btrfs_root *log;
        struct btrfs_fs_info *fs_info = log_root_tree->fs_info;
        struct walk_control wc = {
                        goto error;
                }
 
-               tmp_key.objectid = found_key.offset;
-               tmp_key.type = BTRFS_ROOT_ITEM_KEY;
-               tmp_key.offset = (u64)-1;
-
-               wc.replay_dest = btrfs_get_fs_root(fs_info, &tmp_key, true);
+               wc.replay_dest = btrfs_get_fs_root(fs_info, found_key.offset,
+                                                  true);
                if (IS_ERR(wc.replay_dest)) {
                        ret = PTR_ERR(wc.replay_dest);
 
 
 static int btrfs_check_uuid_tree_entry(struct btrfs_fs_info *fs_info,
                                       u8 *uuid, u8 type, u64 subvolid)
 {
-       struct btrfs_key key;
        int ret = 0;
        struct btrfs_root *subvol_root;
 
            type != BTRFS_UUID_KEY_RECEIVED_SUBVOL)
                goto out;
 
-       key.objectid = subvolid;
-       key.type = BTRFS_ROOT_ITEM_KEY;
-       key.offset = (u64)-1;
-       subvol_root = btrfs_get_fs_root(fs_info, &key, true);
+       subvol_root = btrfs_get_fs_root(fs_info, subvolid, true);
        if (IS_ERR(subvol_root)) {
                ret = PTR_ERR(subvol_root);
                if (ret == -ENOENT)