int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
 void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
 void **radix_tree_lookup_slot(struct radix_tree_root *, unsigned long);
+void *radix_tree_delete_item(struct radix_tree_root *, unsigned long, void *);
 void *radix_tree_delete(struct radix_tree_root *, unsigned long);
 unsigned int
 radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
 
 }
 
 /**
- *     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;
        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.
 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);
 
 /**