From 0a71106d1a5ead1b26d634549fc67535b882e61c Mon Sep 17 00:00:00 2001 From: "Liam R. Howlett" Date: Thu, 13 Feb 2020 10:56:17 -0500 Subject: [PATCH] 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 --- lib/maple_tree.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 20a7f0c96f9e..afc3d9673ae2 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) { -- 2.50.1