diff options
author | Andrew Morton <akpm@linux-foundation.org> | 2023-08-24 15:25:56 -0700 |
---|---|---|
committer | Andrew Morton <akpm@linux-foundation.org> | 2023-08-24 15:25:56 -0700 |
commit | fcbc329fa39ef261ba9072c56c63563423bff798 (patch) | |
tree | 2be4883f0089822d4436a8e6a5ba9032f9a025f5 /lib | |
parent | a644b0abbfe1d7cf775082cafdcc7b5f3c35becf (diff) | |
parent | e5548f85b4527c4c803b7eae7887c10bf8f90c97 (diff) |
merge mm-hotfixes-stable into mm-stable to pick up depended-upon changes
Diffstat (limited to 'lib')
-rw-r--r-- | lib/maple_tree.c | 7 |
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; |