Re: [PATCH 03/12] xfs: split out a lower-level xfs_buf_get_map helper from xfs_find_get_buf

"Darrick J. Wong" <[email protected]>
Newsgroups org.kernel.vger.linux-xfs
Message-ID <20260724164427.GQ2901224@frogsfrogsfrogs>
On Wed, Jul 15, 2026 at 04:50:56PM +0200, Christoph Hellwig wrote:
> xfs_buf_get_map is currently reused to implement xfs_buf_read_map and
> xfs_buf_readahead_map.  This causes double accounting of buf_get stat
> and leads to some ugly overload of the flags.
> 
> Split out a slightly lower-level xfs_find_get_buf helper and use that to
> implement xfs_buf_get_map, xfs_buf_read_map and xfs_buf_readahead_map.
> 
> Signed-off-by: Christoph Hellwig <[email protected]>
> ---
>  fs/xfs/xfs_buf.c | 41 +++++++++++++++++++++++++++++------------
>  1 file changed, 29 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c
> index e56d4b8b0771..2cf359b4c446 100644
> --- a/fs/xfs/xfs_buf.c
> +++ b/fs/xfs/xfs_buf.c
> @@ -514,8 +514,8 @@ xfs_buf_find_insert(
>   * cache hits, as metadata intensive workloads will see 3 orders of magnitude
>   * more hits than misses.
>   */
> -int
> -xfs_buf_get_map(
> +static int
> +xfs_find_get_buf(

I like the idea of factoring this out, but I can't tell from the names
what's the difference between xfs_find_get_buf and xfs_buf_get_map.

I might have called the inner function __xfs_buf_get or something.
Dunno, don't care to bikeshed this.

Reviewed-by: "Darrick J. Wong" <[email protected]>

--D

>  	struct xfs_buftarg	*btp,
>  	struct xfs_buf_map	*map,
>  	int			nmaps,
> @@ -552,16 +552,33 @@ xfs_buf_get_map(
>  		return error;
>  	}
>  
> +	*bpp = bp;
> +	return 0;
> +}
> +
> +int
> +xfs_buf_get_map(
> +	struct xfs_buftarg	*btp,
> +	struct xfs_buf_map	*map,
> +	int			nmaps,
> +	xfs_buf_flags_t		flags,
> +	struct xfs_buf		**bpp)
> +{
> +	int			error;
> +
> +	ASSERT(!(flags & ~(XBF_TRYLOCK | XBF_INCORE | XBF_LIVESCAN)));
> +	ASSERT(!(flags & XBF_LIVESCAN) || (flags & XBF_INCORE));
> +
>  	/*
> -	 * Clear b_error if this is a lookup from a caller that doesn't expect
> -	 * valid data to be found in the buffer.
> +	 * Zero the buffer and clear b_error as xfs_buf_get_map callers don't
> +	 * expect valid data to be found in the buffer.
>  	 */
> -	if (!(flags & XBF_READ))
> -		xfs_buf_ioerror(bp, 0);
> -
> +	error = xfs_find_get_buf(btp, map, nmaps, flags, bpp);
> +	if (error)
> +		return error;
>  	XFS_STATS_INC(btp->bt_mount, xb_get);
> -	trace_xfs_buf_get(bp, flags, _RET_IP_);
> -	*bpp = bp;
> +	trace_xfs_buf_get(*bpp, flags, _RET_IP_);
> +	xfs_buf_ioerror(*bpp, 0);
>  	return 0;
>  }
>  
> @@ -625,12 +642,12 @@ xfs_buf_read_map(
>  	struct xfs_buf		*bp;
>  	int			error;
>  
> -	ASSERT(!(flags & (XBF_WRITE | XBF_ASYNC | XBF_READ_AHEAD)));
> +	ASSERT(!(flags & ~XBF_TRYLOCK));
>  
>  	flags |= XBF_READ;
>  	*bpp = NULL;
>  
> -	error = xfs_buf_get_map(target, map, nmaps, flags, &bp);
> +	error = xfs_find_get_buf(target, map, nmaps, flags, &bp);
>  	if (error)
>  		return error;
>  
> @@ -706,7 +723,7 @@ xfs_buf_readahead_map(
>  	if (xfs_buftarg_is_mem(target))
>  		return;
>  
> -	if (xfs_buf_get_map(target, map, nmaps, flags | XBF_TRYLOCK, &bp))
> +	if (xfs_find_get_buf(target, map, nmaps, flags | XBF_TRYLOCK, &bp))
>  		return;
>  	trace_xfs_buf_readahead(bp, 0, _RET_IP_);
>  
> -- 
> 2.53.0
> 
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.