diff options
-rw-r--r-- | include/linux/radix-tree.h | 2 | ||||
-rw-r--r-- | lib/radix-tree.c | 36 |
2 files changed, 38 insertions, 0 deletions
diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h index f9e77d2ee320..430e4a8c1382 100644 --- a/include/linux/radix-tree.h +++ b/include/linux/radix-tree.h | |||
@@ -155,6 +155,8 @@ void *radix_tree_delete(struct radix_tree_root *, unsigned long); | |||
155 | unsigned int | 155 | unsigned int |
156 | radix_tree_gang_lookup(struct radix_tree_root *root, void **results, | 156 | radix_tree_gang_lookup(struct radix_tree_root *root, void **results, |
157 | unsigned long first_index, unsigned int max_items); | 157 | unsigned long first_index, unsigned int max_items); |
158 | unsigned long radix_tree_next_hole(struct radix_tree_root *root, | ||
159 | unsigned long index, unsigned long max_scan); | ||
158 | int radix_tree_preload(gfp_t gfp_mask); | 160 | int radix_tree_preload(gfp_t gfp_mask); |
159 | void radix_tree_init(void); | 161 | void radix_tree_init(void); |
160 | void *radix_tree_tag_set(struct radix_tree_root *root, | 162 | void *radix_tree_tag_set(struct radix_tree_root *root, |
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 514efb200be6..7af368a4401b 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
@@ -599,6 +599,42 @@ int radix_tree_tag_get(struct radix_tree_root *root, | |||
599 | EXPORT_SYMBOL(radix_tree_tag_get); | 599 | EXPORT_SYMBOL(radix_tree_tag_get); |
600 | #endif | 600 | #endif |
601 | 601 | ||
602 | /** | ||
603 | * radix_tree_next_hole - find the next hole (not-present entry) | ||
604 | * @root: tree root | ||
605 | * @index: index key | ||
606 | * @max_scan: maximum range to search | ||
607 | * | ||
608 | * Search the set [index, min(index+max_scan-1, MAX_INDEX)] for the lowest | ||
609 | * indexed hole. | ||
610 | * | ||
611 | * Returns: the index of the hole if found, otherwise returns an index | ||
612 | * outside of the set specified (in which case 'return - index >= max_scan' | ||
613 | * will be true). | ||
614 | * | ||
615 | * radix_tree_next_hole may be called under rcu_read_lock. However, like | ||
616 | * radix_tree_gang_lookup, this will not atomically search a snapshot of the | ||
617 | * tree at a single point in time. For example, if a hole is created at index | ||
618 | * 5, then subsequently a hole is created at index 10, radix_tree_next_hole | ||
619 | * covering both indexes may return 10 if called under rcu_read_lock. | ||
620 | */ | ||
621 | unsigned long radix_tree_next_hole(struct radix_tree_root *root, | ||
622 | unsigned long index, unsigned long max_scan) | ||
623 | { | ||
624 | unsigned long i; | ||
625 | |||
626 | for (i = 0; i < max_scan; i++) { | ||
627 | if (!radix_tree_lookup(root, index)) | ||
628 | break; | ||
629 | index++; | ||
630 | if (index == 0) | ||
631 | break; | ||
632 | } | ||
633 | |||
634 | return index; | ||
635 | } | ||
636 | EXPORT_SYMBOL(radix_tree_next_hole); | ||
637 | |||
602 | static unsigned int | 638 | static unsigned int |
603 | __lookup(struct radix_tree_node *slot, void **results, unsigned long index, | 639 | __lookup(struct radix_tree_node *slot, void **results, unsigned long index, |
604 | unsigned int max_items, unsigned long *next_index) | 640 | unsigned int max_items, unsigned long *next_index) |