From 4049542d4ffc92e4e12c7a7d03984afbeeff15bb Mon Sep 17 00:00:00 2001 From: David Sterba Date: Thu, 9 Feb 2017 16:16:02 +0100 Subject: [PATCH] btrfs-progs: shared: copy ulist_del from kernel Signed-off-by: David Sterba --- kernel-shared/ulist.c | 36 ++++++++++++++++++++++++++++++++++++ kernel-shared/ulist.h | 1 + 2 files changed, 37 insertions(+) diff --git a/kernel-shared/ulist.c b/kernel-shared/ulist.c index c5eca45..e25af2d 100644 --- a/kernel-shared/ulist.c +++ b/kernel-shared/ulist.c @@ -134,6 +134,15 @@ static struct ulist_node *ulist_rbtree_search(struct ulist *ulist, u64 val) return NULL; } +static void ulist_rbtree_erase(struct ulist *ulist, struct ulist_node *node) +{ + rb_erase(&node->rb_node, &ulist->root); + list_del(&node->list); + kfree(node); + BUG_ON(ulist->nnodes == 0); + ulist->nnodes--; +} + static int ulist_rbtree_insert(struct ulist *ulist, struct ulist_node *ins) { struct rb_node **p = &ulist->root.rb_node; @@ -211,6 +220,33 @@ int ulist_add_merge(struct ulist *ulist, u64 val, u64 aux, return 1; } +/* + * ulist_del - delete one node from ulist + * @ulist: ulist to remove node from + * @val: value to delete + * @aux: aux to delete + * + * The deletion will only be done when *BOTH* val and aux matches. + * Return 0 for successful delete. + * Return > 0 for not found. + */ +int ulist_del(struct ulist *ulist, u64 val, u64 aux) +{ + struct ulist_node *node; + + node = ulist_rbtree_search(ulist, val); + /* Not found */ + if (!node) + return 1; + + if (node->aux != aux) + return 1; + + /* Found and delete */ + ulist_rbtree_erase(ulist, node); + return 0; +} + /** * ulist_next - iterate ulist * @ulist: ulist to iterate diff --git a/kernel-shared/ulist.h b/kernel-shared/ulist.h index 88f5b82..aa172c5 100644 --- a/kernel-shared/ulist.h +++ b/kernel-shared/ulist.h @@ -58,6 +58,7 @@ 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, u64 *old_aux, gfp_t gfp_mask); +int ulist_del(struct ulist *ulist, u64 val, u64 aux); /* just like ulist_add_merge() but take a pointer for the aux data */ static inline int ulist_add_merge_ptr(struct ulist *ulist, u64 val, void *aux, -- 2.7.4