return 0;
 }
 
-static void link_block_group(struct btrfs_block_group *cache)
-{
-       struct btrfs_space_info *space_info = cache->space_info;
-       int index = btrfs_bg_flags_to_raid_index(cache->flags);
-
-       down_write(&space_info->groups_sem);
-       list_add_tail(&cache->list, &space_info->block_groups[index]);
-       up_write(&space_info->groups_sem);
-}
-
 static struct btrfs_block_group *btrfs_create_block_group_cache(
                struct btrfs_fs_info *fs_info, u64 start)
 {
                                int need_clear)
 {
        struct btrfs_block_group *cache;
-       struct btrfs_space_info *space_info;
        const bool mixed = btrfs_fs_incompat(info, MIXED_GROUPS);
        int ret;
 
                goto error;
        }
        trace_btrfs_add_block_group(info, cache, 0);
-       btrfs_add_bg_to_space_info(info, cache, &space_info);
-
-       cache->space_info = space_info;
-
-       link_block_group(cache);
+       btrfs_add_bg_to_space_info(info, cache);
 
        set_avail_alloc_bits(info, cache->flags);
        if (btrfs_chunk_writeable(info, cache->start)) {
 static int fill_dummy_bgs(struct btrfs_fs_info *fs_info)
 {
        struct extent_map_tree *em_tree = &fs_info->mapping_tree;
-       struct btrfs_space_info *space_info;
        struct rb_node *node;
        int ret = 0;
 
                        break;
                }
 
-               btrfs_add_bg_to_space_info(fs_info, bg, &space_info);
-               bg->space_info = space_info;
-               link_block_group(bg);
+               btrfs_add_bg_to_space_info(fs_info, bg);
 
                set_avail_alloc_bits(fs_info, bg->flags);
        }
         * the rbtree, update the space info's counters.
         */
        trace_btrfs_add_block_group(fs_info, cache, 1);
-       btrfs_add_bg_to_space_info(fs_info, cache, &cache->space_info);
+       btrfs_add_bg_to_space_info(fs_info, cache);
        btrfs_update_global_block_rsv(fs_info);
 
 #ifdef CONFIG_BTRFS_DEBUG
                fragment_free_space(cache);
        }
 #endif
-       link_block_group(cache);
 
        list_add_tail(&cache->bg_list, &trans->new_bgs);
        trans->delayed_ref_updates++;
 
 }
 
 void btrfs_add_bg_to_space_info(struct btrfs_fs_info *info,
-                               struct btrfs_block_group *block_group,
-                               struct btrfs_space_info **space_info)
+                               struct btrfs_block_group *block_group)
 {
        struct btrfs_space_info *found;
-       int factor;
+       int factor, index;
 
        factor = btrfs_bg_type_to_factor(block_group->flags);
 
                found->full = 0;
        btrfs_try_granting_tickets(info, found);
        spin_unlock(&found->lock);
-       *space_info = found;
+
+       block_group->space_info = found;
+
+       index = btrfs_bg_flags_to_raid_index(block_group->flags);
+       down_write(&found->groups_sem);
+       list_add_tail(&block_group->list, &found->block_groups[index]);
+       up_write(&found->groups_sem);
 }
 
 struct btrfs_space_info *btrfs_find_space_info(struct btrfs_fs_info *info,
 
 
 int btrfs_init_space_info(struct btrfs_fs_info *fs_info);
 void btrfs_add_bg_to_space_info(struct btrfs_fs_info *info,
-                               struct btrfs_block_group *block_group,
-                               struct btrfs_space_info **space_info);
+                               struct btrfs_block_group *block_group);
 void btrfs_update_space_info_chunk_size(struct btrfs_space_info *space_info,
                                        u64 chunk_size);
 struct btrfs_space_info *btrfs_find_space_info(struct btrfs_fs_info *info,