Linux XFS filesystem development
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Christoph Hellwig <hch@lst.de>
Cc: Andrey Albershteyn <aalbersh@kernel.org>, linux-xfs@vger.kernel.org
Subject: Re: [PATCH 31/32] repair: support RT data checksums
Date: Fri, 25 Sep 2026 16:54:35 -0700	[thread overview]
Message-ID: <20260925235435.GR2705364@frogsfrogsfrogs> (raw)
In-Reply-To: <20260924100512.2733748-32-hch@lst.de>

On Thu, Sep 24, 2026 at 12:04:21PM +0200, Christoph Hellwig wrote:
> Recognize the rtcsum per-RTG metadir files, and sanity check a few
> well known attributes for them.
> 
> If a csum file is missing, or had to be nuke, regenerate it by

                             or had to be nuked,

> re-calculating the checksums.  While this does lose the protection
> of the checksums, this is probably still better than an unmountable
> file system.
> 
> Note that due to the lack of the regular buffer readahead path,
> reading the data and csum buffers for regenerating the csum file
> is fully synchronous and thus slow.  Hopefully we can come up with
> a better version for online repair and never have to use this for
> real.
> 
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---
>  repair/Makefile |   1 +
>  repair/dinode.c |  46 ++++++++++++++
>  repair/phase6.c | 122 +++++++++++++++++++++++++++++++++++-
>  repair/rt.c     |  36 +++++++++++
>  repair/rt.h     |  10 +++
>  repair/rtcsum.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 375 insertions(+), 1 deletion(-)
>  create mode 100644 repair/rtcsum.c
> 
> diff --git a/repair/Makefile b/repair/Makefile
> index fb0b2f96cc91..27eb68e2b5d5 100644
> --- a/repair/Makefile
> +++ b/repair/Makefile
> @@ -73,6 +73,7 @@ CFILES = \
>  	rcbag.c \
>  	rmap.c \
>  	rt.c \
> +	rtcsum.c \
>  	rtrefcount_repair.c \
>  	rtrmap_repair.c \
>  	sb.c \
> diff --git a/repair/dinode.c b/repair/dinode.c
> index 48939f8bd159..5c03c5f50689 100644
> --- a/repair/dinode.c
> +++ b/repair/dinode.c
> @@ -22,6 +22,8 @@
>  #include "rmap.h"
>  #include "bmap_repair.h"
>  #include "rt.h"
> +#include "libfrog/crc64.h"
> +#include "xfs_rtcsumfile.h"
>  
>  /* inode types */
>  enum xr_ino_type {
> @@ -41,6 +43,7 @@ enum xr_ino_type {
>  	XR_INO_PQUOTA,		/* project quota inode */
>  	XR_INO_RTRMAP,		/* realtime rmap */
>  	XR_INO_RTREFC,		/* realtime refcount */
> +	XR_INO_RTCSUM,		/* realtime data checksum */
>  	XR_INO_MAX
>  };
>  
> @@ -61,6 +64,7 @@ static const char *xr_ino_type_name[] = {
>  	[XR_INO_PQUOTA]		= N_("project quota"),
>  	[XR_INO_RTRMAP]		= N_("realtime rmap"),
>  	[XR_INO_RTREFC]		= N_("realtime refcount"),
> +	[XR_INO_RTCSUM]		= N_("realtime data checksum"),
>  };
>  static_assert(ARRAY_SIZE(xr_ino_type_name) == XR_INO_MAX);
>  
> @@ -2064,6 +2068,43 @@ _("bad # of extents (%" PRIu64 ") for %s inode %" PRIu64 "\n"),
>  	return 0;
>  }
>  
> +static int
> +process_check_rtcsum_inode(
> +	struct xfs_mount	*mp,
> +	struct xfs_dinode	*dinoc,
> +	xfs_ino_t		lino,
> +	enum xr_ino_type	*type,
> +	int			*dirty)
> +{
> +	xfs_fsize_t		size = be64_to_cpu(dinoc->di_size);
> +	xfs_fsize_t		expected_size;
> +	int			error;
> +
> +	error = process_check_rt_inode(mp, dinoc, lino, type, dirty,
> +				XR_INO_RTCSUM, _("realtime data checksums"));
> +	if (error)
> +		return error;
> +
> +	/* rtcsum inodes must be contiguous */
> +	if (xfs_dfork_data_extents(dinoc) != 1) {
> +		do_warn(
> +_("non-contiguous rtcsum inode %" PRIu64 "\n"), lino);
> +		return 1;
> +	}
> +
> +	expected_size = (xfs_off_t)mp->m_sb.sb_rgextents << mp->m_rtcsum_shift;
> +	expected_size = (expected_size + xfs_rtcsum_payload_size(mp) - 1) /
> +		xfs_rtcsum_payload_size(mp) * mp->m_rtcsum_bsize;

round_up()?

> +	if (size != expected_size) {
> +		do_warn(
> +_("unexpected rtcsum file size (%" PRId64 ") for ino %" PRIu64 "\n"),
> +			size, lino);
> +		return 1;
> +	}
> +
> +	return 0;
> +}
> +
>  /*
>   * If inode is a superblock inode, does type check to make sure is it valid.
>   * Returns 0 if it's valid, non-zero if it needs to be cleared.
> @@ -2130,6 +2171,8 @@ process_check_metadata_inodes(
>  	if (is_rtrefcount_inode(lino))
>  		return process_check_rt_inode(mp, dinoc, lino, type, dirty,
>  				XR_INO_RTREFC, _("realtime refcount btree"));
> +	if (is_rtcsum_inode(lino))
> +		return process_check_rtcsum_inode(mp, dinoc, lino, type, dirty);
>  	return 0;
>  }
>  
> @@ -2977,6 +3020,7 @@ process_dinode_metafile(
>  	case XR_INO_UQUOTA:
>  	case XR_INO_GQUOTA:
>  	case XR_INO_PQUOTA:
> +	case XR_INO_RTCSUM:
>  		/*
>  		 * Quota checking and repair doesn't happen until phase7, so
>  		 * preserve quota inodes and their contents for later.
> @@ -3555,6 +3599,8 @@ _("bad (negative) size %" PRId64 " on inode %" PRIu64 "\n"),
>  			type = XR_INO_RTRMAP;
>  		else if (is_rtrefcount_inode(lino))
>  			type = XR_INO_RTREFC;
> +		else if (is_rtcsum_inode(lino))
> +			type = XR_INO_RTCSUM;
>  		else
>  			type = XR_INO_DATA;
>  		break;
> diff --git a/repair/phase6.c b/repair/phase6.c
> index f3951a3d0709..c7bc1cabd0d3 100644
> --- a/repair/phase6.c
> +++ b/repair/phase6.c
> @@ -6,7 +6,6 @@
>  
>  #include "libxfs.h"
>  #include "threads.h"
> -#include "threads.h"
>  #include "prefetch.h"
>  #include "avl.h"
>  #include "globals.h"
> @@ -23,6 +22,8 @@
>  #include "repair/quotacheck.h"
>  #include "repair/slab.h"
>  #include "repair/rmap.h"
> +#include "libfrog/crc64.h"
> +#include "xfs_rtcsumfile.h"
>  
>  static xfs_ino_t		orphanage_ino;
>  
> @@ -703,6 +704,123 @@ ensure_rtgroup_refcountbt(
>  		populate_rtgroup_refcountbt(rtg, est_fdblocks);
>  }
>  
> +/*
> + * Link a metadata directory inode.
> + */
> +static int
> +metadir_link(
> +	struct xfs_inode		*dp,
> +	struct xfs_inode		*ip,
> +	const char			*path,
> +	enum xfs_metafile_type		type)
> +{
> +	struct xfs_metadir_update	upd = {
> +		.dp			= dp,
> +		.metafile_type		= type,
> +		.ip			= ip,
> +		.path			= path,
> +	};
> +	int				error;
> +
> +	error = xfs_metadir_start_link(&upd);
> +	if (error)
> +		return error;
> +
> +	error = xfs_metadir_link(&upd);
> +	if (error)
> +		return error;
> +
> +	xfs_trans_log_inode(upd.tp, upd.ip, XFS_ILOG_CORE);
> +	return xfs_metadir_commit(&upd);
> +}
> +
> +static void
> +ensure_rtgroup_csum(
> +	struct xfs_rtgroup	*rtg)
> +{
> +	struct xfs_mount	*mp = rtg_mount(rtg);
> +	xfs_rgnumber_t		rgno = rtg_rgno(rtg);
> +	struct xfs_inode	*dp = mp->m_rtdirip;
> +	struct xfs_inode	*ip;
> +	int			error;
> +
> +	if (no_modify) {
> +		if (rtcsum_ino_is_bad(rgno))
> +			do_warn(_("would reset RG %u csum inode\n"), rgno);;
> +		return;
> +	}
> +
> +	if (!rtcsum_ino_is_bad(rgno)) {
> +		/*
> +		 * The /realtime directory has been discarded, but we should be
> +		 * able to iget the inodes directly.
> +		 */
> +		error = -libxfs_metafile_iget(mp, rtcsum_ino(rgno),
> +				XFS_METAFILE_RTCSUM, &ip);
> +		if (error) {
> +			do_warn(
> +_("Could not open RG %u csum inode, error %d\n"), rgno, error);
> +			rtcsum_ino_mark_bad(rgno);
> +		}
> +	}
> +
> +	if (rtcsum_ino_is_bad(rgno)) {
> +		do_warn(_(
> +"resetting RG %u csum inode, regenerating data checksums\n"),

Nit: Inconsistent _( placement vs. the other errors.

> +			rgno);
> +		error = -libxfs_rtginode_create(rtg, XFS_RTGI_CSUM, false);
> +		if (error) {
> +			do_warn(
> +_("Couldn't create RG %u csum inode, error %d\n"), rgno, error);
> +			return;
> +		}
> +		ip = rtg->rtg_inodes[XFS_RTGI_CSUM];
> +		error = -xfs_rtcsum_alloc_blocks(rtg);

Does this need the usual -libxfsification macros?

> +		if (error) {
> +			do_warn(
> +_("Initialization of RG %u csum inode failed, error %d"), rgno, error);
> +			return;
> +		}
> +
> +		calculate_rtgroup_csums(rtg);
> +	} else {
> +		struct xfs_trans	*tp;
> +		const char		*name;
> +
> +		/* Erase parent pointers before we create the new link */
> +		try_erase_parent_ptrs(ip);
> +
> +		name = xfs_rtginode_path(rtg_rgno(rtg), XFS_RTGI_CSUM);
> +		error = -metadir_link(dp, ip, name, XFS_METAFILE_RTCSUM);
> +		kfree(name);
> +		if (error) {
> +			do_warn(
> +_("Couldn't link RG %u csum inode, error %d\n"), rgno, error);
> +			return;
> +		}
> +
> +		/*
> +		 * Reset the link count to 1 because  the link above bumped it.
> +		 */
> +		error = -libxfs_trans_alloc_inode(ip, &M_RES(mp)->tr_ichange,
> +				0, 0, false, &tp);
> +		if (!error) {
> +			set_nlink(VFS_I(ip), 1);
> +			libxfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> +			error = -libxfs_trans_commit(tp);
> +		}
> +		if (error)
> +			do_error(
> +_("Couldn't reset link count on RG %i quota inode, error %d\n"),
> +				rgno, error);
> +	}
> +
> +	/* Mark the inode in use. */
> +	mark_ino_inuse(mp, I_INO(ip), S_IFREG, I_INO(dp));
> +	mark_ino_metadata(mp, I_INO(ip));
> +	libxfs_irele(ip);
> +}
> +
>  /* Initialize a root directory. */
>  static int
>  init_fs_root_dir(
> @@ -3473,6 +3591,8 @@ _("        - resetting contents of realtime bitmap and summary inodes\n"));
>  		}
>  		ensure_rtgroup_rmapbt(rtg, est_fdblocks);
>  		ensure_rtgroup_refcountbt(rtg, est_fdblocks);
> +		if (xfs_has_rtcsum(mp))
> +			ensure_rtgroup_csum(rtg);
>  	}
>  }
>  
> diff --git a/repair/rt.c b/repair/rt.c
> index b0ff775bd339..4b64a91fbe29 100644
> --- a/repair/rt.c
> +++ b/repair/rt.c
> @@ -26,6 +26,8 @@ struct rtg_computed {
>  };
>  struct rtg_computed *rt_computed;
>  
> +static xfs_ino_t *rtcsum_inos;
> +
>  static inline void
>  set_rtword(
>  	struct xfs_mount	*mp,
> @@ -410,6 +412,27 @@ fill_rtsummary(
>  _("couldn't re-initialize realtime summary inode, error %d\n"), error);
>  }
>  
> +bool
> +rtcsum_ino_is_bad(
> +	xfs_rgnumber_t		rgno)
> +{
> +	return rtcsum_inos[rgno] == NULLFSINO;
> +}
> +
> +void
> +rtcsum_ino_mark_bad(
> +	xfs_rgnumber_t		rgno)
> +{
> +	rtcsum_inos[rgno] = NULLFSINO;
> +}
> +
> +xfs_ino_t
> +rtcsum_ino(
> +	xfs_rgnumber_t		rgno)
> +{
> +	return rtcsum_inos[rgno];
> +}
> +
>  bool
>  is_rtgroup_inode(
>  	xfs_ino_t		ino,
> @@ -471,6 +494,13 @@ mark_rtginode(
>  			goto out_corrupt;
>  	}
>  
> +	/*
> +	 * Record the inode numbers of the data checksum inodes, as we don't
> +	 * just blow those away like other per-RTG metadata.
> +	 */
> +	if (type == XFS_RTGI_CSUM)
> +		rtcsum_inos[rtg_rgno(rtg)] = I_INO(ip);
> +
>  	/*
>  	 * Phase 3 will clear the ondisk inodes of all rt metadata files, but
>  	 * it doesn't reset any blocks.  Keep the incore inodes loaded so that
> @@ -494,6 +524,12 @@ discover_rtgroup_inodes(
>  	int			error, err2;
>  	int			i;
>  
> +	rtcsum_inos = calloc(mp->m_sb.sb_rgcount, sizeof(xfs_ino_t));
> +	if (!rtcsum_inos)
> +		do_error(_("could not allocate csum ino array\n"));
> +	for (i = 0; i < mp->m_sb.sb_rgcount; i++)
> +		rtcsum_inos[i] = NULLFSINO;
> +
>  	tp = libxfs_trans_alloc_empty(mp);
>  	if (xfs_has_rtgroups(mp) && mp->m_sb.sb_rgcount > 0) {
>  		error = -libxfs_rtginode_load_parent(tp);
> diff --git a/repair/rt.h b/repair/rt.h
> index e4f3d5d9af31..9400b230de59 100644
> --- a/repair/rt.h
> +++ b/repair/rt.h
> @@ -13,6 +13,10 @@ void check_rtsummary(struct xfs_mount *mp);
>  void fill_rtbitmap(struct xfs_rtgroup *rtg);
>  void fill_rtsummary(struct xfs_rtgroup *rtg);
>  
> +bool rtcsum_ino_is_bad(xfs_rgnumber_t rgno);
> +void rtcsum_ino_mark_bad(xfs_rgnumber_t rgno);
> +xfs_ino_t rtcsum_ino(xfs_rgnumber_t rgno);
> +
>  void discover_rtgroup_inodes(struct xfs_mount *mp);
>  void unload_rtgroup_inodes(struct xfs_mount *mp);
>  
> @@ -37,6 +41,10 @@ static inline bool is_rtrefcount_inode(xfs_ino_t ino)
>  {
>  	return is_rtgroup_inode(ino, XFS_RTGI_REFCOUNT);
>  }
> +static inline bool is_rtcsum_inode(xfs_ino_t ino)
> +{
> +	return is_rtgroup_inode(ino, XFS_RTGI_CSUM);
> +}
>  
>  void mark_rtgroup_inodes_bad(struct xfs_mount *mp, enum xfs_rtg_inodes type);
>  bool rtgroup_inodes_were_bad(enum xfs_rtg_inodes type);
> @@ -44,4 +52,6 @@ bool rtgroup_inodes_were_bad(enum xfs_rtg_inodes type);
>  void check_rtsb(struct xfs_mount *mp);
>  void rewrite_rtsb(struct xfs_mount *mp);
>  
> +void calculate_rtgroup_csums(struct xfs_rtgroup *rtg);
> +
>  #endif /* _XFS_REPAIR_RT_H_ */
> diff --git a/repair/rtcsum.c b/repair/rtcsum.c
> new file mode 100644
> index 000000000000..c4d629c18e8d
> --- /dev/null
> +++ b/repair/rtcsum.c
> @@ -0,0 +1,161 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Copyright (c) 2026 Christoph Hellwig.
> + *
> + * Rebuild data checksums when the csum metafile was lost.  This doens't perform
> + * great and is inteded as a last resort.

"This doesn't perform great and is intended as..."

> + */
> +#include "libxfs.h"
> +#include "globals.h"
> +#include "protos.h"
> +#include "rt.h"
> +#include "err_protos.h"
> +#include "libfrog/crc64.h"
> +#include "xfs_platform.h"
> +#include "xfs_rtcsumfile.h"
> +
> +/* default to 1MiB data reads to make the performance only somewhat horrible. */
> +#define DATA_BLOCKS_PER_BUF	256
> +
> +static int
> +read_data(
> +	struct xfs_buftarg	*btp,
> +	xfs_daddr_t		blkno,
> +	unsigned int		nblks,
> +	void			*buf)
> +{
> +	int			fd = btp->bt_bdev_fd;
> +	off_t			pos = LIBXFS_BBTOOFF64(blkno);
> +	size_t			len = BBTOB(nblks);
> +	ssize_t			ret;
> +
> +	ret = pread(fd, buf, len, pos);
> +	if (ret < 0) {
> +		ret = errno;
> +
> +		fprintf(stderr, _("%s: read failed: %s\n"),
> +			progname, strerror(ret));
> +		return -ret;
> +	}
> +	if (ret != len) {
> +		fprintf(stderr, _("%s: error - read only %zd of %zd bytes\n"),
> +			progname, ret, len);
> +		return -EIO;
> +	}
> +
> +	return 0;
> +}
> +
> +static int
> +calculate_buf_csums(
> +	struct xfs_rtgroup	*rtg,
> +	void			*data_buf,
> +	xfs_rgblock_t		rgbno,
> +	unsigned int		*nr)
> +{
> +	struct xfs_mount	*mp = rtg_mount(rtg);
> +	unsigned int		boff = xfs_rgb_to_rtcsumoff(mp, rgbno);
> +	struct xfs_trans_res	tres = M_RES(mp)->tr_csum;
> +	xfs_daddr_t		csum_daddr;
> +	void			*csum_buf;
> +	struct xfs_buf		*csum_bp;
> +	struct xfs_trans	*tp;
> +	int			error;
> +	unsigned int		i = 0;
> +
> +	*nr = min(*nr, xfs_rtcsum_len_to_extlen(mp, mp->m_rtcsum_bsize - boff));
> +
> +	error = xfs_rtcsum_bmap(rtg, rgbno, &csum_daddr);
> +	if (error) {
> +		do_error(
> +_("Cannot bmap new csum file for RG %u, error %d\n"),
> +			rtg_rgno(rtg), error);
> +		return error;
> +	}
> +
> +	tres.tr_logres = xfs_calc_csum_reservation(mp,
> +				xfs_extlen_to_rtcsum_len(mp, *nr));
> +	ASSERT(tres.tr_logres <= M_RES(mp)->tr_csum.tr_logres);
> +
> +	error = libxfs_trans_alloc(mp, &tres, 0, 0, 0, &tp);
> +	if (error) {
> +		do_error(
> +_("Transaction allocation for csum repair failed: %d\n"),
> +			error);
> +		return error;
> +	}
> +
> +	error = libxfs_buf_read(mp->m_ddev_targp, csum_daddr,
> +			BTOBB(mp->m_rtcsum_bsize), 0, &csum_bp,
> +			&xfs_rtcsum_buf_ops);
> +	if (error) {
> +		do_error(
> +_("Cannot get buffer for new csum file for RG %u, error %d\n"),
> +			rtg_rgno(rtg), error);
> +		return error;
> +	}
> +
> +	libxfs_trans_bjoin(tp, csum_bp);
> +	xfs_trans_buf_set_type(tp, csum_bp, XFS_BLFT_RTCSUM_BUF);
> +
> +	csum_buf = csum_bp->b_addr + boff;
> +	for (i = 0; i < *nr; i++) {
> +		union xfs_csum		csum;
> +
> +		xfs_csum_seed(mp, &csum);
> +		xfs_csum_gen(mp, data_buf + XFS_FSB_TO_B(mp, i),
> +				 mp->m_sb.sb_blocksize, &csum);
> +		if (i == 0)
> +			printf("calculated checksum 0x%x\n", csum.crc32c);

Debug code?

> +		xfs_csum_finalize(mp, csum_buf, &csum);
> +		csum_buf += (1u << mp->m_rtcsum_shift);
> +	}
> +
> +	libxfs_trans_log_buf(tp, csum_bp, boff,
> +			boff + xfs_extlen_to_rtcsum_len(mp, *nr) - 1);
> +	return -libxfs_trans_commit(tp);
> +}
> +
> +void
> +calculate_rtgroup_csums(
> +	struct xfs_rtgroup	*rtg)
> +{
> +	struct xfs_mount	*mp = rtg_mount(rtg);
> +	xfs_rgblock_t		rgbno;
> +	int			error;
> +	void			*data_buf;
> +
> +	error = posix_memalign(&data_buf, sysconf(_SC_PAGESIZE),
> +			XFS_FSB_TO_B(mp, DATA_BLOCKS_PER_BUF));
> +	if (error) {
> +		do_warn(
> +_("Failed to allocate memory for csum rebuild\n"));
> +		return;
> +	}
> +	for (rgbno = 0; rgbno < rtg_blocks(rtg); rgbno += DATA_BLOCKS_PER_BUF) {
> +		unsigned int		nr_blocks, done = 0;
> +
> +		nr_blocks = min(DATA_BLOCKS_PER_BUF, rtg_blocks(rtg) - rgbno);
> +		error = read_data(mp->m_rtdev_targp,
> +				xfs_gbno_to_daddr(rtg_group(rtg), rgbno),
> +				XFS_FSB_TO_BB(mp, nr_blocks),
> +				data_buf);
> +		if (error) {
> +			do_warn(
> +_("Reading data at RG %u/%u failed, error %d"),
> +				rtg_rgno(rtg), rgbno, error);
> +			continue;

Er... so a read failure means we just leave broken checksums?

--D

> +		}
> +
> +		do {
> +			unsigned int n = nr_blocks - done;
> +
> +			calculate_buf_csums(rtg,
> +					data_buf + XFS_FSB_TO_B(mp, done),
> +					rgbno + done, &n);
> +			done += n;
> +		} while (done < nr_blocks);
> +	}
> +
> +	kfree(data_buf);
> +}
> -- 
> 2.53.0
> 
> 

  reply	other threads:[~2026-09-25 23:54 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24 10:03 xfsprogs support for RT data checksums Christoph Hellwig
2026-09-24 10:03 ` [PATCH 01/32] man: fix alignment of the rtstart field in ioctl_xfs_fsgeometry.2 Christoph Hellwig
2026-09-24 20:30   ` Darrick J. Wong
2026-09-26  6:15     ` Christoph Hellwig
2026-09-29 10:14       ` Andrey Albershteyn
2026-09-24 10:03 ` [PATCH 02/32] add cpu_to_le64 and le64_to_cpu_helpers Christoph Hellwig
2026-09-24 20:30   ` Darrick J. Wong
2026-09-24 10:03 ` [PATCH 03/32] libfrog: add a crc64_nvme implementation Christoph Hellwig
2026-09-24 10:03 ` [PATCH 04/32] libxfs: add DIV_ROUND_UP_ULL Christoph Hellwig
2026-09-24 20:44   ` Darrick J. Wong
2026-09-25  6:13     ` Christoph Hellwig
2026-09-24 10:03 ` [PATCH 05/32] libxfs: remove a spurious xfs_rtbitmap.h include in xfs_sb.c Christoph Hellwig
2026-09-25 23:27   ` Darrick J. Wong
2026-09-24 10:03 ` [PATCH 06/32] libxfs: add SZ_* constants Christoph Hellwig
2026-09-25 23:27   ` Darrick J. Wong
2026-09-24 10:03 ` [PATCH 07/32] xfs: remove spurious XBF_DONE clearing on readahead validation failure Christoph Hellwig
2026-09-24 10:03 ` [PATCH 08/32] xfs: hide b_flags manipulation from code outside of xfs_buf.c Christoph Hellwig
2026-09-24 10:03 ` [PATCH 09/32] FIXUP Christoph Hellwig
2026-09-25 23:29   ` Darrick J. Wong
2026-09-26  6:17     ` Christoph Hellwig
2026-09-24 10:04 ` [PATCH 10/32] xfs: add error injection for lazy bounce buffering Christoph Hellwig
2026-09-24 10:04 ` [PATCH 11/32] xfs: add xfs_daddr_to_rgno and xfs_daddr_to_rgbno helpers Christoph Hellwig
2026-09-24 10:04 ` [PATCH 12/32] FIXUP Christoph Hellwig
2026-09-24 10:04 ` [PATCH 13/32] xfs: introduce XFS_BLI_PREALLOC Christoph Hellwig
2026-09-24 10:04 ` [PATCH 14/32] xfs: centralize setting of buf_ops/buf_type/magic for rtblocks Christoph Hellwig
2026-09-24 10:04 ` [PATCH 15/32] xfs: factor out a xfs_rtfile_initialize_buf helper Christoph Hellwig
2026-09-24 10:04 ` [PATCH 16/32] xfs: add a xfs_rtblock_payload helper Christoph Hellwig
2026-09-24 10:04 ` [PATCH 17/32] xfs: prepare xfs_rtfile_initialize_blocks for larger than FSB blocks Christoph Hellwig
2026-09-24 10:04 ` [PATCH 18/32] FIXUP Christoph Hellwig
2026-09-24 10:04 ` [PATCH 19/32] xfs: define the RT data checksum on-disk format Christoph Hellwig
2026-09-24 10:04 ` [PATCH 20/32] FIXUP Christoph Hellwig
2026-09-24 10:04 ` [PATCH 21/32] xfs: add support for per-RTG csum files Christoph Hellwig
2026-09-24 10:04 ` [PATCH 22/32] FIXUP Christoph Hellwig
2026-09-24 10:04 ` [PATCH 23/32] xfs: calculate the log reservation for logging data checksum buffers Christoph Hellwig
2026-09-24 10:04 ` [PATCH 24/32] xfs: report RT data checksum information via XFS_FSOP_GEOM Christoph Hellwig
2026-09-24 10:04 ` [PATCH 25/32] xfs: enable RT data checksums Christoph Hellwig
2026-09-24 10:04 ` [PATCH 26/32] man: document the rtcsum geom fields Christoph Hellwig
2026-09-25 23:31   ` Darrick J. Wong
2026-09-26  6:17     ` Christoph Hellwig
2026-09-24 10:04 ` [PATCH 27/32] libfrog: print csum geometry information Christoph Hellwig
2026-09-25 23:32   ` Darrick J. Wong
2026-09-24 10:04 ` [PATCH 28/32] xfs_io: report checksum information from fs geometry in statfs Christoph Hellwig
2026-09-25 23:33   ` Darrick J. Wong
2026-09-26  6:18     ` Christoph Hellwig
2026-09-24 10:04 ` [PATCH 29/32] mkfs: support RT data checksums Christoph Hellwig
2026-09-25 23:39   ` Darrick J. Wong
2026-09-26  6:19     ` Christoph Hellwig
2026-09-24 10:04 ` [PATCH 30/32] xfs_db: support RT data checksum Christoph Hellwig
2026-09-25 23:43   ` Darrick J. Wong
2026-09-26  6:21     ` Christoph Hellwig
2026-09-26 18:20       ` Darrick J. Wong
2026-09-24 10:04 ` [PATCH 31/32] repair: support RT data checksums Christoph Hellwig
2026-09-25 23:54   ` Darrick J. Wong [this message]
2026-09-26  6:23     ` Christoph Hellwig
2026-09-27  0:01       ` Darrick J. Wong
2026-09-24 10:04 ` [PATCH 32/32] xfs_scrub: don't merge over unused space when data checksums are enabled Christoph Hellwig
2026-09-25 23:51   ` Darrick J. Wong

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=20260925235435.GR2705364@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=aalbersh@kernel.org \
    --cc=hch@lst.de \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox