aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/radix-tree.h2
-rw-r--r--lib/radix-tree.c36
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);
155unsigned int 155unsigned int
156radix_tree_gang_lookup(struct radix_tree_root *root, void **results, 156radix_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);
158unsigned long radix_tree_next_hole(struct radix_tree_root *root,
159 unsigned long index, unsigned long max_scan);
158int radix_tree_preload(gfp_t gfp_mask); 160int radix_tree_preload(gfp_t gfp_mask);
159void radix_tree_init(void); 161void radix_tree_init(void);
160void *radix_tree_tag_set(struct radix_tree_root *root, 162void *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,
599EXPORT_SYMBOL(radix_tree_tag_get); 599EXPORT_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 */
621unsigned 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}
636EXPORT_SYMBOL(radix_tree_next_hole);
637
602static unsigned int 638static 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)