{
enum maple_type type = mte_node_type(mas->node);
unsigned long pivot = mas->min;
- unsigned long r_start = *range_start;
+ unsigned long r_start;
unsigned char offset = mas->offset;
unsigned long *pivots = ma_pivots(mas_mn(mas), type);
void **slots = ma_slots(mas_mn(mas), type);
+ r_start = mas_safe_min(mas, pivots, offset);
while (offset < mt_slots[type]) {
pivot = _mas_safe_pivot(mas, pivots, offset, type);
if (!pivot && offset)
goto no_entry;
- if (r_start > max)
+ if (r_start > max) {
+ mas->index = max;
goto no_entry;
+ }
if (r_start > mas->max)
goto no_entry;
break;
if (*range_start > limit) {
+ *range_start = limit;
+ mas->index = mas->last = limit;
mas->offset = offset;
mas->node = prev_node;
return NULL;
mt = mte_node_type(mas->node);
}
- if (mas_is_none(mas))
+ if (mas_is_none(mas)) {
+ *range_start = limit;
+ mas->last = limit;
return NULL;
+ }
entry = mas_get_slot(mas, mas->offset);
if (mas_dead_node(mas, index))
if (mas->offset == MAPLE_NODE_SLOTS)
return NULL; // Not found.
+ mas->index = range_min;
+ mas->last = range_max;
+
return mas_get_slot(mas, mas->offset);
}
*range_start = 0;
entry = mas_range_load(mas, range_start, &range_max);
mas->last = range_max;
+ mas->index = *range_start;
if (entry)
return entry;
} else if (!mas_searchable(mas))
return NULL;
- return __mas_next(mas, limit, range_start);
+ entry = __mas_next(mas, limit, range_start);
+ mas->index = *range_start;
+ return entry;
}
/*
while (mas_search_cont(mas, index, max, entry))
entry = _mas_next(mas, max, &index);
- if (entry)
- mas->index = index;
-
return entry;
}
EXPORT_SYMBOL_GPL(mas_find);