btrfs: update btrfs_add_chunk_map() to use rb helpers
authorRoger L. Beckermeyer III <beckerlee3@gmail.com>
Tue, 17 Dec 2024 21:58:54 +0000 (08:28 +1030)
committerDavid Sterba <dsterba@suse.com>
Mon, 13 Jan 2025 13:53:18 +0000 (14:53 +0100)
Update btrfs_add_chunk_map() to use rb_find_add_cached().

Signed-off-by: Roger L. Beckermeyer III <beckerlee3@gmail.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Qu Wenruo <wqu@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/volumes.c

index d32913c51d695130f9d8b64caa0ccf31506ae470..c8b079ad1dfab3d197682abd635d35b7db35d6b9 100644 (file)
@@ -5514,33 +5514,34 @@ void btrfs_remove_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_ma
        btrfs_free_chunk_map(map);
 }
 
+static int btrfs_chunk_map_cmp(const struct rb_node *new,
+                              const struct rb_node *exist)
+{
+       const struct btrfs_chunk_map *new_map =
+               rb_entry(new, struct btrfs_chunk_map, rb_node);
+       const struct btrfs_chunk_map *exist_map =
+               rb_entry(exist, struct btrfs_chunk_map, rb_node);
+
+       if (new_map->start == exist_map->start)
+               return 0;
+       if (new_map->start < exist_map->start)
+               return -1;
+       return 1;
+}
+
 EXPORT_FOR_TESTS
 int btrfs_add_chunk_map(struct btrfs_fs_info *fs_info, struct btrfs_chunk_map *map)
 {
-       struct rb_node **p;
-       struct rb_node *parent = NULL;
-       bool leftmost = true;
+       struct rb_node *exist;
 
        write_lock(&fs_info->mapping_tree_lock);
-       p = &fs_info->mapping_tree.rb_root.rb_node;
-       while (*p) {
-               struct btrfs_chunk_map *entry;
-
-               parent = *p;
-               entry = rb_entry(parent, struct btrfs_chunk_map, rb_node);
-
-               if (map->start < entry->start) {
-                       p = &(*p)->rb_left;
-               } else if (map->start > entry->start) {
-                       p = &(*p)->rb_right;
-                       leftmost = false;
-               } else {
-                       write_unlock(&fs_info->mapping_tree_lock);
-                       return -EEXIST;
-               }
+       exist = rb_find_add_cached(&map->rb_node, &fs_info->mapping_tree,
+                                  btrfs_chunk_map_cmp);
+
+       if (exist) {
+               write_unlock(&fs_info->mapping_tree_lock);
+               return -EEXIST;
        }
-       rb_link_node(&map->rb_node, parent, p);
-       rb_insert_color_cached(&map->rb_node, &fs_info->mapping_tree, leftmost);
        chunk_map_device_set_bits(map, CHUNK_ALLOCATED);
        chunk_map_device_clear_bits(map, CHUNK_TRIMMED);
        write_unlock(&fs_info->mapping_tree_lock);