diff options
Diffstat (limited to 'lib/radix-tree.c')
-rw-r--r-- | lib/radix-tree.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/radix-tree.c b/lib/radix-tree.c index fcf5d98574ce..6b79e9026e24 100644 --- a/lib/radix-tree.c +++ b/lib/radix-tree.c | |||
@@ -1019,9 +1019,13 @@ radix_tree_gang_lookup(struct radix_tree_root *root, void **results, | |||
1019 | return 0; | 1019 | return 0; |
1020 | 1020 | ||
1021 | radix_tree_for_each_slot(slot, root, &iter, first_index) { | 1021 | radix_tree_for_each_slot(slot, root, &iter, first_index) { |
1022 | results[ret] = indirect_to_ptr(rcu_dereference_raw(*slot)); | 1022 | results[ret] = rcu_dereference_raw(*slot); |
1023 | if (!results[ret]) | 1023 | if (!results[ret]) |
1024 | continue; | 1024 | continue; |
1025 | if (radix_tree_is_indirect_ptr(results[ret])) { | ||
1026 | slot = radix_tree_iter_retry(&iter); | ||
1027 | continue; | ||
1028 | } | ||
1025 | if (++ret == max_items) | 1029 | if (++ret == max_items) |
1026 | break; | 1030 | break; |
1027 | } | 1031 | } |
@@ -1098,9 +1102,13 @@ radix_tree_gang_lookup_tag(struct radix_tree_root *root, void **results, | |||
1098 | return 0; | 1102 | return 0; |
1099 | 1103 | ||
1100 | radix_tree_for_each_tagged(slot, root, &iter, first_index, tag) { | 1104 | radix_tree_for_each_tagged(slot, root, &iter, first_index, tag) { |
1101 | results[ret] = indirect_to_ptr(rcu_dereference_raw(*slot)); | 1105 | results[ret] = rcu_dereference_raw(*slot); |
1102 | if (!results[ret]) | 1106 | if (!results[ret]) |
1103 | continue; | 1107 | continue; |
1108 | if (radix_tree_is_indirect_ptr(results[ret])) { | ||
1109 | slot = radix_tree_iter_retry(&iter); | ||
1110 | continue; | ||
1111 | } | ||
1104 | if (++ret == max_items) | 1112 | if (++ret == max_items) |
1105 | break; | 1113 | break; |
1106 | } | 1114 | } |