]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
maple_tree: Fix mas_for_each retry incorrectly setting mas->last
authorLiam R. Howlett <Liam.Howlett@Oracle.com>
Thu, 13 Feb 2020 15:56:17 +0000 (10:56 -0500)
committerLiam R. Howlett <Liam.Howlett@Oracle.com>
Fri, 30 Oct 2020 18:58:58 +0000 (14:58 -0400)
mas->last was being skipped when initially run or retry was hit.  Ensure
it is set correctly.

Also, fix retry skipping during initial load of mas_for_each.

Signed-off-by: Liam R. Howlett <Liam.Howlett@Oracle.com>
lib/maple_tree.c

index 20a7f0c96f9eeb23b7c613aeb6d6079d1fe942b2..afc3d9673ae2ade7d9af6b986bd139781108a45b 100644 (file)
@@ -3123,7 +3123,7 @@ next_node:
 }
 
 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.
@@ -3141,7 +3141,8 @@ static inline void *_mas_next(struct ma_state *mas, unsigned long limit,
        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)
@@ -4603,7 +4604,7 @@ no_gap:
  *
  */
 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;
 
@@ -4629,7 +4630,7 @@ retry:
        if (!entry || xa_is_deleted(entry))
                return NULL;
 
-       if (xa_is_retry(entry))
+       if (skip_retry && xa_is_retry(entry))
                goto retry;
 
        return entry;
@@ -4639,7 +4640,7 @@ void *mas_load(struct ma_state *mas)
 {
        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)
 {