Linux XFS filesystem development
 help / color / mirror / Atom feed
From: Christoph Hellwig <hch@lst.de>
To: Andrey Albershteyn <aalbersh@kernel.org>
Cc: "Darrick J . Wong" <djwong@kernel.org>, linux-xfs@vger.kernel.org
Subject: [PATCH 31/32] repair: support RT data checksums
Date: Thu, 24 Sep 2026 12:04:21 +0200	[thread overview]
Message-ID: <20260924100512.2733748-32-hch@lst.de> (raw)
In-Reply-To: <20260924100512.2733748-1-hch@lst.de>

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
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;
+	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"),
+			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);
+		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.
+ */
+#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);
+		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;
+		}
+
+		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


  parent reply	other threads:[~2026-09-24 10:07 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 ` Christoph Hellwig [this message]
2026-09-25 23:54   ` [PATCH 31/32] repair: support RT data checksums Darrick J. Wong
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=20260924100512.2733748-32-hch@lst.de \
    --to=hch@lst.de \
    --cc=aalbersh@kernel.org \
    --cc=djwong@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox