On 1/19/22 6:21 PM, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@xxxxxxxxxx> > > When we're preparing to move a list of xfs_buf(fers) to the freelist, be > sure to detach the perag reference so that we don't leak the reference > or leave dangling pointers. Currently this has no negative effects > since we only call libxfs_bulkrelse while exiting programs, but let's > not be sloppy. > > Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> Seems fine Reviewed-by: Eric Sandeen <sandeen@xxxxxxxxxx> > --- > libxfs/rdwr.c | 23 +++++++++++++---------- > 1 file changed, 13 insertions(+), 10 deletions(-) > > > diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c > index 2a9e8c98..b43527e4 100644 > --- a/libxfs/rdwr.c > +++ b/libxfs/rdwr.c > @@ -887,11 +887,19 @@ libxfs_buf_mark_dirty( > bp->b_flags |= LIBXFS_B_DIRTY; > } > > -/* Complain about (and remember) dropping dirty buffers. */ > -static void > -libxfs_whine_dirty_buf( > +/* Prepare a buffer to be sent to the MRU list. */ > +static inline void > +libxfs_buf_prepare_mru( > struct xfs_buf *bp) > { > + if (bp->b_pag) > + xfs_perag_put(bp->b_pag); > + bp->b_pag = NULL; > + > + if (!(bp->b_flags & LIBXFS_B_DIRTY)) > + return; > + > + /* Complain about (and remember) dropping dirty buffers. */ > fprintf(stderr, _("%s: Releasing dirty buffer to free list!\n"), > progname); > > @@ -909,11 +917,7 @@ libxfs_brelse( > > if (!bp) > return; > - if (bp->b_flags & LIBXFS_B_DIRTY) > - libxfs_whine_dirty_buf(bp); > - if (bp->b_pag) > - xfs_perag_put(bp->b_pag); > - bp->b_pag = NULL; > + libxfs_buf_prepare_mru(bp); > > pthread_mutex_lock(&xfs_buf_freelist.cm_mutex); > list_add(&bp->b_node.cn_mru, &xfs_buf_freelist.cm_list); > @@ -932,8 +936,7 @@ libxfs_bulkrelse( > return 0 ; > > list_for_each_entry(bp, list, b_node.cn_mru) { > - if (bp->b_flags & LIBXFS_B_DIRTY) > - libxfs_whine_dirty_buf(bp); > + libxfs_buf_prepare_mru(bp); > count++; > } > >