/* * insert a new ref into the rbtree. This returns any existing refs * for the same (bytenr,parent) tuple, or NULL if the new node was properly * inserted. */ static struct btrfs_delayed_ref_node *tree_insert(struct rb_root *root, struct rb_node *node) { struct rb_node **p = &root->rb_node; struct rb_node *parent_node = NULL; struct btrfs_delayed_ref_node *entry; struct btrfs_delayed_ref_node *ins; int cmp; ins = rb_entry(node, struct btrfs_delayed_ref_node, rb_node); while (*p) { parent_node = *p; entry = rb_entry(parent_node, struct btrfs_delayed_ref_node, rb_node); cmp = comp_entry(entry, ins); if (cmp < 0) p = &(*p)->rb_left; else if (cmp > 0) p = &(*p)->rb_right; else return entry; } rb_link_node(node, parent_node, p); rb_insert_color(node, root); return NULL; }
/* * insert a new root into the tree. returns the existing root entry * if one is already there. Both root_id and ref_tree are used * as the key */ static struct rb_node *tree_insert(struct rb_root *root, u64 root_id, u64 ref_tree, struct rb_node *node) { struct rb_node ** p = &root->rb_node; struct rb_node * parent = NULL; struct root_info *entry; int comp; while(*p) { parent = *p; entry = rb_entry(parent, struct root_info, rb_node); comp = comp_entry(entry, root_id, ref_tree); if (comp < 0) p = &(*p)->rb_left; else if (comp > 0) p = &(*p)->rb_right; else return parent; } entry = rb_entry(parent, struct root_info, rb_node); rb_link_node(node, parent, p); rb_insert_color(node, root); return NULL; }
/* * find an entry based on (bytenr,parent). This returns the delayed * ref if it was able to find one, or NULL if nothing was in that spot */ static struct btrfs_delayed_ref_node *tree_search(struct rb_root *root, u64 bytenr, u64 parent, struct btrfs_delayed_ref_node **last) { struct rb_node *n = root->rb_node; struct btrfs_delayed_ref_node *entry; int cmp; while (n) { entry = rb_entry(n, struct btrfs_delayed_ref_node, rb_node); WARN_ON(!entry->in_tree); if (last) *last = entry; cmp = comp_entry(entry, bytenr, parent); if (cmp < 0) n = n->rb_left; else if (cmp > 0) n = n->rb_right; else return entry; } return NULL; }