aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAndrew Morton <akpm@digeo.com>2003-04-12 12:54:20 -0700
committerJames Bottomley <jejb@raven.il.steeleye.com>2003-04-12 12:54:20 -0700
commited49cb094b7320b7782227afbe3d3fb7d61ecc3b (patch)
tree403d8a6d2f9d0cb05aee5bcf92d2187b35eed45e /lib
parent932fd6059adff1e59b2d2ac074f90786c33babe5 (diff)
downloadhistory-ed49cb094b7320b7782227afbe3d3fb7d61ecc3b.tar.gz
[PATCH] radix_tree_delete API improvement
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/radix-tree.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c
index 3d0183a4127de2..cdfb8c6a97f1d5 100644
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -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);