ulist
struct ulist *refs;
struct ulist *parents,
struct prelim_ref *ref, struct ulist *parents)
static void free_leaf_list(struct ulist *ulist)
while ((node = ulist_next(ulist, &uiter)))
ulist_free(ulist);
struct ulist *parents;
struct ulist *refs;
struct ulist *roots;
void (*cache_store)(u64 leaf_bytenr, const struct ulist *root_ids,
struct ulist refs;
struct ulist;
struct ulist range_changed;
struct ulist;
struct ulist *roots, struct list_head *qgroups,
static int maybe_fs_roots(struct ulist *roots)
u64 num_bytes, struct ulist *old_roots,
struct ulist *new_roots)
struct ulist *new_roots = NULL;
struct ulist *old_roots;
u64 num_bytes, struct ulist *old_roots,
struct ulist *new_roots);
static void store_backref_cache(u64 leaf_bytenr, const struct ulist *root_ids,
struct ulist *old_roots = NULL;
struct ulist *new_roots = NULL;
struct ulist *old_roots = NULL;
struct ulist *new_roots = NULL;
struct ulist *ulist = kmalloc_obj(*ulist, gfp_mask);
if (!ulist)
ulist_init(ulist);
return ulist;
void ulist_prealloc(struct ulist *ulist, gfp_t gfp_mask)
if (!ulist->prealloc)
ulist->prealloc = kzalloc_obj(*ulist->prealloc, gfp_mask);
void ulist_free(struct ulist *ulist)
if (!ulist)
ulist_release(ulist);
kfree(ulist);
static struct ulist_node *ulist_rbtree_search(struct ulist *ulist, u64 val)
node = rb_find(&val, &ulist->root, ulist_node_val_key_cmp);
static void ulist_rbtree_erase(struct ulist *ulist, struct ulist_node *node)
rb_erase(&node->rb_node, &ulist->root);
BUG_ON(ulist->nnodes == 0);
ulist->nnodes--;
static int ulist_rbtree_insert(struct ulist *ulist, struct ulist_node *ins)
node = rb_find_add(&ins->rb_node, &ulist->root, ulist_node_val_cmp);
int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask)
return ulist_add_merge(ulist, val, aux, NULL, gfp_mask);
int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux,
node = ulist_rbtree_search(ulist, val);
if (ulist->prealloc) {
node = ulist->prealloc;
ulist->prealloc = NULL;
ret = ulist_rbtree_insert(ulist, node);
list_add_tail(&node->list, &ulist->nodes);
ulist->nnodes++;
int ulist_del(struct ulist *ulist, u64 val, u64 aux)
node = ulist_rbtree_search(ulist, val);
ulist_rbtree_erase(ulist, node);
struct ulist_node *ulist_next(const struct ulist *ulist, struct ulist_iterator *uiter)
if (list_empty(&ulist->nodes))
if (uiter->cur_list && uiter->cur_list->next == &ulist->nodes)
uiter->cur_list = ulist->nodes.next;
void ulist_init(struct ulist *ulist)
INIT_LIST_HEAD(&ulist->nodes);
ulist->root = RB_ROOT;
ulist->nnodes = 0;
ulist->prealloc = NULL;
void ulist_release(struct ulist *ulist)
list_for_each_entry_safe(node, next, &ulist->nodes, list) {
kfree(ulist->prealloc);
ulist->prealloc = NULL;
ulist->root = RB_ROOT;
INIT_LIST_HEAD(&ulist->nodes);
void ulist_reinit(struct ulist *ulist)
ulist_release(ulist);
ulist_init(ulist);
struct ulist *ulist_alloc(gfp_t gfp_mask)
void ulist_init(struct ulist *ulist);
void ulist_release(struct ulist *ulist);
void ulist_reinit(struct ulist *ulist);
struct ulist *ulist_alloc(gfp_t gfp_mask);
void ulist_prealloc(struct ulist *ulist, gfp_t mask);
void ulist_free(struct ulist *ulist);
int ulist_add(struct ulist *ulist, u64 val, u64 aux, gfp_t gfp_mask);
int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux,
int ulist_del(struct ulist *ulist, u64 val, u64 aux);
static inline int ulist_add_merge_ptr(struct ulist *ulist, u64 val, void *aux,
int ret = ulist_add_merge(ulist, val, (uintptr_t)aux, &old64, gfp_mask);
return ulist_add_merge(ulist, val, (u64)aux, (u64 *)old_aux, gfp_mask);
struct ulist_node *ulist_next(const struct ulist *ulist,
struct strlist *klist = NULL, *ulist = NULL;
ulist = strlist__new(NULL, NULL);
if (!klist || !ulist) {
ret2 = probe_file__get_events(ufd, filter, ulist);
strlist__for_each_entry(ent, ulist)
ret2 = probe_file__del_strlist(ufd, ulist);
strlist__delete(ulist);