All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Carlos Maiolino <cem@kernel.org>, Jens Axboe <axboe@kernel.dk>,
	Christian Brauner <brauner@kernel.org>,
	linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH 06/21] xfs: prepare xfs_rtfile_initialize_blocks for larger than FSB blocks
Date: Thu, 24 Sep 2026 15:03:11 -0700	[thread overview]
Message-ID: <20260924220311.GH2705364@frogsfrogsfrogs> (raw)
In-Reply-To: <20260924100032.2733101-7-hch@lst.de>

On Thu, Sep 24, 2026 at 11:59:38AM +0200, Christoph Hellwig wrote:
> The upcoming RT data checksum feature will use larger than FSB blocks.
> Prepare xfs_rtfile_initialize_blocks to pass the number of FSBs per
> RT blocks, and to pass bmapi_flags to ask for contiguous allocation.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/xfs/libxfs/xfs_rtbitmap.c | 44 +++++++++++++++++++++---------------
>  fs/xfs/libxfs/xfs_rtbitmap.h |  3 ++-
>  fs/xfs/xfs_rtalloc.c         |  4 ++--
>  3 files changed, 30 insertions(+), 21 deletions(-)
> 
> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.c b/fs/xfs/libxfs/xfs_rtbitmap.c
> index 01536f4fb386..db6a22b4506a 100644
> --- a/fs/xfs/libxfs/xfs_rtbitmap.c
> +++ b/fs/xfs/libxfs/xfs_rtbitmap.c
> @@ -1346,6 +1346,7 @@ xfs_rtfile_alloc_blocks(
>  	struct xfs_inode	*ip,
>  	xfs_fileoff_t		offset_fsb,
>  	xfs_filblks_t		count_fsb,
> +	uint32_t		bmapi_flags,
>  	struct xfs_bmbt_irec	*map)
>  {
>  	struct xfs_mount	*mp = ip->i_mount;
> @@ -1367,7 +1368,7 @@ xfs_rtfile_alloc_blocks(
>  		goto out_trans_cancel;
>  
>  	error = xfs_bmapi_write(tp, ip, offset_fsb, count_fsb,
> -			XFS_BMAPI_METADATA, 0, map, &nmap);
> +			XFS_BMAPI_METADATA | bmapi_flags, 0, map, &nmap);
>  	if (error)
>  		goto out_trans_cancel;
>  
> @@ -1405,34 +1406,43 @@ xfs_rtfile_initialize_block(
>  	struct xfs_rtgroup	*rtg,
>  	enum xfs_rtg_inodes	type,
>  	xfs_fsblock_t		fsbno,
> -	void			*data)
> +	xfs_filblks_t		nblks,
> +	void			**data)
>  {
>  	struct xfs_mount	*mp = rtg_mount(rtg);
>  	struct xfs_inode	*ip = rtg->rtg_inodes[type];
> +	size_t			len = XFS_FSB_TO_B(mp, nblks);
> +	size_t			copylen = len;
> +	struct xfs_trans_res	tres = M_RES(mp)->tr_growrtzero;
>  	struct xfs_trans	*tp;
>  	struct xfs_buf		*bp;
> -	const size_t		copylen = mp->m_blockwsize << XFS_WORDLOG;
>  	int			error;
>  
> -	error = xfs_trans_alloc(mp, &M_RES(mp)->tr_growrtzero, 0, 0, 0, &tp);
> +	tres.tr_logres *= nblks;

Hmm.  Is it safe to multiply the log reservation by an arbitrary
block count?  I would think we'd want *some* guarantee that we can't
create a transaction that's larger than the log can support.

It might suffice to put in a safeguard like:

	/* Log should always be able to handle 64k of logged buffers */
	ASSERT(nblks <= XFS_B_TO_FSB(mp, SZ_64K));

> +	error = xfs_trans_alloc(mp, &tres, 0, 0, 0, &tp);
>  	if (error)
>  		return error;
>  	xfs_ilock(ip, XFS_ILOCK_EXCL);
>  	xfs_trans_ijoin(tp, ip, XFS_ILOCK_EXCL);
>  
>  	error = xfs_trans_get_buf(tp, mp->m_ddev_targp,
> -			XFS_FSB_TO_DADDR(mp, fsbno), mp->m_bsize, 0, &bp);
> +			XFS_FSB_TO_DADDR(mp, fsbno), BTOBB(len), 0, &bp);
>  	if (error) {
>  		xfs_trans_cancel(tp);
>  		return error;
>  	}
>  
> +	if (xfs_has_rtgroups(mp))
> +		copylen -= sizeof(struct xfs_rtbuf_blkinfo);

This is how we maintain copylen as the amount of non-header data to copy
out of *data, correct?  I suppose that means that the checksum file
blocks also have a header?

