|
@@ -281,35 +281,60 @@ int radix_tree_insert(struct radix_tree_root *root,
|
|
|
}
|
|
|
EXPORT_SYMBOL(radix_tree_insert);
|
|
|
|
|
|
-/**
|
|
|
- * radix_tree_lookup - perform lookup operation on a radix tree
|
|
|
- * @root: radix tree root
|
|
|
- * @index: index key
|
|
|
- *
|
|
|
- * Lookup the item at the position @index in the radix tree @root.
|
|
|
- */
|
|
|
-void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
|
|
|
+static inline void **__lookup_slot(struct radix_tree_root *root,
|
|
|
+ unsigned long index)
|
|
|
{
|
|
|
unsigned int height, shift;
|
|
|
- struct radix_tree_node *slot;
|
|
|
+ struct radix_tree_node **slot;
|
|
|
|
|
|
height = root->height;
|
|
|
if (index > radix_tree_maxindex(height))
|
|
|
return NULL;
|
|
|
|
|
|
shift = (height-1) * RADIX_TREE_MAP_SHIFT;
|
|
|
- slot = root->rnode;
|
|
|
+ slot = &root->rnode;
|
|
|
|
|
|
while (height > 0) {
|
|
|
- if (slot == NULL)
|
|
|
+ if (*slot == NULL)
|
|
|
return NULL;
|
|
|
|
|
|
- slot = slot->slots[(index >> shift) & RADIX_TREE_MAP_MASK];
|
|
|
+ slot = (struct radix_tree_node **)
|
|
|
+ ((*slot)->slots +
|
|
|
+ ((index >> shift) & RADIX_TREE_MAP_MASK));
|
|
|
shift -= RADIX_TREE_MAP_SHIFT;
|
|
|
height--;
|
|
|
}
|
|
|
|
|
|
- return slot;
|
|
|
+ return (void **)slot;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * radix_tree_lookup_slot - lookup a slot in a radix tree
|
|
|
+ * @root: radix tree root
|
|
|
+ * @index: index key
|
|
|
+ *
|
|
|
+ * Lookup the slot corresponding to the position @index in the radix tree
|
|
|
+ * @root. This is useful for update-if-exists operations.
|
|
|
+ */
|
|
|
+void **radix_tree_lookup_slot(struct radix_tree_root *root, unsigned long index)
|
|
|
+{
|
|
|
+ return __lookup_slot(root, index);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(radix_tree_lookup_slot);
|
|
|
+
|
|
|
+/**
|
|
|
+ * radix_tree_lookup - perform lookup operation on a radix tree
|
|
|
+ * @root: radix tree root
|
|
|
+ * @index: index key
|
|
|
+ *
|
|
|
+ * Lookup the item at the position @index in the radix tree @root.
|
|
|
+ */
|
|
|
+void *radix_tree_lookup(struct radix_tree_root *root, unsigned long index)
|
|
|
+{
|
|
|
+ void **slot;
|
|
|
+
|
|
|
+ slot = __lookup_slot(root, index);
|
|
|
+ return slot != NULL ? *slot : NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL(radix_tree_lookup);
|
|
|
|