|
@@ -405,6 +405,29 @@ static inline unsigned long radix_tree_maxindex(unsigned int height)
|
|
|
return height_to_maxindex[height];
|
|
|
}
|
|
|
|
|
|
+static inline unsigned long node_maxindex(struct radix_tree_node *node)
|
|
|
+{
|
|
|
+ return radix_tree_maxindex(node->path & RADIX_TREE_HEIGHT_MASK);
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned radix_tree_load_root(struct radix_tree_root *root,
|
|
|
+ struct radix_tree_node **nodep, unsigned long *maxindex)
|
|
|
+{
|
|
|
+ struct radix_tree_node *node = rcu_dereference_raw(root->rnode);
|
|
|
+
|
|
|
+ *nodep = node;
|
|
|
+
|
|
|
+ if (likely(radix_tree_is_indirect_ptr(node))) {
|
|
|
+ node = indirect_to_ptr(node);
|
|
|
+ *maxindex = node_maxindex(node);
|
|
|
+ return (node->path & RADIX_TREE_HEIGHT_MASK) *
|
|
|
+ RADIX_TREE_MAP_SHIFT;
|
|
|
+ }
|
|
|
+
|
|
|
+ *maxindex = 0;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Extend a radix tree so it can store key @index.
|
|
|
*/
|