struct rb_node **p;
        struct rb_node *parent = NULL;
        struct btrfs_block_group *cache;
+       bool leftmost = true;
 
        ASSERT(block_group->length != 0);
 
        spin_lock(&info->block_group_cache_lock);
-       p = &info->block_group_cache_tree.rb_node;
+       p = &info->block_group_cache_tree.rb_root.rb_node;
 
        while (*p) {
                parent = *p;
                        p = &(*p)->rb_left;
                } else if (block_group->start > cache->start) {
                        p = &(*p)->rb_right;
+                       leftmost = false;
                } else {
                        spin_unlock(&info->block_group_cache_lock);
                        return -EEXIST;
        }
 
        rb_link_node(&block_group->cache_node, parent, p);
-       rb_insert_color(&block_group->cache_node,
-                       &info->block_group_cache_tree);
-
-       if (info->first_logical_byte > block_group->start)
-               info->first_logical_byte = block_group->start;
+       rb_insert_color_cached(&block_group->cache_node,
+                              &info->block_group_cache_tree, leftmost);
 
        spin_unlock(&info->block_group_cache_lock);
 
        u64 end, start;
 
        spin_lock(&info->block_group_cache_lock);
-       n = info->block_group_cache_tree.rb_node;
+       n = info->block_group_cache_tree.rb_root.rb_node;
 
        while (n) {
                cache = rb_entry(n, struct btrfs_block_group, cache_node);
                        break;
                }
        }
-       if (ret) {
+       if (ret)
                btrfs_get_block_group(ret);
-               if (bytenr == 0 && info->first_logical_byte > ret->start)
-                       info->first_logical_byte = ret->start;
-       }
        spin_unlock(&info->block_group_cache_lock);
 
        return ret;
                goto out;
 
        spin_lock(&fs_info->block_group_cache_lock);
-       rb_erase(&block_group->cache_node,
-                &fs_info->block_group_cache_tree);
+       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);
 
-       if (fs_info->first_logical_byte == block_group->start)
-               fs_info->first_logical_byte = (u64)-1;
        spin_unlock(&fs_info->block_group_cache_lock);
 
        down_write(&block_group->space_info->groups_sem);
        spin_unlock(&info->zone_active_bgs_lock);
 
        spin_lock(&info->block_group_cache_lock);
-       while ((n = rb_last(&info->block_group_cache_tree)) != NULL) {
+       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(&block_group->cache_node,
-                        &info->block_group_cache_tree);
+               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);
 
 
 
 static u64 first_logical_byte(struct btrfs_fs_info *fs_info)
 {
-       struct btrfs_block_group *cache;
-       u64 bytenr;
+       struct rb_node *leftmost;
+       u64 bytenr = 0;
 
        spin_lock(&fs_info->block_group_cache_lock);
-       bytenr = fs_info->first_logical_byte;
-       spin_unlock(&fs_info->block_group_cache_lock);
-
-       if (bytenr < (u64)-1)
-               return bytenr;
-
        /* Get the block group with the lowest logical start address. */
-       cache = btrfs_lookup_first_block_group(fs_info, 0);
-       if (!cache)
-               return 0;
+       leftmost = rb_first_cached(&fs_info->block_group_cache_tree);
+       if (leftmost) {
+               struct btrfs_block_group *bg;
 
-       bytenr = cache->start;
-       btrfs_put_block_group(cache);
+               bg = rb_entry(leftmost, struct btrfs_block_group, cache_node);
+               bytenr = bg->start;
+       }
+       spin_unlock(&fs_info->block_group_cache_lock);
 
        return bytenr;
 }