X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=lib%2Fradix-tree.c;h=434b3270ca4556eb5303021bbaeeaab8544757e6;hb=fc5ee888ab2a5396ec1f5113a4860f1aafc08ecf;hp=c8d55565fafa6b80d597e69c2a6bd096d0857e3b;hpb=66dbbd72005c5ebdd1de35ba5a41393f01df48d6;p=mirror_ubuntu-bionic-kernel.git diff --git a/lib/radix-tree.c b/lib/radix-tree.c index c8d55565fafa..434b3270ca45 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c @@ -1611,11 +1611,9 @@ static void set_iter_tags(struct radix_tree_iter *iter, static void __rcu **skip_siblings(struct radix_tree_node **nodep, void __rcu **slot, struct radix_tree_iter *iter) { - void *sib = node_to_entry(slot - 1); - while (iter->index < iter->next_index) { *nodep = rcu_dereference_raw(*slot); - if (*nodep && *nodep != sib) + if (*nodep && !is_sibling_entry(iter->node, *nodep)) return slot; slot++; iter->index = __radix_tree_iter_add(iter, 1); @@ -1630,7 +1628,7 @@ void __rcu **__radix_tree_next_slot(void __rcu **slot, struct radix_tree_iter *iter, unsigned flags) { unsigned tag = flags & RADIX_TREE_ITER_TAG_MASK; - struct radix_tree_node *node = rcu_dereference_raw(*slot); + struct radix_tree_node *node; slot = skip_siblings(&node, slot, iter); @@ -2035,10 +2033,12 @@ void *radix_tree_delete_item(struct radix_tree_root *root, unsigned long index, void *item) { struct radix_tree_node *node = NULL; - void __rcu **slot; + void __rcu **slot = NULL; void *entry; entry = __radix_tree_lookup(root, index, &node, &slot); + if (!slot) + return NULL; if (!entry && (!is_idr(root) || node_tag_get(root, node, IDR_FREE, get_slot_offset(node, slot)))) return NULL;