summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAndrew Morton <akpm@linux-foundation.org>2023-08-24 15:25:56 -0700
committerAndrew Morton <akpm@linux-foundation.org>2023-08-24 15:25:56 -0700
commitfcbc329fa39ef261ba9072c56c63563423bff798 (patch)
tree2be4883f0089822d4436a8e6a5ba9032f9a025f5 /lib
parenta644b0abbfe1d7cf775082cafdcc7b5f3c35becf (diff)
parente5548f85b4527c4c803b7eae7887c10bf8f90c97 (diff)
merge mm-hotfixes-stable into mm-stable to pick up depended-upon changes
Diffstat (limited to 'lib')
-rw-r--r--lib/maple_tree.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/lib/maple_tree.c b/lib/maple_tree.c
index ffb9d15bd815..05d5db255c39 100644
--- a/lib/maple_tree.c
+++ b/lib/maple_tree.c
@@ -4107,6 +4107,10 @@ static inline unsigned char mas_wr_new_end(struct ma_wr_state *wr_mas)
* mas_wr_append: Attempt to append
* @wr_mas: the maple write state
*
+ * This is currently unsafe in rcu mode since the end of the node may be cached
+ * by readers while the node contents may be updated which could result in
+ * inaccurate information.
+ *
* Return: True if appended, false otherwise
*/
static inline bool mas_wr_append(struct ma_wr_state *wr_mas,
@@ -4116,6 +4120,9 @@ static inline bool mas_wr_append(struct ma_wr_state *wr_mas,
struct ma_state *mas = wr_mas->mas;
unsigned char node_pivots = mt_pivots[wr_mas->type];
+ if (mt_in_rcu(mas->tree))
+ return false;
+
if (mas->offset != wr_mas->node_end)
return false;