}
void *mas_range_load(struct ma_state *mas, unsigned long *range_min,
- unsigned long *range_max);
+ unsigned long *range_max, bool skip_retry);
/* Private
*
* _mas_next() - Finds the next entry, sets index to the start of the range.
if (!mas->node || mas_is_start(mas)) {// First run.
*range_start = 0;
mas_start(mas);
- entry = mas_range_load(mas, range_start, &range_max);
+ entry = mas_range_load(mas, range_start, &range_max, false);
+ mas->last = range_max;
}
if (entry)
*
*/
void *mas_range_load(struct ma_state *mas, unsigned long *range_min,
- unsigned long *range_max)
+ unsigned long *range_max, bool skip_retry)
{
void *entry = NULL;
if (!entry || xa_is_deleted(entry))
return NULL;
- if (xa_is_retry(entry))
+ if (skip_retry && xa_is_retry(entry))
goto retry;
return entry;
{
unsigned long range_max, range_min;
- return mas_range_load(mas, &range_min, &range_max);
+ return mas_range_load(mas, &range_min, &range_max, true);
}
static inline bool mas_rewind_node(struct ma_state *mas)
{