static int read_one_block_group(struct btrfs_fs_info *info,
                                struct btrfs_path *path,
+                               const struct btrfs_key *key,
                                int need_clear)
 {
        struct extent_buffer *leaf = path->nodes[0];
        struct btrfs_block_group_cache *cache;
        struct btrfs_space_info *space_info;
-       struct btrfs_key key;
        struct btrfs_block_group_item bgi;
        const bool mixed = btrfs_fs_incompat(info, MIXED_GROUPS);
        int slot = path->slots[0];
        int ret;
 
-       btrfs_item_key_to_cpu(leaf, &key, slot);
-       ASSERT(key.type == BTRFS_BLOCK_GROUP_ITEM_KEY);
+       ASSERT(key->type == BTRFS_BLOCK_GROUP_ITEM_KEY);
 
-       cache = btrfs_create_block_group_cache(info, key.objectid, key.offset);
+       cache = btrfs_create_block_group_cache(info, key->objectid, key->offset);
        if (!cache)
                return -ENOMEM;
 
         * are empty, and we can just add all the space in and be done with it.
         * This saves us _a_lot_ of time, particularly in the full case.
         */
-       if (key.offset == cache->used) {
+       if (key->offset == cache->used) {
                cache->last_byte_to_unpin = (u64)-1;
                cache->cached = BTRFS_CACHE_FINISHED;
                btrfs_free_excluded_extents(cache);
        } else if (cache->used == 0) {
                cache->last_byte_to_unpin = (u64)-1;
                cache->cached = BTRFS_CACHE_FINISHED;
-               add_new_free_space(cache, key.objectid,
-                                  key.objectid + key.offset);
+               add_new_free_space(cache, key->objectid,
+                                  key->objectid + key->offset);
                btrfs_free_excluded_extents(cache);
        }
 
                goto error;
        }
        trace_btrfs_add_block_group(info, cache, 0);
-       btrfs_update_space_info(info, cache->flags, key.offset,
+       btrfs_update_space_info(info, cache->flags, key->offset,
                                cache->used, cache->bytes_super, &space_info);
 
        cache->space_info = space_info;
                        goto error;
 
                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
-               ret = read_one_block_group(info, path, need_clear);
+               ret = read_one_block_group(info, path, &key, need_clear);
                if (ret < 0)
                        goto error;
                key.objectid += key.offset;