diff --git a/fs/btrfs/misc.h b/fs/btrfs/misc.h index e28bca1b3de5..9cc292402696 100644 --- a/fs/btrfs/misc.h +++ b/fs/btrfs/misc.h @@ -119,28 +119,23 @@ static inline struct rb_node *rb_simple_search_first(const struct rb_root *root, return ret; } +static int rb_simple_node_bytenr_cmp(struct rb_node *new, const struct rb_node *existing) +{ + struct rb_simple_node *new_entry = rb_entry(new, struct rb_simple_node, rb_node); + struct rb_simple_node *existing_entry = rb_entry(existing, struct rb_simple_node, rb_node); + + if (new_entry->bytenr < existing_entry->bytenr) + return -1; + else if (new_entry->bytenr > existing_entry->bytenr) + return 1; + + return 0; +} + static inline struct rb_node *rb_simple_insert(struct rb_root *root, struct rb_simple_node *simple_node) { - struct rb_node **p = &root->rb_node; - struct rb_node *parent = NULL; - struct rb_simple_node *entry; - - while (*p) { - parent = *p; - entry = rb_entry(parent, struct rb_simple_node, rb_node); - - if (simple_node->bytenr < entry->bytenr) - p = &(*p)->rb_left; - else if (simple_node->bytenr > entry->bytenr) - p = &(*p)->rb_right; - else - return parent; - } - - rb_link_node(&simple_node->rb_node, parent, p); - rb_insert_color(&simple_node->rb_node, root); - return NULL; + return rb_find_add(&simple_node->rb_node, root, rb_simple_node_bytenr_cmp); } static inline bool bitmap_test_range_all_set(const unsigned long *addr,