]> git.hungrycats.org Git - linux/commitdiff
[PATCH] radix_tree_delete API improvement
authorAndrew Morton <akpm@digeo.com>
Sat, 12 Apr 2003 19:54:20 +0000 (12:54 -0700)
committerJames Bottomley <jejb@raven.il.steeleye.com>
Sat, 12 Apr 2003 19:54:20 +0000 (12:54 -0700)
radix_tree_delete() currently returns 0 on success, -ENOENT if there was
nothing to delete.

But it is more useful to return the address of the deleted item on success
and NULL if there was no matching item.  It can potentially save a
lookup+delete operation.

include/linux/radix-tree.h
lib/radix-tree.c

index f4a78d52b5ceb02251bbcf844096c63c8f7207e3..c32a45fd1f0d0ba26a002e647e74ab72acf866d5 100644 (file)
@@ -43,7 +43,7 @@ do {                                  \
 
 extern int radix_tree_insert(struct radix_tree_root *, unsigned long, void *);
 extern void *radix_tree_lookup(struct radix_tree_root *, unsigned long);
-extern int radix_tree_delete(struct radix_tree_root *, unsigned long);
+extern void *radix_tree_delete(struct radix_tree_root *, unsigned long);
 extern unsigned int
 radix_tree_gang_lookup(struct radix_tree_root *root, void **results,
                        unsigned long first_index, unsigned int max_items);
index 3d0183a4127de202276d925c1b62b59e14eab3c5..cdfb8c6a97f1d540162559d4111ed1beaa4410fc 100644 (file)
@@ -349,15 +349,18 @@ EXPORT_SYMBOL(radix_tree_gang_lookup);
  *     @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.
  */
-int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
+void *radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 {
        struct radix_tree_path path[RADIX_TREE_MAX_PATH], *pathp = path;
        unsigned int height, shift;
+       void *ret = NULL;
 
        height = root->height;
        if (index > radix_tree_maxindex(height))
-               return -ENOENT;
+               goto out;
 
        shift = (height-1) * RADIX_TREE_MAP_SHIFT;
        pathp->node = NULL;
@@ -365,7 +368,7 @@ int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 
        while (height > 0) {
                if (*pathp->slot == NULL)
-                       return -ENOENT;
+                       goto out;
 
                pathp[1].node = *pathp[0].slot;
                pathp[1].slot = (struct radix_tree_node **)
@@ -375,8 +378,9 @@ int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
                height--;
        }
 
-       if (*pathp[0].slot == NULL)
-               return -ENOENT;
+       ret = *pathp[0].slot;
+       if (ret == NULL)
+               goto out;
 
        *pathp[0].slot = NULL;
        while (pathp[0].node && --pathp[0].node->count == 0) {
@@ -387,8 +391,8 @@ int radix_tree_delete(struct radix_tree_root *root, unsigned long index)
 
        if (root->rnode == NULL)
                root->height = 0;  /* Empty tree, we can reset the height */
-
-       return 0;
+out:
+       return ret;
 }
 EXPORT_SYMBOL(radix_tree_delete);