diff options
author | Peng Zhang <[email protected]> | 2023-05-05 22:58:29 +0800 |
---|---|---|
committer | Andrew Morton <[email protected]> | 2023-05-17 15:24:32 -0700 |
commit | 0257d9908d38c0b1669af4bb1bc4dbca1f273fe6 (patch) | |
tree | 53296656ca5b1215afa5af91755c10b953a1594e | |
parent | ac9a78681b921877518763ba0e89202254349d1b (diff) |
maple_tree: make maple state reusable after mas_empty_area()
Make mas->min and mas->max point to a node range instead of a leaf entry
range. This allows mas to still be usable after mas_empty_area() returns.
Users would get unexpected results from other operations on the maple
state after calling the affected function.
For example, x86 MAP_32BIT mmap() acts as if there is no suitable gap when
there should be one.
Link: https://lkml.kernel.org/r/[email protected]
Fixes: 54a611b60590 ("Maple Tree: add new data structure")
Signed-off-by: Peng Zhang <[email protected]>
Reported-by: "Edgecombe, Rick P" <[email protected]>
Reported-by: Tad <[email protected]>
Reported-by: Michael Keyes <[email protected]>
Link: https://lore.kernel.org/linux-mm/[email protected]/
Link: https://lore.kernel.org/linux-mm/[email protected]/
Reviewed-by: Liam R. Howlett <[email protected]>
Tested-by: Rick Edgecombe <[email protected]>
Cc: <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
-rw-r--r-- | lib/maple_tree.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/lib/maple_tree.c b/lib/maple_tree.c index 110a36479dce..8ebc43d4cc8c 100644 --- a/lib/maple_tree.c +++ b/lib/maple_tree.c @@ -5317,15 +5317,9 @@ int mas_empty_area(struct ma_state *mas, unsigned long min, mt = mte_node_type(mas->node); pivots = ma_pivots(mas_mn(mas), mt); - if (offset) - mas->min = pivots[offset - 1] + 1; - - if (offset < mt_pivots[mt]) - mas->max = pivots[offset]; - - if (mas->index < mas->min) - mas->index = mas->min; - + min = mas_safe_min(mas, pivots, offset); + if (mas->index < min) + mas->index = min; mas->last = mas->index + size - 1; return 0; } |