From: Liam R. Howlett Date: Thu, 13 Feb 2020 15:56:17 +0000 (-0500) Subject: maple_tree: Fix mas_for_each retry incorrectly setting mas->last X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=6013c9e44227c4e84e2676023ff6767cf8bf237d;p=users%2Fjedix%2Flinux-maple.git maple_tree: Fix mas_for_each retry incorrectly setting mas->last 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 --- diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 20a7f0c96f9ee..afc3d9673ae2a 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -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) {