unsigned long limit, unsigned long *r_start)
{
unsigned long max;
- unsigned long range_start;
- unsigned char offset;
unsigned long *pivots;
struct maple_node *mn;
void __rcu **slots;
enum maple_type mt;
void *entry = NULL;
- range_start = mas->min;
+ *r_start = mas->min;
max = mas->max;
-restart:
+ mas->offset = 0;
while (likely(!mte_is_leaf(mas->node))) {
mn = mas_mn(mas);
mt = mte_node_type(mas->node);
pivots = ma_pivots(mn, mt);
max = pivots[0];
mas->node = mas_slot(mas, slots, 0);
- if (unlikely(mas_dead_node(mas, range_start)))
- goto restart;
+ if (unlikely(mte_dead_node(mas->node)))
+ return NULL;
}
mas->max = max;
mt = mte_node_type(mas->node);
slots = ma_slots(mn, mt);
/* 0 or 1 must be set */
- offset = 0;
- if (range_start > limit)
+ if (*r_start > limit)
goto none;
- entry = mas_slot(mas, slots, offset);
+ entry = mas_slot(mas, slots, mas->offset);
if(likely(entry))
- goto done;
+ return entry;
pivots = ma_pivots(mn, mt);
- range_start = pivots[0] + 1;
+ *r_start = pivots[0] + 1;
+ mas->offset++;
- if (range_start > limit)
+ if (*r_start > limit)
goto none;
- entry = mas_slot(mas, slots, offset);
+ entry = mas_slot(mas, slots, mas->offset);
if(likely(entry))
- goto done;
+ return entry;
none:
mas->node = MAS_NONE;
-done:
- mas->offset = offset;
- *r_start = range_start;
- return entry;
+ return NULL;
}
/*