diff options
| author | Wu Fengguang <fengguang.wu@intel.com> | 2009-06-16 15:31:32 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-06-16 19:47:30 -0700 | 
| commit | dc566127dd161b6c997466a2349ac179527ea89b (patch) | |
| tree | 2973018dd4a89f0b20eaa0838eb654b6eff06f68 /lib | |
| parent | d30a11004e3411909f2448546f036a011978062e (diff) | |
| download | linux-dc566127dd161b6c997466a2349ac179527ea89b.tar.bz2 | |
radix-tree: add radix_tree_prev_hole()
The counterpart of radix_tree_next_hole(). To be used by context readahead.
Signed-off-by: Wu Fengguang <fengguang.wu@intel.com>
Cc: Vladislav Bolkhovitin <vst@vlnb.net>
Cc: Jens Axboe <jens.axboe@oracle.com>
Cc: Jeff Moyer <jmoyer@redhat.com>
Cc: Nick Piggin <nickpiggin@yahoo.com.au>
Cc: Ying Han <yinghan@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/radix-tree.c | 37 | 
1 files changed, 37 insertions, 0 deletions
| diff --git a/lib/radix-tree.c b/lib/radix-tree.c index 4bb42a0344ec..5301a52cdb4d 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c @@ -666,6 +666,43 @@ unsigned long radix_tree_next_hole(struct radix_tree_root *root,  }  EXPORT_SYMBOL(radix_tree_next_hole); +/** + *	radix_tree_prev_hole    -    find the prev hole (not-present entry) + *	@root:		tree root + *	@index:		index key + *	@max_scan:	maximum range to search + * + *	Search backwards in the range [max(index-max_scan+1, 0), index] + *	for the first hole. + * + *	Returns: the index of the hole if found, otherwise returns an index + *	outside of the set specified (in which case 'index - return >= max_scan' + *	will be true). In rare cases of wrap-around, LONG_MAX will be returned. + * + *	radix_tree_next_hole may be called under rcu_read_lock. However, like + *	radix_tree_gang_lookup, this will not atomically search a snapshot of + *	the tree at a single point in time. For example, if a hole is created + *	at index 10, then subsequently a hole is created at index 5, + *	radix_tree_prev_hole covering both indexes may return 5 if called under + *	rcu_read_lock. + */ +unsigned long radix_tree_prev_hole(struct radix_tree_root *root, +				   unsigned long index, unsigned long max_scan) +{ +	unsigned long i; + +	for (i = 0; i < max_scan; i++) { +		if (!radix_tree_lookup(root, index)) +			break; +		index--; +		if (index == LONG_MAX) +			break; +	} + +	return index; +} +EXPORT_SYMBOL(radix_tree_prev_hole); +  static unsigned int  __lookup(struct radix_tree_node *slot, void ***results, unsigned long index,  	unsigned int max_items, unsigned long *next_index) |