On Thu, May 27, 2021 at 08:47:16AM +1000, Dave Chinner wrote: > From: Dave Chinner <dchinner@xxxxxxxxxx> > > Only called from one place now, so merge it into > xfs_buf_alloc_pages(). Because page array allocation is dependent on > bp->b_pages being null, always ensure that when the pages array is > freed we always set bp->b_pages to null. > > Also convert the page array to use kmalloc() rather than > kmem_alloc() so we can use the gfp flags we've already calculated > for the allocation context instead of hard coding KM_NOFS semantics. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Yippeeeee Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/xfs_buf.c | 48 ++++++++++++++---------------------------------- > 1 file changed, 14 insertions(+), 34 deletions(-) > > diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c > index 8ca4add138c5..aa978111c01f 100644 > --- a/fs/xfs/xfs_buf.c > +++ b/fs/xfs/xfs_buf.c > @@ -272,31 +272,6 @@ _xfs_buf_alloc( > return 0; > } > > -/* > - * Allocate a page array capable of holding a specified number > - * of pages, and point the page buf at it. > - */ > -STATIC int > -_xfs_buf_get_pages( > - struct xfs_buf *bp, > - int page_count) > -{ > - /* Make sure that we have a page list */ > - if (bp->b_pages == NULL) { > - bp->b_page_count = page_count; > - if (page_count <= XB_PAGES) { > - bp->b_pages = bp->b_page_array; > - } else { > - bp->b_pages = kmem_alloc(sizeof(struct page *) * > - page_count, KM_NOFS); > - if (bp->b_pages == NULL) > - return -ENOMEM; > - } > - memset(bp->b_pages, 0, sizeof(struct page *) * page_count); > - } > - return 0; > -} > - > /* > * Frees b_pages if it was allocated. > */ > @@ -304,10 +279,9 @@ STATIC void > _xfs_buf_free_pages( > struct xfs_buf *bp) > { > - if (bp->b_pages != bp->b_page_array) { > + if (bp->b_pages != bp->b_page_array) > kmem_free(bp->b_pages); > - bp->b_pages = NULL; > - } > + bp->b_pages = NULL; > } > > /* > @@ -389,16 +363,22 @@ xfs_buf_alloc_pages( > long filled = 0; > int error; > > + /* Make sure that we have a page list */ > + bp->b_page_count = page_count; > + if (bp->b_page_count <= XB_PAGES) { > + bp->b_pages = bp->b_page_array; > + } else { > + bp->b_pages = kzalloc(sizeof(struct page *) * bp->b_page_count, > + gfp_mask); > + if (!bp->b_pages) > + return -ENOMEM; > + } > + bp->b_flags |= _XBF_PAGES; > + > /* Assure zeroed buffer for non-read cases. */ > if (!(flags & XBF_READ)) > gfp_mask |= __GFP_ZERO; > > - error = _xfs_buf_get_pages(bp, page_count); > - if (unlikely(error)) > - return error; > - > - bp->b_flags |= _XBF_PAGES; > - > /* > * Bulk filling of pages can take multiple calls. Not filling the entire > * array is not an allocation failure, so don't back off if we get at > -- > 2.31.1 >