|
@@ -1337,15 +1337,18 @@ static inline void radix_tree_shrink(struct radix_tree_root *root)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * radix_tree_delete - delete an item from a radix tree
|
|
|
+ * radix_tree_delete_item - delete an item from a radix tree
|
|
|
* @root: radix tree root
|
|
|
* @index: index key
|
|
|
+ * @item: expected item
|
|
|
*
|
|
|
- * Remove the item at @index from the radix tree rooted at @root.
|
|
|
+ * Remove @item at @index from the radix tree rooted at @root.
|
|
|
*
|
|
|
- * Returns the address of the deleted item, or NULL if it was not present.
|
|
|
+ * Returns the address of the deleted item, or NULL if it was not present
|
|
|
+ * or the entry at the given @index was not @item.
|
|
|
*/
|
|
|
-void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
|
|
|
+void *radix_tree_delete_item(struct radix_tree_root *root,
|
|
|
+ unsigned long index, void *item)
|
|
|
{
|
|
|
struct radix_tree_node *node = NULL;
|
|
|
struct radix_tree_node *slot = NULL;
|
|
@@ -1380,6 +1383,11 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
|
|
|
if (slot == NULL)
|
|
|
goto out;
|
|
|
|
|
|
+ if (item && slot != item) {
|
|
|
+ slot = NULL;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Clear all tags associated with the item to be deleted.
|
|
|
* This way of doing it would be inefficient, but seldom is any set.
|
|
@@ -1424,6 +1432,21 @@ void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
|
|
|
out:
|
|
|
return slot;
|
|
|
}
|
|
|
+EXPORT_SYMBOL(radix_tree_delete_item);
|
|
|
+
|
|
|
+/**
|
|
|
+ * radix_tree_delete - delete an item from a radix tree
|
|
|
+ * @root: radix tree root
|
|
|
+ * @index: index key
|
|
|
+ *
|
|
|
+ * Remove the item at @index from the radix tree rooted at @root.
|
|
|
+ *
|
|
|
+ * Returns the address of the deleted item, or NULL if it was not present.
|
|
|
+ */
|
|
|
+void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
|
|
|
+{
|
|
|
+ return radix_tree_delete_item(root, index, NULL);
|
|
|
+}
|
|
|
EXPORT_SYMBOL(radix_tree_delete);
|
|
|
|
|
|
/**
|