On Tue, Sep 08, 2020 at 11:06:44PM +0100, Matthew Wilcox wrote: > On Fri, Sep 04, 2020 at 10:23:53AM -0700, akpm@xxxxxxxxxxxxxxxxxxxx wrote: > > From: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > > Subject: xarray-add-xas_split-fix > > Can I ask you to add another -fix patch? ... updated to also fix the documentation. Thanks, Mauro. commit 71c3da6f580dc6ce98143d92da768c85638d4518 Author: Matthew Wilcox (Oracle) <willy@xxxxxxxxxxxxx> Date: Tue Sep 8 17:55:22 2020 -0400 fix xarray split diff --git a/lib/test_xarray.c b/lib/test_xarray.c index 16fe5adcac62..8262c3f05a5d 100644 --- a/lib/test_xarray.c +++ b/lib/test_xarray.c @@ -1524,6 +1524,9 @@ static void check_split_1(struct xarray *xa, unsigned long index, } XA_BUG_ON(xa, i != 1 << order); + xa_set_mark(xa, index, XA_MARK_0); + XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0)); + xa_destroy(xa); } diff --git a/lib/xarray.c b/lib/xarray.c index ff3652657bd8..b573db455c43 100644 --- a/lib/xarray.c +++ b/lib/xarray.c @@ -973,10 +973,11 @@ static void node_set_marks(struct xa_node *node, unsigned int offset, xa_mark_t mark = XA_MARK_0; for (;;) { - if (marks & (1 << (__force unsigned int)mark)) + if (marks & (1 << (__force unsigned int)mark)) { node_set_mark(node, offset, mark); - if (child) - node_mark_all(child, mark); + if (child) + node_mark_all(child, mark); + } if (mark == XA_MARK_MAX) break; mark_inc(mark); @@ -984,8 +985,18 @@ static void node_set_marks(struct xa_node *node, unsigned int offset, } /** - * Allocate memory for splitting an entry of @order size into the order - * stored in the @xas. + * xas_split_alloc() - Allocate memory for splitting an entry. + * @xas: XArray operation state. + * @entry: New entry which will be stored in the array. + * @order: New entry order. + * @gfp: Memory allocation flags. + * + * This function should be called before calling xas_split(). + * If necessary, it will allocate new nodes (and fill them with @entry) + * to prepare for the upcoming split of an entry of @order size into + * entries of the order stored in the @xas. + * + * Context: May sleep if @gfp flags permit. */ void xas_split_alloc(struct xa_state *xas, void *entry, unsigned int order, gfp_t gfp)