|
@@ -165,6 +165,11 @@ static inline int root_tag_get(struct radix_tree_root *root, unsigned int tag)
|
|
return (__force unsigned)root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT));
|
|
return (__force unsigned)root->gfp_mask & (1 << (tag + __GFP_BITS_SHIFT));
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static inline unsigned root_tags_get(struct radix_tree_root *root)
|
|
|
|
+{
|
|
|
|
+ return (__force unsigned)root->gfp_mask >> __GFP_BITS_SHIFT;
|
|
|
|
+}
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Returns 1 if any slot in the node has this tag set.
|
|
* Returns 1 if any slot in the node has this tag set.
|
|
* Otherwise returns 0.
|
|
* Otherwise returns 0.
|
|
@@ -604,12 +609,13 @@ int __radix_tree_insert(struct radix_tree_root *root, unsigned long index,
|
|
rcu_assign_pointer(*slot, item);
|
|
rcu_assign_pointer(*slot, item);
|
|
|
|
|
|
if (node) {
|
|
if (node) {
|
|
|
|
+ unsigned offset = get_slot_offset(node, slot);
|
|
node->count++;
|
|
node->count++;
|
|
- BUG_ON(tag_get(node, 0, index & RADIX_TREE_MAP_MASK));
|
|
|
|
- BUG_ON(tag_get(node, 1, index & RADIX_TREE_MAP_MASK));
|
|
|
|
|
|
+ BUG_ON(tag_get(node, 0, offset));
|
|
|
|
+ BUG_ON(tag_get(node, 1, offset));
|
|
|
|
+ BUG_ON(tag_get(node, 2, offset));
|
|
} else {
|
|
} else {
|
|
- BUG_ON(root_tag_get(root, 0));
|
|
|
|
- BUG_ON(root_tag_get(root, 1));
|
|
|
|
|
|
+ BUG_ON(root_tags_get(root));
|
|
}
|
|
}
|
|
|
|
|
|
return 0;
|
|
return 0;
|