--D

> +
>  	xfs_rtfile_initialize_buf(rtg, type, bp, tp);
> -	if (data)
> -		memcpy(xfs_rtblock_payload(bp), data, copylen);
> -	else
> +	if (*data) {
> +		memcpy(xfs_rtblock_payload(bp), *data, copylen);
> +		*data += copylen;
> +	} else {
>  		memset(xfs_rtblock_payload(bp), 0, copylen);
> -	xfs_trans_log_buf(tp, bp, 0, mp->m_sb.sb_blocksize - 1);
> +	}
> +	xfs_trans_log_buf(tp, bp, 0, len - 1);
>  	return xfs_trans_commit(tp);
>  }
>  
> @@ -1447,33 +1457,31 @@ xfs_rtfile_initialize_blocks(
>  	enum xfs_rtg_inodes	type,
>  	xfs_fileoff_t		offset_fsb,	/* offset to start from */
>  	xfs_fileoff_t		end_fsb,	/* offset to allocate to */
> +	xfs_filblks_t		bsize,
> +	uint32_t		bmapi_flags,
>  	void			*data)		/* data to fill the blocks */
>  {
> -	struct xfs_mount	*mp = rtg_mount(rtg);
> -	const size_t		copylen = mp->m_blockwsize << XFS_WORDLOG;
> -
>  	while (offset_fsb < end_fsb) {
>  		struct xfs_bmbt_irec	map;
>  		xfs_filblks_t		i;
>  		int			error;
>  
>  		error = xfs_rtfile_alloc_blocks(rtg->rtg_inodes[type],
> -				offset_fsb, end_fsb - offset_fsb, &map);
> +				offset_fsb, end_fsb - offset_fsb, bmapi_flags,
> +				&map);
>  		if (error)
>  			return error;
>  
>  		/*
> -		 * Now we need to clear the allocated blocks.
> +		 * Now we need to clear or initialize the allocated blocks.
>  		 *
>  		 * Do this one block per transaction, to keep it simple.
>  		 */
> -		for (i = 0; i < map.br_blockcount; i++) {
> +		for (i = 0; i < map.br_blockcount; i += bsize) {
>  			error = xfs_rtfile_initialize_block(rtg, type,
> -					map.br_startblock + i, data);
> +					map.br_startblock + i, bsize, &data);
>  			if (error)
>  				return error;
> -			if (data)
> -				data += copylen;
>  		}
>  
>  		offset_fsb = map.br_startoff + map.br_blockcount;
> diff --git a/fs/xfs/libxfs/xfs_rtbitmap.h b/fs/xfs/libxfs/xfs_rtbitmap.h
> index 750d74fbf4ed..e9e3378d15aa 100644
> --- a/fs/xfs/libxfs/xfs_rtbitmap.h
> +++ b/fs/xfs/libxfs/xfs_rtbitmap.h
> @@ -410,7 +410,8 @@ void xfs_rtfile_initialize_buf(struct xfs_rtgroup *rtg,
>  		struct xfs_trans *tp);
>  int xfs_rtfile_initialize_blocks(struct xfs_rtgroup *rtg,
>  		enum xfs_rtg_inodes type, xfs_fileoff_t offset_fsb,
> -		xfs_fileoff_t end_fsb, void *data);
> +		xfs_fileoff_t end_fsb, xfs_filblks_t bsize,
> +		uint32_t bmapi_flags, void *data);
>  int xfs_rtbitmap_create(struct xfs_rtgroup *rtg, struct xfs_inode *ip,
>  		struct xfs_trans *tp, bool init);
>  int xfs_rtsummary_create(struct xfs_rtgroup *rtg, struct xfs_inode *ip,
> diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c
> index 84efe5a8fb11..78a1c066c7eb 100644
> --- a/fs/xfs/xfs_rtalloc.c
> +++ b/fs/xfs/xfs_rtalloc.c
> @@ -1191,11 +1191,11 @@ xfs_growfs_rt_alloc_blocks(
>  	}
>  
>  	error = xfs_rtfile_initialize_blocks(rtg, XFS_RTGI_BITMAP, orbmblocks,
> -			nmp->m_sb.sb_rbmblocks, NULL);
> +			nmp->m_sb.sb_rbmblocks, 1, 0, NULL);
>  	if (error)
>  		goto out_free;
>  	error = xfs_rtfile_initialize_blocks(rtg, XFS_RTGI_SUMMARY, orsumblocks,
> -			nmp->m_rsumblocks, NULL);
> +			nmp->m_rsumblocks, 1, 0, NULL);
>  out_free:
>  	kfree(nmp);
>  	return error;
> -- 
> 2.53.0
> 
> 

  reply	other threads:[~2026-09-24 22:03 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24  9:59 support for RT data checksums Christoph Hellwig
2026-09-24  9:59 ` [PATCH 01/21] block: export fs_bio_integrity_verify Christoph Hellwig
2026-09-24 20:29   ` Darrick J. Wong
2026-09-24  9:59 ` [PATCH 02/21] iomap: add support for data checksumming Christoph Hellwig
2026-09-24 21:39   ` Darrick J. Wong
2026-09-25  5:53     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 03/21] xfs: add a xfs_buf_read_async buffer cache API Christoph Hellwig
2026-09-24 21:43   ` Darrick J. Wong
2026-09-25  5:54     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 04/21] xfs: add xfs_daddr_to_rgno and xfs_daddr_to_rgbno helpers Christoph Hellwig
2026-09-24 21:44   ` Darrick J. Wong
2026-09-24  9:59 ` [PATCH 05/21] xfs: introduce XFS_BLI_PREALLOC Christoph Hellwig
2026-09-24 21:49   ` Darrick J. Wong
2026-09-25  5:57     ` Christoph Hellwig
2026-10-08 11:46   ` Anuj gupta
2026-09-24  9:59 ` [PATCH 06/21] xfs: prepare xfs_rtfile_initialize_blocks for larger than FSB blocks Christoph Hellwig
2026-09-24 22:03   ` Darrick J. Wong [this message]
2026-09-25  5:58     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 07/21] xfs: relase zi_open_zones_lock over xfs_open_zone_put on unmount Christoph Hellwig
2026-09-24  9:59 ` [PATCH 08/21] xfs: define the RT data checksum on-disk format Christoph Hellwig
2026-09-24 22:13   ` Darrick J. Wong
2026-09-25  0:04     ` Eric Biggers
2026-09-25  6:01     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 09/21] xfs: add support for per-RTG csum files Christoph Hellwig
2026-09-24 22:24   ` Darrick J. Wong
2026-09-25  6:10     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 10/21] xfs: calculate the log reservation for logging data checksum buffers Christoph Hellwig
2026-09-24 22:30   ` Darrick J. Wong
2026-09-25  6:12     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 11/21] xfs: core RT data checksum support Christoph Hellwig
2026-09-25 23:20   ` Darrick J. Wong
2026-09-26  6:13     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 12/21] xfs: data checksums require stable writes Christoph Hellwig
2026-09-25 23:21   ` Darrick J. Wong
2026-09-24  9:59 ` [PATCH 13/21] xfs: require file system block size alignment when using data checksums Christoph Hellwig
2026-09-25 23:24   ` Darrick J. Wong
2026-09-26  6:15     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 14/21] xfs: add support for reading with " Christoph Hellwig
2026-09-29  0:42   ` Darrick J. Wong
2026-10-05 12:59     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 15/21] xfs: add support for writing " Christoph Hellwig
2026-09-29  1:01   ` Darrick J. Wong
2026-10-05 13:00     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 16/21] xfs: add data checksum support to zoned garbage collection Christoph Hellwig
2026-09-29  1:06   ` Darrick J. Wong
2026-10-05 13:11     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 17/21] xfs: verify data checksums during media verification Christoph Hellwig
2026-09-29  1:19   ` Darrick J. Wong
2026-10-05 13:13     ` Christoph Hellwig
2026-09-24  9:59 ` [PATCH 18/21] xfs: don't try to verify checksums on empty zones Christoph Hellwig
2026-09-29  1:25   ` Darrick J. Wong
2026-10-05 13:14     ` Christoph Hellwig
2026-10-08 11:43   ` Anuj gupta
2026-09-24  9:59 ` [PATCH 19/21] xfs: report RT data checksum information via XFS_FSOP_GEOM Christoph Hellwig
2026-09-29  1:26   ` Darrick J. Wong
2026-09-24  9:59 ` [PATCH 20/21] xfs: add an experimental feature warning for RT data checksums Christoph Hellwig
2026-09-29  1:27   ` Darrick J. Wong
2026-09-24  9:59 ` [PATCH 21/21] xfs: enable " Christoph Hellwig
2026-09-29  1:27   ` Darrick J. Wong
2026-10-05 13:16     ` Christoph Hellwig
2026-09-24 22:52 ` support for " Dave Chinner
2026-09-25  6:27   ` Christoph Hellwig
2026-09-27 22:59     ` Dave Chinner
2026-09-28  5:24       ` Christoph Hellwig
2026-09-29 14:11         ` Dave Chinner
2026-09-30  7:11           ` Dave Chinner
2026-10-05 13:53             ` Christoph Hellwig
2026-10-06  5:31               ` Dave Chinner
2026-10-07 13:46                 ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260924220311.GH2705364@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=brauner@kernel.org \
    --cc=cem@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.