{
unsigned long range_max, range_min;
- if (unlikely(!mas_searchable(mas)))
+ if (unlikely(!mas_searchable(mas) || mas_is_start(mas)))
return 0;
if (likely(!mte_dead_node(mas->node)))
static inline bool mas_search_cont(struct ma_state *mas, unsigned long index,
unsigned long max, void *entry)
{
- if (index >= max)
+ if (index > max)
+ return false;
+
+ if (mas_is_start(mas))
+ return true;
+
+ if (index == max)
return false;
if (!mas_searchable(mas))
if (mas_is_err(mas))
return false;
- if (mas_is_start(mas))
- return true;
-
if (entry)
return false;
{
void *entry = NULL;
bool first = false;
+ unsigned long index = mas->index;
- if (mas_is_start(mas))
+ if (mas_is_start(mas) && (mas->index <= max))
first = true;
retry:
- while (mas_search_cont(mas, mas->index, max, entry)) {
+ while (mas_search_cont(mas, mas->index, max, entry))
entry = _mas_next(mas, max);
- if (unlikely(mas_dead_node(mas, mas->index))) {
- if (first)
- mas->node = MAS_START;
+ if (unlikely(mas_dead_node(mas, index))) {
+ if (first)
+ mas->node = MAS_START;
- goto retry;
- }
- first = false;
+ goto retry;
}
return entry;
}
mas_unlock(&mas);
+ mas_set(&mas, 1048576);
+ mas_lock(&mas);
+ entry = mas_find(&mas, 1048576);
+ mas_unlock(&mas);
+ MT_BUG_ON(mas.tree, entry == NULL);
+
/* Find last value.
* 1. get the expected value, leveraging the existence of an end entry
* 2. delete end entry