Re: [PATCH 03/17] libxfs: don't leave dangling perag references from xfs_buf

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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++;
>  	}
>  
> 



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux