|
@@ -24,21 +24,29 @@ int item_tag_get(struct radix_tree_root *root, unsigned long index, int tag)
|
|
return radix_tree_tag_get(root, index, tag);
|
|
return radix_tree_tag_get(root, index, tag);
|
|
}
|
|
}
|
|
|
|
|
|
-int __item_insert(struct radix_tree_root *root, struct item *item,
|
|
|
|
- unsigned order)
|
|
|
|
|
|
+int __item_insert(struct radix_tree_root *root, struct item *item)
|
|
{
|
|
{
|
|
- return __radix_tree_insert(root, item->index, order, item);
|
|
|
|
|
|
+ return __radix_tree_insert(root, item->index, item->order, item);
|
|
}
|
|
}
|
|
|
|
|
|
int item_insert(struct radix_tree_root *root, unsigned long index)
|
|
int item_insert(struct radix_tree_root *root, unsigned long index)
|
|
{
|
|
{
|
|
- return __item_insert(root, item_create(index), 0);
|
|
|
|
|
|
+ return __item_insert(root, item_create(index, 0));
|
|
}
|
|
}
|
|
|
|
|
|
int item_insert_order(struct radix_tree_root *root, unsigned long index,
|
|
int item_insert_order(struct radix_tree_root *root, unsigned long index,
|
|
unsigned order)
|
|
unsigned order)
|
|
{
|
|
{
|
|
- return __item_insert(root, item_create(index), order);
|
|
|
|
|
|
+ return __item_insert(root, item_create(index, order));
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void item_sanity(struct item *item, unsigned long index)
|
|
|
|
+{
|
|
|
|
+ unsigned long mask;
|
|
|
|
+ assert(!radix_tree_is_internal_node(item));
|
|
|
|
+ assert(item->order < BITS_PER_LONG);
|
|
|
|
+ mask = (1UL << item->order) - 1;
|
|
|
|
+ assert((item->index | mask) == (index | mask));
|
|
}
|
|
}
|
|
|
|
|
|
int item_delete(struct radix_tree_root *root, unsigned long index)
|
|
int item_delete(struct radix_tree_root *root, unsigned long index)
|
|
@@ -46,18 +54,19 @@ int item_delete(struct radix_tree_root *root, unsigned long index)
|
|
struct item *item = radix_tree_delete(root, index);
|
|
struct item *item = radix_tree_delete(root, index);
|
|
|
|
|
|
if (item) {
|
|
if (item) {
|
|
- assert(item->index == index);
|
|
|
|
|
|
+ item_sanity(item, index);
|
|
free(item);
|
|
free(item);
|
|
return 1;
|
|
return 1;
|
|
}
|
|
}
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
-struct item *item_create(unsigned long index)
|
|
|
|
|
|
+struct item *item_create(unsigned long index, unsigned int order)
|
|
{
|
|
{
|
|
struct item *ret = malloc(sizeof(*ret));
|
|
struct item *ret = malloc(sizeof(*ret));
|
|
|
|
|
|
ret->index = index;
|
|
ret->index = index;
|
|
|
|
+ ret->order = order;
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -66,8 +75,8 @@ void item_check_present(struct radix_tree_root *root, unsigned long index)
|
|
struct item *item;
|
|
struct item *item;
|
|
|
|
|
|
item = radix_tree_lookup(root, index);
|
|
item = radix_tree_lookup(root, index);
|
|
- assert(item != 0);
|
|
|
|
- assert(item->index == index);
|
|
|
|
|
|
+ assert(item != NULL);
|
|
|
|
+ item_sanity(item, index);
|
|
}
|
|
}
|
|
|
|
|
|
struct item *item_lookup(struct radix_tree_root *root, unsigned long index)
|
|
struct item *item_lookup(struct radix_tree_root *root, unsigned long index)
|
|
@@ -80,7 +89,7 @@ void item_check_absent(struct radix_tree_root *root, unsigned long index)
|
|
struct item *item;
|
|
struct item *item;
|
|
|
|
|
|
item = radix_tree_lookup(root, index);
|
|
item = radix_tree_lookup(root, index);
|
|
- assert(item == 0);
|
|
|
|
|
|
+ assert(item == NULL);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|