ASSERT(block_group->length != 0);
 
-       spin_lock(&info->block_group_cache_lock);
+       write_lock(&info->block_group_cache_lock);
        p = &info->block_group_cache_tree.rb_root.rb_node;
 
        while (*p) {
                        p = &(*p)->rb_right;
                        leftmost = false;
                } else {
-                       spin_unlock(&info->block_group_cache_lock);
+                       write_unlock(&info->block_group_cache_lock);
                        return -EEXIST;
                }
        }
        rb_insert_color_cached(&block_group->cache_node,
                               &info->block_group_cache_tree, leftmost);
 
-       spin_unlock(&info->block_group_cache_lock);
+       write_unlock(&info->block_group_cache_lock);
 
        return 0;
 }
        struct rb_node *n;
        u64 end, start;
 
-       spin_lock(&info->block_group_cache_lock);
+       read_lock(&info->block_group_cache_lock);
        n = info->block_group_cache_tree.rb_root.rb_node;
 
        while (n) {
        }
        if (ret)
                btrfs_get_block_group(ret);
-       spin_unlock(&info->block_group_cache_lock);
+       read_unlock(&info->block_group_cache_lock);
 
        return ret;
 }
        struct btrfs_fs_info *fs_info = cache->fs_info;
        struct rb_node *node;
 
-       spin_lock(&fs_info->block_group_cache_lock);
+       read_lock(&fs_info->block_group_cache_lock);
 
        /* If our block group was removed, we need a full search. */
        if (RB_EMPTY_NODE(&cache->cache_node)) {
                const u64 next_bytenr = cache->start + cache->length;
 
-               spin_unlock(&fs_info->block_group_cache_lock);
+               read_unlock(&fs_info->block_group_cache_lock);
                btrfs_put_block_group(cache);
                cache = btrfs_lookup_first_block_group(fs_info, next_bytenr); return cache;
        }
                btrfs_get_block_group(cache);
        } else
                cache = NULL;
-       spin_unlock(&fs_info->block_group_cache_lock);
+       read_unlock(&fs_info->block_group_cache_lock);
        return cache;
 }
 
        cache->has_caching_ctl = 1;
        spin_unlock(&cache->lock);
 
-       spin_lock(&fs_info->block_group_cache_lock);
+       write_lock(&fs_info->block_group_cache_lock);
        refcount_inc(&caching_ctl->count);
        list_add_tail(&caching_ctl->list, &fs_info->caching_block_groups);
-       spin_unlock(&fs_info->block_group_cache_lock);
+       write_unlock(&fs_info->block_group_cache_lock);
 
        btrfs_get_block_group(cache);
 
        if (ret)
                goto out;
 
-       spin_lock(&fs_info->block_group_cache_lock);
+       write_lock(&fs_info->block_group_cache_lock);
        rb_erase_cached(&block_group->cache_node,
                        &fs_info->block_group_cache_tree);
        RB_CLEAR_NODE(&block_group->cache_node);
        /* Once for the block groups rbtree */
        btrfs_put_block_group(block_group);
 
-       spin_unlock(&fs_info->block_group_cache_lock);
+       write_unlock(&fs_info->block_group_cache_lock);
 
        down_write(&block_group->space_info->groups_sem);
        /*
        if (block_group->cached == BTRFS_CACHE_STARTED)
                btrfs_wait_block_group_cache_done(block_group);
        if (block_group->has_caching_ctl) {
-               spin_lock(&fs_info->block_group_cache_lock);
+               write_lock(&fs_info->block_group_cache_lock);
                if (!caching_ctl) {
                        struct btrfs_caching_control *ctl;
 
                }
                if (caching_ctl)
                        list_del_init(&caching_ctl->list);
-               spin_unlock(&fs_info->block_group_cache_lock);
+               write_unlock(&fs_info->block_group_cache_lock);
                if (caching_ctl) {
                        /* Once for the caching bgs list and once for us. */
                        btrfs_put_caching_control(caching_ctl);
        struct btrfs_caching_control *caching_ctl;
        struct rb_node *n;
 
-       spin_lock(&info->block_group_cache_lock);
+       write_lock(&info->block_group_cache_lock);
        while (!list_empty(&info->caching_block_groups)) {
                caching_ctl = list_entry(info->caching_block_groups.next,
                                         struct btrfs_caching_control, list);
                list_del(&caching_ctl->list);
                btrfs_put_caching_control(caching_ctl);
        }
-       spin_unlock(&info->block_group_cache_lock);
+       write_unlock(&info->block_group_cache_lock);
 
        spin_lock(&info->unused_bgs_lock);
        while (!list_empty(&info->unused_bgs)) {
        }
        spin_unlock(&info->zone_active_bgs_lock);
 
-       spin_lock(&info->block_group_cache_lock);
+       write_lock(&info->block_group_cache_lock);
        while ((n = rb_last(&info->block_group_cache_tree.rb_root)) != NULL) {
                block_group = rb_entry(n, struct btrfs_block_group,
                                       cache_node);
                rb_erase_cached(&block_group->cache_node,
                                &info->block_group_cache_tree);
                RB_CLEAR_NODE(&block_group->cache_node);
-               spin_unlock(&info->block_group_cache_lock);
+               write_unlock(&info->block_group_cache_lock);
 
                down_write(&block_group->space_info->groups_sem);
                list_del(&block_group->list);
                ASSERT(block_group->swap_extents == 0);
                btrfs_put_block_group(block_group);
 
-               spin_lock(&info->block_group_cache_lock);
+               write_lock(&info->block_group_cache_lock);
        }
-       spin_unlock(&info->block_group_cache_lock);
+       write_unlock(&info->block_group_cache_lock);
 
        btrfs_release_global_block_rsv(info);