All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org
Cc: linux-xfs@vger.kernel.org
Subject: [PATCH 35/38] xfs: online repair of the realtime rmap btree
Date: Fri, 30 Dec 2022 14:18:21 -0800	[thread overview]
Message-ID: <167243870103.715303.9270241850697635771.stgit@magnolia> (raw)
In-Reply-To: <167243869558.715303.13347105677486333748.stgit@magnolia>

From: Darrick J. Wong <djwong@kernel.org>

Repair the realtime rmap btree while mounted.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
---
 fs/xfs/Makefile                  |    1 
 fs/xfs/libxfs/xfs_rmap.c         |    2 
 fs/xfs/libxfs/xfs_rmap.h         |    2 
 fs/xfs/libxfs/xfs_rtrmap_btree.c |    2 
 fs/xfs/libxfs/xfs_rtrmap_btree.h |    3 
 fs/xfs/scrub/bmap_repair.c       |    3 
 fs/xfs/scrub/common.c            |    5 
 fs/xfs/scrub/cow_repair.c        |    2 
 fs/xfs/scrub/reap.c              |    5 
 fs/xfs/scrub/reap.h              |    2 
 fs/xfs/scrub/repair.c            |  135 +++++++
 fs/xfs/scrub/repair.h            |   13 +
 fs/xfs/scrub/rtrmap.c            |    7 
 fs/xfs/scrub/rtrmap_repair.c     |  722 ++++++++++++++++++++++++++++++++++++++
 fs/xfs/scrub/scrub.c             |    2 
 fs/xfs/scrub/trace.h             |   57 +++
 16 files changed, 954 insertions(+), 9 deletions(-)
 create mode 100644 fs/xfs/scrub/rtrmap_repair.c


diff --git a/fs/xfs/Makefile b/fs/xfs/Makefile
index 1060ea739210..17c65dce6d26 100644
--- a/fs/xfs/Makefile
+++ b/fs/xfs/Makefile
@@ -221,6 +221,7 @@ xfs-y				+= $(addprefix scrub/, \
 xfs-$(CONFIG_XFS_RT)		+= $(addprefix scrub/, \
 				   rgsuper_repair.o \
 				   rtbitmap_repair.o \
+				   rtrmap_repair.o \
 				   rtsummary_repair.o \
 				   )
 
diff --git a/fs/xfs/libxfs/xfs_rmap.c b/fs/xfs/libxfs/xfs_rmap.c
index e3bff42d003d..9c678e9fded5 100644
--- a/fs/xfs/libxfs/xfs_rmap.c
+++ b/fs/xfs/libxfs/xfs_rmap.c
@@ -264,7 +264,7 @@ xfs_rmap_check_perag_irec(
 	return NULL;
 }
 
-static inline xfs_failaddr_t
+inline xfs_failaddr_t
 xfs_rmap_check_rtgroup_irec(
 	struct xfs_rtgroup		*rtg,
 	const struct xfs_rmap_irec	*irec)
diff --git a/fs/xfs/libxfs/xfs_rmap.h b/fs/xfs/libxfs/xfs_rmap.h
index e98f37c39f2f..9d0aaa16f551 100644
--- a/fs/xfs/libxfs/xfs_rmap.h
+++ b/fs/xfs/libxfs/xfs_rmap.h
@@ -215,6 +215,8 @@ xfs_failaddr_t xfs_rmap_btrec_to_irec(const union xfs_btree_rec *rec,
 		struct xfs_rmap_irec *irec);
 xfs_failaddr_t xfs_rmap_check_perag_irec(struct xfs_perag *pag,
 		const struct xfs_rmap_irec *irec);
+xfs_failaddr_t xfs_rmap_check_rtgroup_irec(struct xfs_rtgroup *rtg,
+		const struct xfs_rmap_irec *irec);
 xfs_failaddr_t xfs_rmap_check_irec(struct xfs_btree_cur *cur,
 		const struct xfs_rmap_irec *irec);
 
diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.c b/fs/xfs/libxfs/xfs_rtrmap_btree.c
index 2d8130b4c187..418173f6f3ca 100644
--- a/fs/xfs/libxfs/xfs_rtrmap_btree.c
+++ b/fs/xfs/libxfs/xfs_rtrmap_btree.c
@@ -705,7 +705,7 @@ xfs_rtrmapbt_create_path(
 }
 
 /* Calculate the rtrmap btree size for some records. */
-static unsigned long long
+unsigned long long
 xfs_rtrmapbt_calc_size(
 	struct xfs_mount	*mp,
 	unsigned long long	len)
diff --git a/fs/xfs/libxfs/xfs_rtrmap_btree.h b/fs/xfs/libxfs/xfs_rtrmap_btree.h
index 046a60816736..1f0a6f9620e8 100644
--- a/fs/xfs/libxfs/xfs_rtrmap_btree.h
+++ b/fs/xfs/libxfs/xfs_rtrmap_btree.h
@@ -203,4 +203,7 @@ struct xfs_imeta_update;
 int xfs_rtrmapbt_create(struct xfs_trans **tpp, struct xfs_imeta_path *path,
 		struct xfs_imeta_update *ic, struct xfs_inode **ipp);
 
+unsigned long long xfs_rtrmapbt_calc_size(struct xfs_mount *mp,
+		unsigned long long len);
+
 #endif	/* __XFS_RTRMAP_BTREE_H__ */
diff --git a/fs/xfs/scrub/bmap_repair.c b/fs/xfs/scrub/bmap_repair.c
index 77d601afbcfb..b8cdcba984f3 100644
--- a/fs/xfs/scrub/bmap_repair.c
+++ b/fs/xfs/scrub/bmap_repair.c
@@ -775,7 +775,8 @@ xrep_bmap_remove_old_tree(
 
 	/* Free the old bmbt blocks if they're not in use. */
 	xfs_rmap_ino_bmbt_owner(&oinfo, sc->ip->i_ino, rb->whichfork);
-	return xrep_reap_fsblocks(sc, &rb->old_bmbt_blocks, &oinfo);
+	return xrep_reap_fsblocks(sc, &rb->old_bmbt_blocks, &oinfo,
+			XFS_AG_RESV_NONE);
 }
 
 /* Check for garbage inputs.  Returns -ECANCELED if there's nothing to do. */
diff --git a/fs/xfs/scrub/common.c b/fs/xfs/scrub/common.c
index 18763d136ef5..c2c379aae770 100644
--- a/fs/xfs/scrub/common.c
+++ b/fs/xfs/scrub/common.c
@@ -964,7 +964,10 @@ int
 xchk_setup_rt(
 	struct xfs_scrub	*sc)
 {
-	return xchk_trans_alloc(sc, 0);
+	uint			resblks;
+
+	resblks = xrep_calc_rtgroup_resblks(sc);
+	return xchk_trans_alloc(sc, resblks);
 }
 
 /* Set us up with AG headers and btree cursors. */
diff --git a/fs/xfs/scrub/cow_repair.c b/fs/xfs/scrub/cow_repair.c
index d1b5915e1703..5292171e6a2b 100644
--- a/fs/xfs/scrub/cow_repair.c
+++ b/fs/xfs/scrub/cow_repair.c
@@ -649,7 +649,7 @@ xrep_bmap_cow(
 	 * like inode metadata.
 	 */
 	error = xrep_reap_fsblocks(sc, &xc->old_cowfork_fsblocks,
-			&XFS_RMAP_OINFO_COW);
+			&XFS_RMAP_OINFO_COW, XFS_AG_RESV_NONE);
 	if (error)
 		goto out_bitmap;
 
diff --git a/fs/xfs/scrub/reap.c b/fs/xfs/scrub/reap.c
index 151afacab982..b0b29b1e139b 100644
--- a/fs/xfs/scrub/reap.c
+++ b/fs/xfs/scrub/reap.c
@@ -652,12 +652,13 @@ int
 xrep_reap_fsblocks(
 	struct xfs_scrub		*sc,
 	struct xfsb_bitmap		*bitmap,
-	const struct xfs_owner_info	*oinfo)
+	const struct xfs_owner_info	*oinfo,
+	enum xfs_ag_resv_type		type)
 {
 	struct xreap_state		rs = {
 		.sc			= sc,
 		.oinfo			= oinfo,
-		.resv			= XFS_AG_RESV_NONE,
+		.resv			= type,
 	};
 	int				error;
 
diff --git a/fs/xfs/scrub/reap.h b/fs/xfs/scrub/reap.h
index 6606b119b9ec..cfaef544f659 100644
--- a/fs/xfs/scrub/reap.h
+++ b/fs/xfs/scrub/reap.h
@@ -9,7 +9,7 @@
 int xrep_reap_agblocks(struct xfs_scrub *sc, struct xagb_bitmap *bitmap,
 		const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type);
 int xrep_reap_fsblocks(struct xfs_scrub *sc, struct xfsb_bitmap *bitmap,
-		const struct xfs_owner_info *oinfo);
+		const struct xfs_owner_info *oinfo, enum xfs_ag_resv_type type);
 int xrep_reap_ifork(struct xfs_scrub *sc, struct xfs_inode *ip, int whichfork);
 
 /* Buffer cache scan context. */
diff --git a/fs/xfs/scrub/repair.c b/fs/xfs/scrub/repair.c
index 995b60f2d41e..b76c01e9f540 100644
--- a/fs/xfs/scrub/repair.c
+++ b/fs/xfs/scrub/repair.c
@@ -38,6 +38,8 @@
 #include "xfs_rtrmap_btree.h"
 #include "xfs_rtbitmap.h"
 #include "xfs_rtgroup.h"
+#include "xfs_rtalloc.h"
+#include "xfs_imeta.h"
 #include "scrub/scrub.h"
 #include "scrub/common.h"
 #include "scrub/trace.h"
@@ -371,6 +373,39 @@ xrep_calc_ag_resblks(
 	return max(max(bnobt_sz, inobt_sz), max(rmapbt_sz, refcbt_sz));
 }
 
+#ifdef CONFIG_XFS_RT
+/*
+ * Figure out how many blocks to reserve for a rtgroup repair.  We calculate
+ * the worst case estimate for the number of blocks we'd need to rebuild one of
+ * any type of per-rtgroup btree.
+ */
+xfs_extlen_t
+xrep_calc_rtgroup_resblks(
+	struct xfs_scrub		*sc)
+{
+	struct xfs_mount		*mp = sc->mp;
+	struct xfs_scrub_metadata	*sm = sc->sm;
+	struct xfs_rtgroup		*rtg;
+	xfs_extlen_t			usedlen;
+	xfs_extlen_t			rmapbt_sz = 0;
+
+	if (!(sm->sm_flags & XFS_SCRUB_IFLAG_REPAIR))
+		return 0;
+
+	rtg = xfs_rtgroup_get(mp, sm->sm_agno);
+	usedlen = rtg->rtg_blockcount;
+	xfs_rtgroup_put(rtg);
+
+	if (xfs_has_rmapbt(mp))
+		rmapbt_sz = xfs_rtrmapbt_calc_size(mp, usedlen);
+
+	trace_xrep_calc_rtgroup_resblks_btsize(mp, sm->sm_agno, usedlen,
+			rmapbt_sz);
+
+	return rmapbt_sz;
+}
+#endif /* CONFIG_XFS_RT */
+
 /*
  * Reconstructing per-AG Btrees
  *
@@ -1354,3 +1389,103 @@ xrep_is_rtmeta_ino(
 
 	return false;
 }
+
+/* Check the sanity of a rmap record for a metadata btree inode. */
+int
+xrep_check_ino_btree_mapping(
+	struct xfs_scrub		*sc,
+	const struct xfs_rmap_irec	*rec)
+{
+	enum xbtree_recpacking		outcome;
+	int				error;
+
+	/*
+	 * Metadata btree inodes never have extended attributes, and all blocks
+	 * should have the bmbt block flag set.
+	 */
+	if ((rec->rm_flags & XFS_RMAP_ATTR_FORK) ||
+	    !(rec->rm_flags & XFS_RMAP_BMBT_BLOCK))
+		return -EFSCORRUPTED;
+
+	/* Make sure the block is within the AG. */
+	if (!xfs_verify_agbext(sc->sa.pag, rec->rm_startblock,
+				rec->rm_blockcount))
+		return -EFSCORRUPTED;
+
+	/* Make sure this isn't free space. */
+	error = xfs_alloc_has_records(sc->sa.bno_cur, rec->rm_startblock,
+			rec->rm_blockcount, &outcome);
+	if (error)
+		return error;
+	if (outcome != XBTREE_RECPACKING_EMPTY)
+		return -EFSCORRUPTED;
+
+	return 0;
+}
+
+/*
+ * Reset the block count of the inode being repaired, and adjust the dquot
+ * block usage to match.  The inode must not have an xattr fork.
+ */
+void
+xrep_inode_set_nblocks(
+	struct xfs_scrub	*sc,
+	int64_t			new_blocks)
+{
+	int64_t			delta;
+
+	delta = new_blocks - sc->ip->i_nblocks;
+	sc->ip->i_nblocks = new_blocks;
+
+	xfs_trans_log_inode(sc->tp, sc->ip, XFS_ILOG_CORE);
+	if (delta != 0)
+		xfs_trans_mod_dquot_byino(sc->tp, sc->ip, XFS_TRANS_DQ_BCOUNT,
+				delta);
+}
+
+/* Reset the block reservation for a metadata inode. */
+int
+xrep_reset_imeta_reservation(
+	struct xfs_scrub	*sc)
+{
+	struct xfs_inode	*ip = sc->ip;
+	int64_t			delta;
+	int			error;
+
+	delta = ip->i_nblocks + ip->i_delayed_blks - ip->i_meta_resv_asked;
+	if (delta == 0)
+		return 0;
+
+	if (delta > 0) {
+		int64_t		give_back;
+
+		/* Too many blocks, free from the incore reservation. */
+		give_back = min_t(uint64_t, delta, ip->i_delayed_blks);
+		if (give_back > 0) {
+			xfs_mod_delalloc(ip->i_mount, -give_back);
+			xfs_mod_fdblocks(ip->i_mount, give_back, true);
+			ip->i_delayed_blks -= give_back;
+		}
+
+		return 0;
+	}
+
+	/* Not enough reservation, try to add more.  @delta is negative here. */
+	error = xfs_mod_fdblocks(sc->mp, delta, true);
+	while (error == -ENOSPC) {
+		delta++;
+		if (delta == 0) {
+			xfs_warn(sc->mp,
+"Insufficient free space to reset space reservation for inode 0x%llx after repair.",
+					ip->i_ino);
+			return 0;
+		}
+		error = xfs_mod_fdblocks(sc->mp, delta, true);
+	}
+	if (error)
+		return error;
+
+	xfs_mod_delalloc(sc->mp, -delta);
+	ip->i_delayed_blks += -delta;
+	return 0;
+}
diff --git a/fs/xfs/scrub/repair.h b/fs/xfs/scrub/repair.h
index a0ed79506195..ff8605849a72 100644
--- a/fs/xfs/scrub/repair.h
+++ b/fs/xfs/scrub/repair.h
@@ -88,6 +88,7 @@ int xrep_setup_parent(struct xfs_scrub *sc);
 int xrep_setup_nlinks(struct xfs_scrub *sc);
 int xrep_setup_symlink(struct xfs_scrub *sc, unsigned int *resblks);
 int xrep_setup_rgbitmap(struct xfs_scrub *sc, unsigned int *resblks);
+int xrep_setup_rtrmapbt(struct xfs_scrub *sc);
 
 int xrep_xattr_reset_fork(struct xfs_scrub *sc);
 
@@ -107,12 +108,16 @@ int xrep_rtgroup_init(struct xfs_scrub *sc, struct xfs_rtgroup *rtg,
 void xrep_rtgroup_btcur_init(struct xfs_scrub *sc, struct xchk_rt *sr);
 int xrep_require_rtext_inuse(struct xfs_scrub *sc, xfs_rtblock_t rtbno,
 		xfs_filblks_t len);
+xfs_extlen_t xrep_calc_rtgroup_resblks(struct xfs_scrub *sc);
 #else
 # define xrep_rtgroup_init(sc, rtg, sr, lockflags)	(-ENOSYS)
+# define xrep_calc_rtgroup_resblks(sc)			(0)
 #endif /* CONFIG_XFS_RT */
 
 bool xrep_is_rtmeta_ino(struct xfs_scrub *sc, struct xfs_rtgroup *rtg,
 		xfs_ino_t ino);
+int xrep_check_ino_btree_mapping(struct xfs_scrub *sc,
+		const struct xfs_rmap_irec *rec);
 
 /* Metadata revalidators */
 
@@ -146,11 +151,13 @@ int xrep_rtbitmap(struct xfs_scrub *sc);
 int xrep_rtsummary(struct xfs_scrub *sc);
 int xrep_rgsuperblock(struct xfs_scrub *sc);
 int xrep_rgbitmap(struct xfs_scrub *sc);
+int xrep_rtrmapbt(struct xfs_scrub *sc);
 #else
 # define xrep_rtbitmap			xrep_notsupported
 # define xrep_rtsummary			xrep_notsupported
 # define xrep_rgsuperblock		xrep_notsupported
 # define xrep_rgbitmap			xrep_notsupported
+# define xrep_rtrmapbt			xrep_notsupported
 #endif /* CONFIG_XFS_RT */
 
 #ifdef CONFIG_XFS_QUOTA
@@ -170,6 +177,8 @@ void xrep_trans_cancel_hook_dummy(void **cookiep, struct xfs_trans *tp);
 
 bool xrep_buf_verify_struct(struct xfs_buf *bp, const struct xfs_buf_ops *ops);
 xfs_ino_t xrep_dotdot_lookup(struct xfs_scrub *sc);
+void xrep_inode_set_nblocks(struct xfs_scrub *sc, int64_t new_blocks);
+int xrep_reset_imeta_reservation(struct xfs_scrub *sc);
 
 #else
 
@@ -192,6 +201,8 @@ xrep_calc_ag_resblks(
 	return 0;
 }
 
+#define xrep_calc_rtgroup_resblks	xrep_calc_ag_resblks
+
 static inline int
 xrep_reset_perag_resv(
 	struct xfs_scrub	*sc)
@@ -217,6 +228,7 @@ xrep_setup_nothing(
 #define xrep_setup_directory		xrep_setup_nothing
 #define xrep_setup_parent		xrep_setup_nothing
 #define xrep_setup_nlinks		xrep_setup_nothing
+#define xrep_setup_rtrmapbt		xrep_setup_nothing
 
 #define xrep_setup_inode(sc, imap)	((void)0)
 
@@ -272,6 +284,7 @@ static inline int xrep_setup_rgbitmap(struct xfs_scrub *sc, unsigned int *x)
 #define xrep_symlink			xrep_notsupported
 #define xrep_rgsuperblock		xrep_notsupported
 #define xrep_rgbitmap			xrep_notsupported
+#define xrep_rtrmapbt			xrep_notsupported
 
 #endif /* CONFIG_XFS_ONLINE_REPAIR */
 
diff --git a/fs/xfs/scrub/rtrmap.c b/fs/xfs/scrub/rtrmap.c
index e9ca9670f3af..5442325a6982 100644
--- a/fs/xfs/scrub/rtrmap.c
+++ b/fs/xfs/scrub/rtrmap.c
@@ -26,6 +26,7 @@
 #include "scrub/common.h"
 #include "scrub/btree.h"
 #include "scrub/trace.h"
+#include "scrub/repair.h"
 
 /* Set us up with the realtime metadata locked. */
 int
@@ -43,6 +44,12 @@ xchk_setup_rtrmapbt(
 	if (!rtg)
 		return -ENOENT;
 
+	if (xchk_could_repair(sc)) {
+		error = xrep_setup_rtrmapbt(sc);
+		if (error)
+			return error;
+	}
+
 	error = xchk_setup_rt(sc);
 	if (error)
 		goto out_rtg;
diff --git a/fs/xfs/scrub/rtrmap_repair.c b/fs/xfs/scrub/rtrmap_repair.c
new file mode 100644
index 000000000000..d856a4e46d6f
--- /dev/null
+++ b/fs/xfs/scrub/rtrmap_repair.c
@@ -0,0 +1,722 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2022 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#include "xfs.h"
+#include "xfs_fs.h"
+#include "xfs_shared.h"
+#include "xfs_format.h"
+#include "xfs_trans_resv.h"
+#include "xfs_mount.h"
+#include "xfs_defer.h"
+#include "xfs_btree.h"
+#include "xfs_btree_staging.h"
+#include "xfs_bit.h"
+#include "xfs_log_format.h"
+#include "xfs_trans.h"
+#include "xfs_sb.h"
+#include "xfs_alloc.h"
+#include "xfs_rmap.h"
+#include "xfs_rmap_btree.h"
+#include "xfs_rtrmap_btree.h"
+#include "xfs_inode.h"
+#include "xfs_icache.h"
+#include "xfs_bmap.h"
+#include "xfs_bmap_btree.h"
+#include "xfs_quota.h"
+#include "xfs_rtalloc.h"
+#include "xfs_ag.h"
+#include "xfs_rtgroup.h"
+#include "scrub/xfs_scrub.h"
+#include "scrub/scrub.h"
+#include "scrub/common.h"
+#include "scrub/btree.h"
+#include "scrub/trace.h"
+#include "scrub/repair.h"
+#include "scrub/bitmap.h"
+#include "scrub/xfile.h"
+#include "scrub/xfarray.h"
+#include "scrub/iscan.h"
+#include "scrub/newbt.h"
+#include "scrub/reap.h"
+
+/*
+ * Realtime Reverse Mapping Btree Repair
+ * =====================================
+ *
+ * This isn't quite as difficult as repairing the rmap btree on the data
+ * device, since we only store the data fork extents of realtime files on the
+ * realtime device.  We still have to freeze the filesystem and stop the
+ * background threads like we do for the rmap repair, but we only have to scan
+ * realtime inodes.
+ *
+ * Collecting entries for the new realtime rmap btree is easy -- all we have
+ * to do is generate rtrmap entries from the data fork mappings of all realtime
+ * files in the filesystem.  We then scan the rmap btrees of the data device
+ * looking for extents belonging to the old btree and note them in a bitmap.
+ *
+ * To rebuild the realtime rmap btree, we bulk-load the collected mappings into
+ * a new btree cursor and atomically swap that into the realtime inode.  Then
+ * we can free the blocks from the old btree.
+ *
+ * We use the 'xrep_rtrmap' prefix for all the rmap functions.
+ */
+
+/* Set us up to repair rt reverse mapping btrees. */
+int
+xrep_setup_rtrmapbt(
+	struct xfs_scrub	*sc)
+{
+	/* For now this is a placeholder until we land other pieces. */
+	return 0;
+}
+
+/*
+ * Packed rmap record.  The UNWRITTEN flags are hidden in the upper bits of
+ * offset, just like the on-disk record.
+ */
+struct xrep_rtrmap_extent {
+	xfs_rgblock_t	startblock;
+	xfs_extlen_t	blockcount;
+	uint64_t	owner;
+	uint64_t	offset;
+} __packed;
+
+/* Context for collecting rmaps */
+struct xrep_rtrmap {
+	/* new rtrmapbt information */
+	struct xrep_newbt	new_btree;
+
+	/* rmap records generated from primary metadata */
+	struct xfarray		*rtrmap_records;
+
+	struct xfs_scrub	*sc;
+
+	/* bitmap of old rtrmapbt blocks */
+	struct xfsb_bitmap	old_rtrmapbt_blocks;
+
+	/* inode scan cursor */
+	struct xchk_iscan	iscan;
+
+	/* get_records()'s position in the free space record array. */
+	xfarray_idx_t		array_cur;
+};
+
+/* Make sure there's nothing funny about this mapping. */
+STATIC int
+xrep_rtrmap_check_mapping(
+	struct xfs_scrub	*sc,
+	const struct xfs_rmap_irec *rec)
+{
+	xfs_rtblock_t		rtbno;
+
+	if (xfs_rmap_check_rtgroup_irec(sc->sr.rtg, rec) != NULL)
+		return -EFSCORRUPTED;
+
+	/* Make sure this isn't free space. */
+	rtbno = xfs_rgbno_to_rtb(sc->mp, sc->sr.rtg->rtg_rgno,
+			rec->rm_startblock);
+	return xrep_require_rtext_inuse(sc, rtbno, rec->rm_blockcount);
+}
+
+/* Store a reverse-mapping record. */
+static inline int
+xrep_rtrmap_stash(
+	struct xrep_rtrmap	*rr,
+	xfs_rgblock_t		startblock,
+	xfs_extlen_t		blockcount,
+	uint64_t		owner,
+	uint64_t		offset,
+	unsigned int		flags)
+{
+	struct xrep_rtrmap_extent	rre = {
+		.startblock	= startblock,
+		.blockcount	= blockcount,
+		.owner		= owner,
+	};
+	struct xfs_rmap_irec	rmap = {
+		.rm_startblock	= startblock,
+		.rm_blockcount	= blockcount,
+		.rm_owner	= owner,
+		.rm_offset	= offset,
+		.rm_flags	= flags,
+	};
+	struct xfs_scrub	*sc = rr->sc;
+	int			error = 0;
+
+	if (xchk_should_terminate(sc, &error))
+		return error;
+
+	trace_xrep_rtrmap_found(sc->mp, &rmap);
+
+	rre.offset = xfs_rmap_irec_offset_pack(&rmap);
+	return xfarray_append(rr->rtrmap_records, &rre);
+}
+
+/* Finding all file and bmbt extents. */
+
+/* Context for accumulating rmaps for an inode fork. */
+struct xrep_rtrmap_ifork {
+	/*
+	 * Accumulate rmap data here to turn multiple adjacent bmaps into a
+	 * single rmap.
+	 */
+	struct xfs_rmap_irec	accum;
+
+	struct xrep_rtrmap	*rr;
+};
+
+/* Stash an rmap that we accumulated while walking an inode fork. */
+STATIC int
+xrep_rtrmap_stash_accumulated(
+	struct xrep_rtrmap_ifork	*rf)
+{
+	if (rf->accum.rm_blockcount == 0)
+		return 0;
+
+	return xrep_rtrmap_stash(rf->rr, rf->accum.rm_startblock,
+			rf->accum.rm_blockcount, rf->accum.rm_owner,
+			rf->accum.rm_offset, rf->accum.rm_flags);
+}
+
+/* Accumulate a bmbt record. */
+STATIC int
+xrep_rtrmap_visit_bmbt(
+	struct xfs_btree_cur	*cur,
+	struct xfs_bmbt_irec	*rec,
+	void			*priv)
+{
+	struct xrep_rtrmap_ifork *rf = priv;
+	struct xfs_rmap_irec	*accum = &rf->accum;
+	struct xfs_mount	*mp = rf->rr->sc->mp;
+	xfs_rgnumber_t		rgno;
+	xfs_rgblock_t		rgbno;
+	unsigned int		rmap_flags = 0;
+	int			error;
+
+	rgbno = xfs_rtb_to_rgbno(mp, rec->br_startblock, &rgno);
+	if (rgno != rf->rr->sc->sr.rtg->rtg_rgno)
+		return 0;
+
+	if (rec->br_state == XFS_EXT_UNWRITTEN)
+		rmap_flags |= XFS_RMAP_UNWRITTEN;
+
+	/* If this bmap is adjacent to the previous one, just add it. */
+	if (accum->rm_blockcount > 0 &&
+	    rec->br_startoff == accum->rm_offset + accum->rm_blockcount &&
+	    rgbno == accum->rm_startblock + accum->rm_blockcount &&
+	    rmap_flags == accum->rm_flags) {
+		accum->rm_blockcount += rec->br_blockcount;
+		return 0;
+	}
+
+	/* Otherwise stash the old rmap and start accumulating a new one. */
+	error = xrep_rtrmap_stash_accumulated(rf);
+	if (error)
+		return error;
+
+	accum->rm_startblock = rgbno;
+	accum->rm_blockcount = rec->br_blockcount;
+	accum->rm_offset = rec->br_startoff;
+	accum->rm_flags = rmap_flags;
+	return 0;
+}
+
+/*
+ * Iterate the block mapping btree to collect rmap records for anything in this
+ * fork that maps to the rt volume.  Sets @mappings_done to true if we've
+ * scanned the block mappings in this fork.
+ */
+STATIC int
+xrep_rtrmap_scan_bmbt(
+	struct xrep_rtrmap_ifork *rf,
+	struct xfs_inode	*ip,
+	bool			*mappings_done)
+{
+	struct xrep_rtrmap	*rr = rf->rr;
+	struct xfs_btree_cur	*cur;
+	struct xfs_ifork	*ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK);
+	int			error = 0;
+
+	*mappings_done = false;
+
+	/*
+	 * If the incore extent cache is already loaded, we'll just use the
+	 * incore extent scanner to record mappings.  Don't bother walking the
+	 * ondisk extent tree.
+	 */
+	if (!xfs_need_iread_extents(ifp))
+		return 0;
+
+	/* Accumulate all the mappings in the bmap btree. */
+	cur = xfs_bmbt_init_cursor(rr->sc->mp, rr->sc->tp, ip, XFS_DATA_FORK);
+	error = xfs_bmap_query_all(cur, xrep_rtrmap_visit_bmbt, rf);
+	xfs_btree_del_cursor(cur, error);
+	if (error)
+		return error;
+
+	/* Stash any remaining accumulated rmaps and exit. */
+	*mappings_done = true;
+	return xrep_rtrmap_stash_accumulated(rf);
+}
+
+/*
+ * Iterate the in-core extent cache to collect rmap records for anything in
+ * this fork that matches the AG.
+ */
+STATIC int
+xrep_rtrmap_scan_iext(
+	struct xrep_rtrmap_ifork *rf,
+	struct xfs_ifork	*ifp)
+{
+	struct xfs_bmbt_irec	rec;
+	struct xfs_iext_cursor	icur;
+	int			error;
+
+	for_each_xfs_iext(ifp, &icur, &rec) {
+		if (isnullstartblock(rec.br_startblock))
+			continue;
+		error = xrep_rtrmap_visit_bmbt(NULL, &rec, rf);
+		if (error)
+			return error;
+	}
+
+	return xrep_rtrmap_stash_accumulated(rf);
+}
+
+/* Find all the extents on the realtime device mapped by an inode fork. */
+STATIC int
+xrep_rtrmap_scan_dfork(
+	struct xrep_rtrmap	*rr,
+	struct xfs_inode	*ip)
+{
+	struct xrep_rtrmap_ifork rf = {
+		.accum		= { .rm_owner = ip->i_ino, },
+		.rr		= rr,
+	};
+	struct xfs_ifork	*ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK);
+	int			error = 0;
+
+	if (ifp->if_format == XFS_DINODE_FMT_BTREE) {
+		bool		mappings_done;
+
+		/*
+		 * Scan the bmbt for mappings.  If the incore extent tree is
+		 * loaded, we want to scan the cached mappings since that's
+		 * faster when the extent counts are very high.
+		 */
+		error = xrep_rtrmap_scan_bmbt(&rf, ip, &mappings_done);
+		if (error || mappings_done)
+			return error;
+	} else if (ifp->if_format != XFS_DINODE_FMT_EXTENTS) {
+		/* realtime data forks should only be extents or btree */
+		return -EFSCORRUPTED;
+	}
+
+	/* Scan incore extent cache. */
+	return xrep_rtrmap_scan_iext(&rf, ifp);
+}
+
+/* Record reverse mappings for a file. */
+STATIC int
+xrep_rtrmap_scan_inode(
+	struct xrep_rtrmap	*rr,
+	struct xfs_inode	*ip)
+{
+	unsigned int		lock_mode;
+	int			error = 0;
+
+	/* Skip the rt rmap btree inode. */
+	if (rr->sc->ip == ip)
+		return 0;
+
+	xfs_ilock(ip, XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED);
+	lock_mode = xfs_ilock_data_map_shared(ip);
+
+	/* Check the data fork if it's on the realtime device. */
+	if (XFS_IS_REALTIME_INODE(ip)) {
+		error = xrep_rtrmap_scan_dfork(rr, ip);
+		if (error)
+			goto out_unlock;
+	}
+
+	xchk_iscan_mark_visited(&rr->iscan, ip);
+out_unlock:
+	xfs_iunlock(ip, XFS_IOLOCK_SHARED | XFS_MMAPLOCK_SHARED | lock_mode);
+	return error;
+}
+
+/* Record extents that belong to the realtime rmap inode. */
+STATIC int
+xrep_rtrmap_walk_rmap(
+	struct xfs_btree_cur		*cur,
+	const struct xfs_rmap_irec	*rec,
+	void				*priv)
+{
+	struct xrep_rtrmap		*rr = priv;
+	struct xfs_mount		*mp = cur->bc_mp;
+	xfs_fsblock_t			fsbno;
+	int				error = 0;
+
+	if (xchk_should_terminate(rr->sc, &error))
+		return error;
+
+	/* Skip extents which are not owned by this inode and fork. */
+	if (rec->rm_owner != rr->sc->ip->i_ino)
+		return 0;
+
+	error = xrep_check_ino_btree_mapping(rr->sc, rec);
+	if (error)
+		return error;
+
+	fsbno = XFS_AGB_TO_FSB(mp, cur->bc_ag.pag->pag_agno,
+			rec->rm_startblock);
+
+	return xfsb_bitmap_set(&rr->old_rtrmapbt_blocks, fsbno,
+			rec->rm_blockcount);
+}
+
+/* Scan one AG for reverse mappings for the realtime rmap btree. */
+STATIC int
+xrep_rtrmap_scan_ag(
+	struct xrep_rtrmap	*rr,
+	struct xfs_perag	*pag)
+{
+	struct xfs_scrub	*sc = rr->sc;
+	int			error;
+
+	error = xrep_ag_init(sc, pag, &sc->sa);
+	if (error)
+		return error;
+
+	error = xfs_rmap_query_all(sc->sa.rmap_cur, xrep_rtrmap_walk_rmap, rr);
+	xchk_ag_free(sc, &sc->sa);
+	return error;
+}
+
+STATIC int
+xrep_rtrmap_find_super_rmaps(
+	struct xrep_rtrmap	*rr)
+{
+	struct xfs_scrub	*sc = rr->sc;
+
+	/* Create a record for the rtgroup superblock. */
+	return xrep_rtrmap_stash(rr, 0, sc->mp->m_sb.sb_rextsize,
+			XFS_RMAP_OWN_FS, 0, 0);
+}
+
+/* Generate all the reverse-mappings for the realtime device. */
+STATIC int
+xrep_rtrmap_find_rmaps(
+	struct xrep_rtrmap	*rr)
+{
+	struct xfs_scrub	*sc = rr->sc;
+	struct xfs_perag	*pag;
+	struct xfs_inode	*ip;
+	xfs_agnumber_t		agno;
+	int			error;
+
+	/* Generate rmaps for the rtgroup superblock */
+	error = xrep_rtrmap_find_super_rmaps(rr);
+	if (error)
+		return error;
+
+	/*
+	 * Set up for a potentially lengthy filesystem scan by reducing our
+	 * transaction resource usage for the duration.  Specifically:
+	 *
+	 * Unlock the realtime metadata inodes and cancel the transaction to
+	 * release the log grant space while we scan the filesystem.
+	 *
+	 * Create a new empty transaction to eliminate the possibility of the
+	 * inode scan deadlocking on cyclical metadata.
+	 *
+	 * We pass the empty transaction to the file scanning function to avoid
+	 * repeatedly cycling empty transactions.  This can be done even though
+	 * we take the IOLOCK to quiesce the file because empty transactions
+	 * do not take sb_internal.
+	 */
+	xchk_trans_cancel(sc);
+	xchk_rtgroup_unlock(sc, &sc->sr);
+	error = xchk_trans_alloc_empty(sc);
+	if (error)
+		return error;
+
+	while ((error = xchk_iscan_iter(sc, &rr->iscan, &ip)) == 1) {
+		error = xrep_rtrmap_scan_inode(rr, ip);
+		xchk_irele(sc, ip);
+		if (error)
+			break;
+
+		if (xchk_should_terminate(sc, &error))
+			break;
+	}
+	if (error)
+		return error;
+
+	/*
+	 * Switch out for a real transaction and lock the RT metadata in
+	 * preparation for building a new tree.
+	 */
+	xchk_trans_cancel(sc);
+	error = xchk_setup_rt(sc);
+	if (error)
+		return error;
+	error = xchk_rtgroup_lock(sc, &sc->sr, XCHK_RTGLOCK_ALL);
+	if (error)
+		return error;
+
+	/* Scan for old rtrmap blocks. */
+	for_each_perag(sc->mp, agno, pag) {
+		error = xrep_rtrmap_scan_ag(rr, pag);
+		if (error) {
+			xfs_perag_put(pag);
+			return error;
+		}
+	}
+
+	return 0;
+}
+
+/* Building the new rtrmap btree. */
+
+/* Retrieve rtrmapbt data for bulk load. */
+STATIC int
+xrep_rtrmap_get_records(
+	struct xfs_btree_cur		*cur,
+	unsigned int			idx,
+	struct xfs_btree_block		*block,
+	unsigned int			nr_wanted,
+	void				*priv)
+{
+	struct xrep_rtrmap_extent	rec;
+	struct xfs_rmap_irec		*irec = &cur->bc_rec.r;
+	struct xrep_rtrmap		*rr = priv;
+	union xfs_btree_rec		*block_rec;
+	unsigned int			loaded;
+	int				error;
+
+	for (loaded = 0; loaded < nr_wanted; loaded++, idx++) {
+		error = xfarray_load_next(rr->rtrmap_records, &rr->array_cur,
+				&rec);
+		if (error)
+			return error;
+
+		irec->rm_startblock = rec.startblock;
+		irec->rm_blockcount = rec.blockcount;
+		irec->rm_owner = rec.owner;
+
+		if (xfs_rmap_irec_offset_unpack(rec.offset, irec) != NULL)
+			return -EFSCORRUPTED;
+
+		error = xrep_rtrmap_check_mapping(rr->sc, irec);
+		if (error)
+			return error;
+
+		block_rec = xfs_btree_rec_addr(cur, idx, block);
+		cur->bc_ops->init_rec_from_cur(cur, block_rec);
+	}
+
+	return loaded;
+}
+
+/* Feed one of the new btree blocks to the bulk loader. */
+STATIC int
+xrep_rtrmap_claim_block(
+	struct xfs_btree_cur	*cur,
+	union xfs_btree_ptr	*ptr,
+	void			*priv)
+{
+	struct xrep_rtrmap        *rr = priv;
+
+	return xrep_newbt_claim_block(cur, &rr->new_btree, ptr);
+}
+
+/* Figure out how much space we need to create the incore btree root block. */
+STATIC size_t
+xrep_rtrmap_iroot_size(
+	struct xfs_btree_cur	*cur,
+	unsigned int		level,
+	unsigned int		nr_this_level,
+	void			*priv)
+{
+	return xfs_rtrmap_broot_space_calc(cur->bc_mp, level, nr_this_level);
+}
+
+/*
+ * Use the collected rmap information to stage a new rmap btree.  If this is
+ * successful we'll return with the new btree root information logged to the
+ * repair transaction but not yet committed.  This implements section (III)
+ * above.
+ */
+STATIC int
+xrep_rtrmap_build_new_tree(
+	struct xrep_rtrmap	*rr)
+{
+	struct xfs_owner_info	oinfo;
+	struct xfs_scrub	*sc = rr->sc;
+	struct xfs_rtgroup	*rtg = sc->sr.rtg;
+	struct xfs_btree_cur	*rmap_cur;
+	uint64_t		nr_records;
+	int			error;
+
+	/*
+	 * Prepare to construct the new btree by reserving disk space for the
+	 * new btree and setting up all the accounting information we'll need
+	 * to root the new btree while it's under construction and before we
+	 * attach it to the realtime rmapbt inode.
+	 */
+	xfs_rmap_ino_bmbt_owner(&oinfo, rtg->rtg_rmapip->i_ino, XFS_DATA_FORK);
+	error = xrep_newbt_init_inode(&rr->new_btree, sc, XFS_DATA_FORK,
+			&oinfo);
+	if (error)
+		return error;
+	rr->new_btree.bload.get_records = xrep_rtrmap_get_records;
+	rr->new_btree.bload.claim_block = xrep_rtrmap_claim_block;
+	rr->new_btree.bload.iroot_size = xrep_rtrmap_iroot_size;
+
+	rmap_cur = xfs_rtrmapbt_stage_cursor(sc->mp, rtg, rtg->rtg_rmapip,
+			&rr->new_btree.ifake);
+
+	nr_records = xfarray_length(rr->rtrmap_records);
+
+	/* Compute how many blocks we'll need for the rmaps collected. */
+	error = xfs_btree_bload_compute_geometry(rmap_cur,
+			&rr->new_btree.bload, nr_records);
+	if (error)
+		goto err_cur;
+
+	/* Last chance to abort before we start committing fixes. */
+	if (xchk_should_terminate(sc, &error))
+		goto err_cur;
+
+	/*
+	 * Guess how many blocks we're going to need to rebuild an entire
+	 * rtrmapbt from the number of extents we found, and pump up our
+	 * transaction to have sufficient block reservation.  We're allowed
+	 * to exceed quota to repair inconsistent metadata, though this is
+	 * unlikely.
+	 */
+	error = xfs_trans_reserve_more_inode(sc->tp, rtg->rtg_rmapip,
+			rr->new_btree.bload.nr_blocks, 0, true);
+	if (error)
+		goto err_cur;
+
+	/* Reserve the space we'll need for the new btree. */
+	error = xrep_newbt_alloc_blocks(&rr->new_btree,
+			rr->new_btree.bload.nr_blocks);
+	if (error)
+		goto err_cur;
+
+	/* Add all observed rmap records. */
+	rr->new_btree.ifake.if_fork->if_format = XFS_DINODE_FMT_RMAP;
+	rr->array_cur = XFARRAY_CURSOR_INIT;
+	error = xfs_btree_bload(rmap_cur, &rr->new_btree.bload, rr);
+	if (error)
+		goto err_cur;
+
+	/*
+	 * Install the new rtrmap btree in the inode.  After this point the old
+	 * btree is no longer accessible, the new tree is live, and we can
+	 * delete the cursor.
+	 */
+	xfs_rtrmapbt_commit_staged_btree(rmap_cur, sc->tp);
+	xrep_inode_set_nblocks(rr->sc, rr->new_btree.ifake.if_blocks);
+	xfs_btree_del_cursor(rmap_cur, 0);
+
+	/* Dispose of any unused blocks and the accounting information. */
+	error = xrep_newbt_commit(&rr->new_btree);
+	if (error)
+		return error;
+
+	return xrep_roll_trans(sc);
+
+err_cur:
+	xfs_btree_del_cursor(rmap_cur, error);
+	xrep_newbt_cancel(&rr->new_btree);
+	return error;
+}
+
+/* Reaping the old btree. */
+
+/* Reap the old rtrmapbt blocks. */
+STATIC int
+xrep_rtrmap_remove_old_tree(
+	struct xrep_rtrmap	*rr)
+{
+	struct xfs_owner_info	oinfo;
+	int			error;
+
+	/*
+	 * Free all the extents that were allocated to the former rtrmapbt and
+	 * aren't cross-linked with something else.
+	 */
+	xfs_rmap_ino_bmbt_owner(&oinfo, rr->sc->ip->i_ino, XFS_DATA_FORK);
+	error = xrep_reap_fsblocks(rr->sc, &rr->old_rtrmapbt_blocks, &oinfo,
+			XFS_AG_RESV_IMETA);
+	if (error)
+		return error;
+
+	/*
+	 * Ensure the proper reservation for the rtrmap inode so that we don't
+	 * fail to expand the new btree.
+	 */
+	return xrep_reset_imeta_reservation(rr->sc);
+}
+
+/* Repair the realtime rmap btree. */
+int
+xrep_rtrmapbt(
+	struct xfs_scrub	*sc)
+{
+	struct xrep_rtrmap	*rr;
+	int			error;
+
+	/* Functionality is not yet complete. */
+	return xrep_notsupported(sc);
+
+	/* Make sure any problems with the fork are fixed. */
+	error = xrep_metadata_inode_forks(sc);
+	if (error)
+		return error;
+
+	rr = kzalloc(sizeof(struct xrep_rtrmap), XCHK_GFP_FLAGS);
+	if (!rr)
+		return -ENOMEM;
+	rr->sc = sc;
+
+	xfsb_bitmap_init(&rr->old_rtrmapbt_blocks);
+
+	/* Set up some storage */
+	error = xfarray_create(sc->mp, "rtrmap records", 0,
+			sizeof(struct xrep_rtrmap_extent), &rr->rtrmap_records);
+	if (error)
+		goto out_bitmap;
+
+	/* Retry iget every tenth of a second for up to 30 seconds. */
+	xchk_iscan_start(&rr->iscan, 30000, 100);
+
+	/* Collect rmaps for realtime files. */
+	error = xrep_rtrmap_find_rmaps(rr);
+	if (error)
+		goto out_records;
+
+	xfs_trans_ijoin(sc->tp, sc->ip, 0);
+
+	/* Rebuild the rtrmap information. */
+	error = xrep_rtrmap_build_new_tree(rr);
+	if (error)
+		goto out_records;
+
+	/* Kill the old tree. */
+	error = xrep_rtrmap_remove_old_tree(rr);
+
+out_records:
+	xchk_iscan_finish(&rr->iscan);
+	xfarray_destroy(rr->rtrmap_records);
+out_bitmap:
+	xfsb_bitmap_destroy(&rr->old_rtrmapbt_blocks);
+	kfree(rr);
+	return error;
+}
diff --git a/fs/xfs/scrub/scrub.c b/fs/xfs/scrub/scrub.c
index 7abd25b37c97..ab7a36efab3b 100644
--- a/fs/xfs/scrub/scrub.c
+++ b/fs/xfs/scrub/scrub.c
@@ -430,7 +430,7 @@ static const struct xchk_meta_ops meta_scrub_ops[] = {
 		.setup	= xchk_setup_rtrmapbt,
 		.scrub	= xchk_rtrmapbt,
 		.has	= xfs_has_rtrmapbt,
-		.repair	= xrep_notsupported,
+		.repair	= xrep_rtrmapbt,
 	},
 };
 
diff --git a/fs/xfs/scrub/trace.h b/fs/xfs/scrub/trace.h
index 7d086ffce7e3..654cbcbd99ea 100644
--- a/fs/xfs/scrub/trace.h
+++ b/fs/xfs/scrub/trace.h
@@ -1715,6 +1715,32 @@ TRACE_EVENT(xrep_calc_ag_resblks_btsize,
 		  __entry->rmapbt_sz,
 		  __entry->refcbt_sz)
 )
+
+#ifdef CONFIG_XFS_RT
+TRACE_EVENT(xrep_calc_rtgroup_resblks_btsize,
+	TP_PROTO(struct xfs_mount *mp, xfs_rgnumber_t rgno,
+		 xfs_rgblock_t usedlen, xfs_rgblock_t rmapbt_sz),
+	TP_ARGS(mp, rgno, usedlen, rmapbt_sz),
+	TP_STRUCT__entry(
+		__field(dev_t, dev)
+		__field(xfs_rgnumber_t, rgno)
+		__field(xfs_rgblock_t, usedlen)
+		__field(xfs_rgblock_t, rmapbt_sz)
+	),
+	TP_fast_assign(
+		__entry->dev = mp->m_super->s_dev;
+		__entry->rgno = rgno;
+		__entry->usedlen = usedlen;
+		__entry->rmapbt_sz = rmapbt_sz;
+	),
+	TP_printk("dev %d:%d rgno 0x%x usedlen %u rmapbt %u",
+		  MAJOR(__entry->dev), MINOR(__entry->dev),
+		  __entry->rgno,
+		  __entry->usedlen,
+		  __entry->rmapbt_sz)
+);
+#endif /* CONFIG_XFS_RT */
+
 TRACE_EVENT(xrep_reset_counters,
 	TP_PROTO(struct xfs_mount *mp, struct xchk_fscounters *fsc),
 	TP_ARGS(mp, fsc),
@@ -2967,6 +2993,37 @@ TRACE_EVENT(xrep_rgbitmap_load_word,
 		  (__entry->ondisk_word & __entry->word_mask),
 		  __entry->word_mask)
 );
+
+TRACE_EVENT(xrep_rtrmap_found,
+	TP_PROTO(struct xfs_mount *mp, const struct xfs_rmap_irec *rec),
+	TP_ARGS(mp, rec),
+	TP_STRUCT__entry(
+		__field(dev_t, dev)
+		__field(dev_t, rtdev)
+		__field(xfs_rgblock_t, rgbno)
+		__field(xfs_extlen_t, len)
+		__field(uint64_t, owner)
+		__field(uint64_t, offset)
+		__field(unsigned int, flags)
+	),
+	TP_fast_assign(
+		__entry->dev = mp->m_super->s_dev;
+		__entry->rtdev = mp->m_rtdev_targp->bt_dev;
+		__entry->rgbno = rec->rm_startblock;
+		__entry->len = rec->rm_blockcount;
+		__entry->owner = rec->rm_owner;
+		__entry->offset = rec->rm_offset;
+		__entry->flags = rec->rm_flags;
+	),
+	TP_printk("dev %d:%d rtdev %d:%d rgbno 0x%x fsbcount 0x%x owner 0x%llx fileoff 0x%llx flags 0x%x",
+		  MAJOR(__entry->dev), MINOR(__entry->dev),
+		  MAJOR(__entry->rtdev), MINOR(__entry->rtdev),
+		  __entry->rgbno,
+		  __entry->len,
+		  __entry->owner,
+		  __entry->offset,
+		  __entry->flags)
+);
 #endif /* CONFIG_XFS_RT */
 
 #endif /* IS_ENABLED(CONFIG_XFS_ONLINE_REPAIR) */


  parent reply	other threads:[~2022-12-31  1:46 UTC|newest]

Thread overview: 565+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-30 21:14 [NYE DELUGE 3/4] xfs: modernize the realtime volume Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 00/20] xfs: hoist inode operations to libxfs Darrick J. Wong
2022-12-30 22:17   ` [PATCH 01/20] xfs: move inode copy-on-write predicates to xfs_inode.[ch] Darrick J. Wong
2022-12-30 22:17   ` [PATCH 03/20] xfs: hoist inode flag conversion functions to libxfs Darrick J. Wong
2022-12-30 22:17   ` [PATCH 04/20] xfs: hoist project id get/set " Darrick J. Wong
2022-12-30 22:17   ` [PATCH 02/20] xfs: hoist extent size helpers " Darrick J. Wong
2022-12-30 22:17   ` [PATCH 05/20] xfs: pack icreate initialization parameters into a separate structure Darrick J. Wong
2022-12-30 22:17   ` [PATCH 10/20] xfs: push xfs_icreate_args creation out of xfs_create* Darrick J. Wong
2022-12-30 22:17   ` [PATCH 11/20] xfs: wrap inode creation dqalloc calls Darrick J. Wong
2022-12-30 22:17   ` [PATCH 07/20] xfs: use xfs_trans_ichgtime to set times when allocating inode Darrick J. Wong
2022-12-30 22:17   ` [PATCH 06/20] xfs: implement atime updates in xfs_trans_ichgtime Darrick J. Wong
2022-12-30 22:17   ` [PATCH 08/20] xfs: split new inode creation into two pieces Darrick J. Wong
2022-12-30 22:17   ` [PATCH 09/20] xfs: hoist new inode initialization functions to libxfs Darrick J. Wong
2022-12-30 22:17   ` [PATCH 12/20] xfs: hoist xfs_iunlink " Darrick J. Wong
2022-12-30 22:17   ` [PATCH 16/20] xfs: hoist inode free function " Darrick J. Wong
2022-12-30 22:17   ` [PATCH 15/20] xfs: create libxfs helper to link an existing inode into a directory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 18/20] xfs: create libxfs helper to exchange two directory entries Darrick J. Wong
2022-12-30 22:17   ` [PATCH 14/20] xfs: create libxfs helper to link a new inode into a directory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 13/20] xfs: hoist xfs_{bump,drop}link to libxfs Darrick J. Wong
2022-12-30 22:17   ` [PATCH 17/20] xfs: create libxfs helper to remove an existing inode/name from a directory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 20/20] xfs: get rid of cross_rename Darrick J. Wong
2022-12-30 22:17   ` [PATCH 19/20] xfs: create libxfs helper to rename two directory entries Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 00/23] xfs: metadata inode directories Darrick J. Wong
2022-12-30 22:17   ` [PATCH 02/23] xfs: create imeta abstractions to get and set metadata inodes Darrick J. Wong
2022-12-30 22:17   ` [PATCH 01/23] xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb Darrick J. Wong
2022-12-30 22:17   ` [PATCH 09/23] xfs: load metadata directory root at mount time Darrick J. Wong
2022-12-30 22:17   ` [PATCH 05/23] xfs: convert all users to xfs_imeta_log Darrick J. Wong
2022-12-30 22:17   ` [PATCH 06/23] xfs: iget for metadata inodes Darrick J. Wong
2022-12-30 22:17   ` [PATCH 04/23] xfs: refactor the v4 group/project inode pointer switch Darrick J. Wong
2022-12-30 22:17   ` [PATCH 08/23] xfs: update imeta transaction reservations for metadir Darrick J. Wong
2022-12-30 22:17   ` [PATCH 07/23] xfs: define the on-disk format for the metadir feature Darrick J. Wong
2022-12-30 22:17   ` [PATCH 03/23] xfs: create transaction reservations for metadata inode operations Darrick J. Wong
2022-12-30 22:17   ` [PATCH 10/23] xfs: convert metadata inode lookup keys to use paths Darrick J. Wong
2022-12-30 22:17   ` [PATCH 15/23] xfs: hide metadata inodes from everyone because they are special Darrick J. Wong
2022-12-30 22:17   ` [PATCH 13/23] xfs: ensure metadata directory paths exist before creating files Darrick J. Wong
2022-12-30 22:17   ` [PATCH 14/23] xfs: disable the agi rotor for metadata inodes Darrick J. Wong
2022-12-30 22:17   ` [PATCH 12/23] xfs: read and write metadata inode directory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 16/23] xfs: advertise metadata directory feature Darrick J. Wong
2022-12-30 22:17   ` [PATCH 11/23] xfs: enforce metadata inode flag Darrick J. Wong
2022-12-30 22:17   ` [PATCH 23/23] xfs: enable metadata directory feature Darrick J. Wong
2022-12-30 22:17   ` [PATCH 22/23] xfs: don't check secondary super inode pointers when metadir enabled Darrick J. Wong
2022-12-30 22:17   ` [PATCH 19/23] xfs: record health problems with the metadata directory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 20/23] xfs: scrub metadata directories Darrick J. Wong
2022-12-30 22:17   ` [PATCH 21/23] xfs: teach nlink scrubber to deal with metadata directory roots Darrick J. Wong
2022-12-30 22:17   ` [PATCH 18/23] xfs: enable creation of dynamically allocated metadir path structures Darrick J. Wong
2022-12-30 22:17   ` [PATCH 17/23] xfs: allow bulkstat to return metadata directories Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 00/14] xfs: refactor btrees to support records in inode root Darrick J. Wong
2022-12-30 22:17   ` [PATCH 03/14] xfs: refactor creation of bmap btree roots Darrick J. Wong
2022-12-30 22:17   ` [PATCH 02/14] xfs: refactor the allocation and freeing of incore inode fork " Darrick J. Wong
2022-12-30 22:17   ` [PATCH 01/14] xfs: replace shouty XFS_BM{BT,DR} macros Darrick J. Wong
2022-12-30 22:17   ` [PATCH 05/14] xfs: hoist the code that moves the incore inode fork broot memory Darrick J. Wong
2022-12-30 22:17   ` [PATCH 04/14] xfs: fix a sloppy memory handling bug in xfs_iroot_realloc Darrick J. Wong
2022-12-30 22:17   ` [PATCH 06/14] xfs: move the zero records logic into xfs_bmap_broot_space_calc Darrick J. Wong
2022-12-30 22:17   ` [PATCH 13/14] xfs: support storing records in the inode core root Darrick J. Wong
2022-12-30 22:17   ` [PATCH 07/14] xfs: rearrange xfs_iroot_realloc a bit Darrick J. Wong
2022-12-30 22:17   ` [PATCH 10/14] xfs: support leaves in the incore btree root block in xfs_iroot_realloc Darrick J. Wong
2022-12-30 22:17   ` [PATCH 12/14] xfs: hoist the node iroot update code out of xfs_btree_kill_iroot Darrick J. Wong
2022-12-30 22:17   ` [PATCH 11/14] xfs: hoist the node iroot update code out of xfs_btree_new_iroot Darrick J. Wong
2022-12-30 22:17   ` [PATCH 09/14] xfs: generalize the btree root reallocation function Darrick J. Wong
2022-12-30 22:17   ` [PATCH 08/14] xfs: standardize the btree maxrecs function parameters Darrick J. Wong
2022-12-30 22:17   ` [PATCH 14/14] xfs: update btree keys correctly when _insrec splits an inode root block Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 00/11] xfs: clean up realtime type usage Darrick J. Wong
2022-12-30 22:17   ` [PATCH 05/11] xfs: make sure maxlen is still congruent with prod when rounding down Darrick J. Wong
2022-12-30 22:17   ` [PATCH 04/11] xfs: rt stubs should return negative errnos when rt disabled Darrick J. Wong
2022-12-30 22:17   ` [PATCH 01/11] xfs: refactor realtime scrubbing context management Darrick J. Wong
2022-12-30 22:17   ` [PATCH 02/11] xfs: bump max fsgeom struct version Darrick J. Wong
2022-12-30 22:17   ` [PATCH 03/11] xfs: prevent rt growfs when quota is enabled Darrick J. Wong
2022-12-30 22:17   ` [PATCH 08/11] xfs: convert rt bitmap/summary block numbers to xfs_fileoff_t Darrick J. Wong
2022-12-30 22:17   ` [PATCH 11/11] xfs: convert rt extent numbers to xfs_rtxnum_t Darrick J. Wong
2022-12-30 22:17   ` [PATCH 06/11] xfs: move the xfs_rtbitmap.c declarations to xfs_rtbitmap.h Darrick J. Wong
2022-12-30 22:17   ` [PATCH 09/11] xfs: convert rt bitmap extent lengths to xfs_rtbxlen_t Darrick J. Wong
2022-12-30 22:17   ` [PATCH 10/11] xfs: rename xfs_verify_rtext to xfs_verify_rtbext Darrick J. Wong
2022-12-30 22:17   ` [PATCH 07/11] xfs: convert xfs_extlen_t to xfs_rtxlen_t in the rt allocator Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 0/7] xfs: refactor rt extent unit conversions Darrick J. Wong
2022-12-30 22:17   ` [PATCH 1/7] xfs: create a helper to convert rtextents to rtblocks Darrick J. Wong
2022-12-30 22:17   ` [PATCH 2/7] xfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2022-12-30 22:17   ` [PATCH 5/7] xfs: convert do_div calls to xfs_rtb_to_rtx helper calls Darrick J. Wong
2022-12-30 22:17   ` [PATCH 4/7] xfs: create helpers to convert rt block numbers to rt extent numbers Darrick J. Wong
2022-12-30 22:17   ` [PATCH 3/7] xfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2022-12-30 22:17   ` [PATCH 7/7] xfs: use shifting and masking when converting rt extents, if possible Darrick J. Wong
2022-12-30 22:17   ` [PATCH 6/7] xfs: create rt extent rounding helpers for realtime extent blocks Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 0/8] xfs: refactor rtbitmap/summary macros Darrick J. Wong
2022-12-30 22:17   ` [PATCH 1/8] xfs: convert the rtbitmap block and bit macros to static inline functions Darrick J. Wong
2022-12-30 22:17   ` [PATCH 8/8] xfs: use accessor functions for summary info words Darrick J. Wong
2022-12-30 22:17   ` [PATCH 2/8] xfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros Darrick J. Wong
2022-12-30 22:17   ` [PATCH 7/8] xfs: create helpers for rtsummary block/wordcount computations Darrick J. Wong
2022-12-30 22:17   ` [PATCH 3/8] xfs: convert open-coded xfs_rtword_t pointer accesses to helper Darrick J. Wong
2022-12-30 22:17   ` [PATCH 5/8] xfs: create helpers for rtbitmap block/wordcount computations Darrick J. Wong
2022-12-30 22:17   ` [PATCH 6/8] xfs: use accessor functions for bitmap words Darrick J. Wong
2022-12-30 22:17   ` [PATCH 4/8] xfs: convert rt summary macros to helpers Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 0/3] xfs: refactor realtime meta inode locking Darrick J. Wong
2022-12-30 22:17   ` [PATCH 1/3] xfs: use separate lock classes for realtime metadata inode ILOCKs Darrick J. Wong
2022-12-30 22:17   ` [PATCH 3/3] xfs: remove XFS_ILOCK_RT* Darrick J. Wong
2022-12-30 22:17   ` [PATCH 2/3] xfs: refactor realtime inode locking Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 00/22] xfsprogs: shard the realtime section Darrick J. Wong
2022-12-30 22:17   ` [PATCH 01/22] xfs: create incore realtime group structures Darrick J. Wong
2022-12-30 22:17   ` [PATCH 05/22] xfs: write secondary realtime superblocks to disk Darrick J. Wong
2022-12-30 22:17   ` [PATCH 06/22] xfs: grow the realtime section when realtime groups are enabled Darrick J. Wong
2022-12-30 22:17   ` [PATCH 03/22] xfs: check the realtime superblock at mount time Darrick J. Wong
2022-12-30 22:17   ` [PATCH 04/22] xfs: update primary realtime super every time we update the primary fs super Darrick J. Wong
2022-12-30 22:17   ` [PATCH 07/22] xfs: always update secondary rt supers when we update secondary fs supers Darrick J. Wong
2022-12-30 22:17   ` [PATCH 08/22] xfs: export realtime group geometry via XFS_FSOP_GEOM Darrick J. Wong
2022-12-30 22:17   ` [PATCH 02/22] xfs: define the format of rt groups Darrick J. Wong
2022-12-30 22:17   ` [PATCH 11/22] xfs: record rt group superblock errors in the health system Darrick J. Wong
2022-12-30 22:17   ` [PATCH 09/22] xfs: check that rtblock extents do not overlap with the rt group metadata Darrick J. Wong
2022-12-30 22:17   ` [PATCH 14/22] xfs: add block headers to realtime bitmap blocks Darrick J. Wong
2022-12-30 22:17   ` [PATCH 13/22] xfs: export the geometry of realtime groups to userspace Darrick J. Wong
2022-12-30 22:17   ` [PATCH 10/22] xfs: add frextents to the lazysbcounters when rtgroups enabled Darrick J. Wong
2022-12-30 22:17   ` [PATCH 12/22] xfs: define locking primitives for realtime groups Darrick J. Wong
2022-12-30 22:17   ` [PATCH 15/22] xfs: encode the rtbitmap in little endian format Darrick J. Wong
2022-12-30 22:17   ` [PATCH 21/22] xfs: scrub each rtgroup's portion of the rtbitmap separately Darrick J. Wong
2022-12-30 22:17   ` [PATCH 17/22] xfs: encode the rtsummary in big endian format Darrick J. Wong
2022-12-30 22:17   ` [PATCH 19/22] xfs: scrub the realtime group superblock Darrick J. Wong
2022-12-30 22:17   ` [PATCH 16/22] xfs: add block headers to realtime summary blocks Darrick J. Wong
2022-12-30 22:17   ` [PATCH 20/22] xfs: repair secondary realtime group superblocks Darrick J. Wong
2022-12-30 22:17   ` [PATCH 22/22] xfs: enable realtime group feature Darrick J. Wong
2022-12-30 22:17   ` [PATCH 18/22] xfs: store rtgroup information with a bmap intent Darrick J. Wong
2022-12-30 22:17 ` [PATCHSET v1.0 0/3] xfsprogs: enable FITRIM for the realtime section Darrick J. Wong
2022-12-30 22:17   ` [PATCH 1/3] xfs: hoist data device FITRIM AG iteration to a separate function Darrick J. Wong
2022-12-30 22:17   ` [PATCH 2/3] xfs: convert xfs_trim_extents to use perag iteration macros Darrick J. Wong
2022-12-30 22:17   ` [PATCH 3/3] xfs: enable FITRIM on the realtime device Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/2] xfs: enable in-core block reservation for rt metadata Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/2] xfs: allow inode-based btrees to reserve space in the data device Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/2] xfs: simplify xfs_ag_resv_free signature Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/2] xfs: extent free log intent cleanups Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/2] xfs: clean up extent free log intent item tracepoint callsites Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/2] xfs: convert "skip_discard" to a proper flags bitset Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/2] xfs: widen EFI format to support rt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/2] xfs: support logging EFIs for realtime extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/2] xfs: support error injection when freeing rt extents Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/5] xfs: rmap log intent cleanups Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/5] xfs: attach rtgroup objects to btree cursors Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/5] xfs: give rmap btree cursor error tracepoints their own class Darrick J. Wong
2022-12-30 22:18   ` [PATCH 3/5] xfs: prepare rmap btree tracepoints for widening Darrick J. Wong
2022-12-30 22:18   ` [PATCH 5/5] xfs: remove xfs_trans_set_rmap_flags Darrick J. Wong
2022-12-30 22:18   ` [PATCH 4/5] xfs: clean up rmap log intent item tracepoint callsites Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 00/38] xfs: realtime reverse-mapping support Darrick J. Wong
2022-12-30 22:18   ` [PATCH 06/38] xfs: add realtime rmap btree operations Darrick J. Wong
2022-12-30 22:18   ` [PATCH 01/38] xfs: prepare rmap btree cursor tracepoints for realtime Darrick J. Wong
2022-12-30 22:18   ` [PATCH 05/38] xfs: realtime rmap btree transaction reservations Darrick J. Wong
2022-12-30 22:18   ` [PATCH 04/38] xfs: define the on-disk realtime rmap btree format Darrick J. Wong
2022-12-30 22:18   ` [PATCH 03/38] xfs: introduce realtime rmap btree definitions Darrick J. Wong
2022-12-30 22:18   ` [PATCH 02/38] xfs: simplify the xfs_rmap_{alloc,free}_extent calling conventions Darrick J. Wong
2022-12-30 22:18   ` [PATCH 07/38] xfs: prepare rmap functions to deal with rtrmapbt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 10/38] xfs: add realtime rmap btree block detection to log recovery Darrick J. Wong
2022-12-30 22:18   ` [PATCH 12/38] xfs: add realtime reverse map inode to metadata directory Darrick J. Wong
2022-12-30 22:18   ` [PATCH 13/38] xfs: add metadata reservations for realtime rmap btrees Darrick J. Wong
2022-12-30 22:18   ` [PATCH 09/38] xfs: support recovering rmap intent items targetting realtime extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 11/38] xfs: attach dquots to rt metadata files when starting quota Darrick J. Wong
2022-12-30 22:18   ` [PATCH 08/38] xfs: add a realtime flag to the rmap update log redo items Darrick J. Wong
2022-12-30 22:18   ` [PATCH 14/38] xfs: wire up a new inode fork type for the realtime rmap Darrick J. Wong
2022-12-30 22:18   ` [PATCH 18/38] xfs: rearrange xfs_fsmap.c a little bit Darrick J. Wong
2022-12-30 22:18   ` [PATCH 17/38] xfs: create routine to allocate and initialize a realtime rmap btree inode Darrick J. Wong
2022-12-30 22:18   ` [PATCH 20/38] xfs: fix integer overflows in the fsmap rtbitmap backend Darrick J. Wong
2022-12-30 22:18   ` [PATCH 15/38] xfs: use realtime EFI to free extents when realtime rmap is enabled Darrick J. Wong
2022-12-30 22:18   ` [PATCH 19/38] xfs: wire up getfsmap to the realtime reverse mapping btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 16/38] xfs: wire up rmap map and unmap to the realtime rmapbt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 24/38] xfs: report realtime rmap btree corruption errors to the health system Darrick J. Wong
2022-12-30 22:18   ` [PATCH 23/38] xfs: add realtime rmap btree when adding rt volume Darrick J. Wong
2022-12-30 22:18   ` [PATCH 26/38] xfs: allow queued realtime intents to drain before scrubbing Darrick J. Wong
2022-12-30 22:18   ` [PATCH 22/38] xfs: check that the rtrmapbt maxlevels doesn't increase when growing fs Darrick J. Wong
2022-12-30 22:18   ` [PATCH 21/38] xfs: fix getfsmap reporting past the last rt extent Darrick J. Wong
2022-12-30 22:18   ` [PATCH 27/38] xfs: scrub the realtime rmapbt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 25/38] xfs: fix scrub tracepoints when inode-rooted btrees are involved Darrick J. Wong
2022-12-30 22:18   ` [PATCH 29/38] xfs: cross-reference the realtime rmapbt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 31/38] xfs: walk the rt reverse mapping tree when rebuilding rmap Darrick J. Wong
2022-12-30 22:18   ` [PATCH 33/38] xfs: repair inodes that have realtime extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 34/38] xfs: online repair of realtime bitmaps for a realtime group Darrick J. Wong
2022-12-30 22:18   ` [PATCH 30/38] xfs: scan rt rmap when we're doing an intense rmap check of bmbt mappings Darrick J. Wong
2022-12-30 22:18   ` [PATCH 28/38] xfs: cross-reference realtime bitmap to realtime rmapbt scrubber Darrick J. Wong
2022-12-30 22:18   ` [PATCH 32/38] xfs: online repair of realtime file bmaps Darrick J. Wong
2022-12-30 22:18   ` Darrick J. Wong [this message]
2022-12-30 22:18   ` [PATCH 36/38] xfs: create a shadow rmap btree during realtime rmap repair Darrick J. Wong
2022-12-30 22:18   ` [PATCH 38/38] xfs: enable realtime rmap btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 37/38] xfs: hook live realtime rmap operations during a repair operation Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/5] xfs: refcount log intent cleanups Darrick J. Wong
2022-12-30 22:18   ` [PATCH 3/5] xfs: prepare refcount btree tracepoints for widening Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/5] xfs: give refcount btree cursor error tracepoints their own class Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/5] xfs: create specialized classes for refcount tracepoints Darrick J. Wong
2022-12-30 22:18   ` [PATCH 4/5] xfs: clean up refcount log intent item tracepoint callsites Darrick J. Wong
2022-12-30 22:18   ` [PATCH 5/5] xfs: remove xfs_trans_set_refcount_flags Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 00/42] xfs: reflink on the realtime device Darrick J. Wong
2022-12-30 22:18   ` [PATCH 03/42] xfs: namespace the maximum length/refcount symbols Darrick J. Wong
2022-12-30 22:18   ` [PATCH 02/42] xfs: introduce realtime refcount btree definitions Darrick J. Wong
2022-12-30 22:18   ` [PATCH 01/42] xfs: prepare refcount btree cursor tracepoints for realtime Darrick J. Wong
2022-12-30 22:18   ` [PATCH 05/42] xfs: realtime refcount btree transaction reservations Darrick J. Wong
2022-12-30 22:18   ` [PATCH 06/42] xfs: add realtime refcount btree operations Darrick J. Wong
2022-12-30 22:18   ` [PATCH 04/42] xfs: define the on-disk realtime refcount btree format Darrick J. Wong
2022-12-30 22:18   ` [PATCH 10/42] xfs: add realtime refcount btree block detection to log recovery Darrick J. Wong
2022-12-30 22:18   ` [PATCH 11/42] xfs: add realtime refcount btree inode to metadata directory Darrick J. Wong
2022-12-30 22:18   ` [PATCH 09/42] xfs: support recovering refcount intent items targetting realtime extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 12/42] xfs: add metadata reservations for realtime refcount btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 07/42] xfs: prepare refcount functions to deal with rtrefcountbt Darrick J. Wong
2022-12-30 22:18   ` [PATCH 08/42] xfs: add a realtime flag to the refcount update log redo items Darrick J. Wong
2022-12-30 22:18   ` [PATCH 13/42] xfs: wire up a new inode fork type for the realtime refcount Darrick J. Wong
2022-12-30 22:18   ` [PATCH 20/42] xfs: enable sharing of realtime file blocks Darrick J. Wong
2022-12-30 22:18   ` [PATCH 19/42] xfs: enable CoW for realtime data Darrick J. Wong
2022-12-30 22:18   ` [PATCH 15/42] xfs: create routine to allocate and initialize a realtime refcount btree inode Darrick J. Wong
2022-12-30 22:18   ` [PATCH 16/42] xfs: update rmap to allow cow staging extents in the rt rmap Darrick J. Wong
2022-12-30 22:18   ` [PATCH 17/42] xfs: compute rtrmap btree max levels when reflink enabled Darrick J. Wong
2022-12-30 22:18   ` [PATCH 18/42] xfs: refactor reflink quota updates Darrick J. Wong
2022-12-30 22:18   ` [PATCH 14/42] xfs: wire up realtime refcount btree cursors Darrick J. Wong
2022-12-30 22:18   ` [PATCH 21/42] xfs: allow inodes to have the realtime and reflink flags Darrick J. Wong
2022-12-30 22:18   ` [PATCH 27/42] xfs: add realtime refcount btree when adding rt volume Darrick J. Wong
2022-12-30 22:18   ` [PATCH 23/42] xfs: fix xfs_get_extsz_hint behavior with realtime alwayscow files Darrick J. Wong
2022-12-30 22:18   ` [PATCH 24/42] xfs: apply rt extent alignment constraints to CoW extsize hint Darrick J. Wong
2022-12-30 22:18   ` [PATCH 26/42] xfs: check that the rtrefcount maxlevels doesn't increase when growing fs Darrick J. Wong
2022-12-30 22:18   ` [PATCH 28/42] xfs: report realtime refcount btree corruption errors to the health system Darrick J. Wong
2022-12-30 22:18   ` [PATCH 25/42] xfs: enable extent size hints for CoW operations Darrick J. Wong
2022-12-30 22:18   ` [PATCH 22/42] xfs: refcover CoW leftovers in the realtime volume Darrick J. Wong
2022-12-30 22:18   ` [PATCH 31/42] xfs: allow overlapping rtrmapbt records for shared data extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 34/42] xfs: detect and repair misaligned rtinherit directory cowextsize hints Darrick J. Wong
2022-12-30 22:18   ` [PATCH 35/42] xfs: don't flag quota rt block usage on rtreflink filesystems Darrick J. Wong
2022-12-30 22:18   ` [PATCH 33/42] xfs: allow dquot rt block count to exceed rt blocks on reflink fs Darrick J. Wong
2022-12-30 22:18   ` [PATCH 29/42] xfs: scrub the realtime refcount btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 30/42] xfs: cross-reference checks with the rt " Darrick J. Wong
2022-12-30 22:18   ` [PATCH 32/42] xfs: check reference counts of gaps between rt refcount records Darrick J. Wong
2022-12-30 22:18   ` [PATCH 39/42] xfs: online repair of the realtime refcount btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 42/42] xfs: enable realtime reflink Darrick J. Wong
2022-12-30 22:18   ` [PATCH 36/42] xfs: check new rtbitmap records against rt refcount btree Darrick J. Wong
2022-12-30 22:18   ` [PATCH 40/42] xfs: repair inodes that have a refcount btree in the data fork Darrick J. Wong
2022-12-30 22:18   ` [PATCH 37/42] xfs: walk the rt reference count tree when rebuilding rmap Darrick J. Wong
2022-12-30 22:18   ` [PATCH 41/42] xfs: fix cow forks for realtime files Darrick J. Wong
2022-12-30 22:18   ` [PATCH 38/42] xfs: capture realtime CoW staging extents when rebuilding rt rmapbt Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/9] xfs: reflink with large realtime extents Darrick J. Wong
2022-12-30 22:18   ` [PATCH 4/9] xfs: forcibly convert unwritten blocks within an rt extent before sharing Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/9] iomap: set up for COWing around pages Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/9] vfs: explicitly pass the block size to the remap prep function Darrick J. Wong
2022-12-30 22:18   ` [PATCH 3/9] xfs: enable CoW when rt extent size is larger than 1 block Darrick J. Wong
2022-12-30 22:18   ` [PATCH 5/9] xfs: extend writeback requests to handle rt cow correctly Darrick J. Wong
2022-12-30 22:18   ` [PATCH 6/9] xfs: enable extent size hints for CoW when rtextsize > 1 Darrick J. Wong
2022-12-30 22:18   ` [PATCH 8/9] xfs: fix integer overflow when validating extent size hints Darrick J. Wong
2022-12-30 22:18   ` [PATCH 7/9] xfs: allow reflink on the rt volume when extent size is larger than 1 rt block Darrick J. Wong
2022-12-30 22:18   ` [PATCH 9/9] xfs: support realtime reflink with an extent size that isn't a power of 2 Darrick J. Wong
2022-12-30 22:18 ` [PATCHSET v1.0 0/3] xfs: enable quota for realtime voluems Darrick J. Wong
2022-12-30 22:18   ` [PATCH 3/3] xfs: enable realtime quota again Darrick J. Wong
2022-12-30 22:18   ` [PATCH 1/3] xfs: fix chown with rt quota Darrick J. Wong
2022-12-30 22:18   ` [PATCH 2/3] xfs: fix rt growfs quota accounting Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET 0/4] xfs_repair: add other v5 features to filesystems Darrick J. Wong
2022-12-30 22:19   ` [PATCH 1/4] xfs_repair: check free space requirements before allowing upgrades Darrick J. Wong
2022-12-30 22:19   ` [PATCH 4/4] xfs_repair: allow sysadmins to add reverse mapping indexes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 2/4] xfs_repair: allow sysadmins to add free inode btree indexes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 3/4] xfs_repair: allow sysadmins to add reflink Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 00/26] libxfs: hoist inode operations to libxfs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 03/26] xfs: hoist project id get/set functions " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 01/26] xfs: hoist extent size helpers " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 02/26] xfs: hoist inode flag conversion functions " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 06/26] libxfs: pack icreate initialization parameters into a separate structure Darrick J. Wong
2022-12-30 22:19   ` [PATCH 05/26] libxfs: pass IGET flags through to xfs_iread Darrick J. Wong
2022-12-30 22:19   ` [PATCH 04/26] libxfs: put all the inode functions in a single file Darrick J. Wong
2022-12-30 22:19   ` [PATCH 10/26] libxfs: when creating a file in a directory, set the project id based on the parent Darrick J. Wong
2022-12-30 22:19   ` [PATCH 09/26] libxfs: set access time when creating files Darrick J. Wong
2022-12-30 22:19   ` [PATCH 07/26] libxfs: implement access timestamp updates in ichgtime Darrick J. Wong
2022-12-30 22:19   ` [PATCH 08/26] libxfs: rearrange libxfs_trans_ichgtime call when creating inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 11/26] libxfs: pass flags2 from parent to child when creating files Darrick J. Wong
2022-12-30 22:19   ` [PATCH 12/26] libxfs: split new inode creation into two pieces Darrick J. Wong
2022-12-30 22:19   ` [PATCH 14/26] libxfs: remove libxfs_dir_ialloc Darrick J. Wong
2022-12-30 22:19   ` [PATCH 13/26] libxfs: backport inode init code from the kernel Darrick J. Wong
2022-12-30 22:19   ` [PATCH 17/26] xfs: hoist xfs_{bump,drop}link to libxfs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 15/26] xfs: hoist new inode initialization functions " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 22/26] xfs: create libxfs helper to exchange two directory entries Darrick J. Wong
2022-12-30 22:19   ` [PATCH 21/26] xfs: create libxfs helper to remove an existing inode/name from a directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 20/26] xfs: hoist inode free function to libxfs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 19/26] xfs: create libxfs helper to link an existing inode into a directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 18/26] xfs: create libxfs helper to link a new " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 16/26] xfs: hoist xfs_iunlink to libxfs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 23/26] xfs: create libxfs helper to rename two directory entries Darrick J. Wong
2022-12-30 22:19   ` [PATCH 25/26] xfs_repair: use library functions to reset root/rbm/rsum inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 26/26] xfs_repair: use library functions for orphanage creation Darrick J. Wong
2022-12-30 22:19   ` [PATCH 24/26] xfs: don't use the incore struct xfs_sb for offsets into struct xfs_dsb Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 00/46] libxfs: metadata inode directories Darrick J. Wong
2022-12-30 22:19   ` [PATCH 04/46] libxfs: convert all users to libxfs_imeta_create Darrick J. Wong
2022-12-30 22:19   ` [PATCH 02/46] xfs: create transaction reservations for metadata inode operations Darrick J. Wong
2022-12-30 22:19   ` [PATCH 03/46] mkfs: clean up the rtinit() function Darrick J. Wong
2022-12-30 22:19   ` [PATCH 01/46] xfs: create imeta abstractions to get and set metadata inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 05/46] mkfs: break up the rest of the rtinit() function Darrick J. Wong
2022-12-30 22:19   ` [PATCH 12/46] xfs: read and write metadata inode directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 08/46] xfs: update imeta transaction reservations for metadir Darrick J. Wong
2022-12-30 22:19   ` [PATCH 06/46] libxfs: iget for metadata inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 11/46] xfs: enforce metadata inode flag Darrick J. Wong
2022-12-30 22:19   ` [PATCH 09/46] xfs: load metadata directory root at mount time Darrick J. Wong
2022-12-30 22:19   ` [PATCH 07/46] xfs: define the on-disk format for the metadir feature Darrick J. Wong
2022-12-30 22:19   ` [PATCH 10/46] xfs: convert metadata inode lookup keys to use paths Darrick J. Wong
2022-12-30 22:19   ` [PATCH 14/46] xfs: disable the agi rotor for metadata inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 19/46] libfrog: report metadata directories in the geometry report Darrick J. Wong
2022-12-30 22:19   ` [PATCH 15/46] xfs: advertise metadata directory feature Darrick J. Wong
2022-12-30 22:19   ` [PATCH 20/46] xfs_db: basic xfs_check support for metadir Darrick J. Wong
2022-12-30 22:19   ` [PATCH 18/46] xfs: record health problems with the metadata directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 17/46] xfs: enable creation of dynamically allocated metadir path structures Darrick J. Wong
2022-12-30 22:19   ` [PATCH 13/46] xfs: ensure metadata directory paths exist before creating files Darrick J. Wong
2022-12-30 22:19   ` [PATCH 16/46] xfs: allow bulkstat to return metadata directories Darrick J. Wong
2022-12-30 22:19   ` [PATCH 24/46] xfs_db: mask superblock fields when metadir feature is enabled Darrick J. Wong
2022-12-30 22:19   ` [PATCH 23/46] xfs_db: support metadata directories in the path command Darrick J. Wong
2022-12-30 22:19   ` [PATCH 26/46] xfs_scrub: scan metadata directories during phase 3 Darrick J. Wong
2022-12-30 22:19   ` [PATCH 25/46] xfs_io: support the bulkstat metadata directory flag Darrick J. Wong
2022-12-30 22:19   ` [PATCH 21/46] xfs_db: report metadir support for version command Darrick J. Wong
2022-12-30 22:19   ` [PATCH 22/46] xfs_db: don't obfuscate metadata directories and attributes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 27/46] xfs_repair: don't zero the incore secondary super when zeroing Darrick J. Wong
2022-12-30 22:19   ` [PATCH 28/46] xfs_repair: refactor metadata inode tagging Darrick J. Wong
2022-12-30 22:19   ` [PATCH 33/46] xfs_repair: check metadata inode flag Darrick J. Wong
2022-12-30 22:19   ` [PATCH 29/46] xfs_repair: refactor fixing dotdot Darrick J. Wong
2022-12-30 22:19   ` [PATCH 34/46] xfs_repair: rebuild the metadata directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 31/46] xfs_repair: refactor root directory initialization Darrick J. Wong
2022-12-30 22:19   ` [PATCH 35/46] xfs_repair: don't let metadata and regular files mix Darrick J. Wong
2022-12-30 22:19   ` [PATCH 30/46] xfs_repair: refactor marking of metadata inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 32/46] xfs_repair: refactor grabbing realtime " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 39/46] xfs_repair: adjust keep_fsinos to handle metadata directories Darrick J. Wong
2022-12-30 22:19   ` [PATCH 42/46] xfs_repair: drop all the metadata directory files during pass 4 Darrick J. Wong
2022-12-30 22:19   ` [PATCH 38/46] xfs_repair: mark space used by metadata files Darrick J. Wong
2022-12-30 22:19   ` [PATCH 43/46] xfs_repair: truncate and unmark orphaned metadata inodes Darrick J. Wong
2022-12-30 22:19   ` [PATCH 36/46] xfs_repair: update incore metadata state whenever we create new files Darrick J. Wong
2022-12-30 22:19   ` [PATCH 40/46] xfs_repair: metadata dirs are never plausible root dirs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 37/46] xfs_repair: pass private data pointer to scan_lbtree Darrick J. Wong
2022-12-30 22:19   ` [PATCH 41/46] xfs_repair: reattach quota inodes to metadata directory Darrick J. Wong
2022-12-30 22:19   ` [PATCH 45/46] mkfs.xfs: enable metadata directories Darrick J. Wong
2022-12-30 22:19   ` [PATCH 46/46] mkfs: add a utility to generate protofiles Darrick J. Wong
2022-12-30 22:19   ` [PATCH 44/46] xfs_repair: allow sysadmins to add metadata directories Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 00/10] libxfs: refactor rt extent unit conversions Darrick J. Wong
2022-12-30 22:19   ` [PATCH 02/10] xfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2022-12-30 22:19   ` [PATCH 01/10] xfs: create a helper to convert rtextents to rtblocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 05/10] xfs: create helpers to convert rt block numbers to rt extent numbers Darrick J. Wong
2022-12-30 22:19   ` [PATCH 03/10] xfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2022-12-30 22:19   ` [PATCH 04/10] libfrog: move 64-bit division wrappers to libfrog Darrick J. Wong
2022-12-30 22:19   ` [PATCH 06/10] xfs: convert do_div calls to xfs_rtb_to_rtx helper calls Darrick J. Wong
2022-12-30 22:19   ` [PATCH 09/10] xfs_repair: convert utility to use new rt extent helpers and types Darrick J. Wong
2022-12-30 22:19   ` [PATCH 08/10] xfs: use shifting and masking when converting rt extents, if possible Darrick J. Wong
2022-12-30 22:19   ` [PATCH 10/10] mkfs: convert utility to use new rt extent helpers and types Darrick J. Wong
2022-12-30 22:19   ` [PATCH 07/10] xfs: create rt extent rounding helpers for realtime extent blocks Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 0/9] libxfs: refactor rtbitmap/summary macros Darrick J. Wong
2022-12-30 22:19   ` [PATCH 3/9] xfs: convert open-coded xfs_rtword_t pointer accesses to helper Darrick J. Wong
2022-12-30 22:19   ` [PATCH 1/9] xfs: convert the rtbitmap block and bit macros to static inline functions Darrick J. Wong
2022-12-30 22:19   ` [PATCH 4/9] xfs: convert rt summary macros to helpers Darrick J. Wong
2022-12-30 22:19   ` [PATCH 2/9] xfs: remove XFS_BLOCKWSIZE and XFS_BLOCKWMASK macros Darrick J. Wong
2022-12-30 22:19   ` [PATCH 5/9] xfs: create helpers for rtbitmap block/wordcount computations Darrick J. Wong
2022-12-30 22:19   ` [PATCH 7/9] xfs: create helpers for rtsummary " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 8/9] xfs: use accessor functions for summary info words Darrick J. Wong
2022-12-30 22:19   ` [PATCH 9/9] misc: use m_blockwsize instead of sb_blocksize for rt blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 6/9] xfs: use accessor functions for bitmap words Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 0/8] xfs_db: debug realtime geometry Darrick J. Wong
2022-12-30 22:19   ` [PATCH 2/8] xfs_db: report the device associated with each io cursor Darrick J. Wong
2022-12-30 22:19   ` [PATCH 5/8] xfs_db: access arbitrary realtime blocks and extents Darrick J. Wong
2022-12-30 22:19   ` [PATCH 6/8] xfs_db: enable conversion of rt space units Darrick J. Wong
2022-12-30 22:19   ` [PATCH 3/8] xfs_db: make the daddr command target the realtime device Darrick J. Wong
2022-12-30 22:19   ` [PATCH 4/8] xfs_db: access realtime file blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 1/8] xfs_db: support passing the realtime device to the debugger Darrick J. Wong
2022-12-30 22:19   ` [PATCH 8/8] xfs_db: convert rtsummary geometry Darrick J. Wong
2022-12-30 22:19   ` [PATCH 7/8] xfs_db: convert rtbitmap geometry Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 0/5] xfs_metadump: support external devices Darrick J. Wong
2022-12-30 22:19   ` [PATCH 1/5] xfs_db: allow selecting logdev blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 3/5] xfs_db: metadump external log devices Darrick J. Wong
2022-12-30 22:19   ` [PATCH 5/5] xfs_mdrestore: fix missed progress reporting Darrick J. Wong
2022-12-30 22:19   ` [PATCH 4/5] xfs_mdrestore: restore log contents to external log devices Darrick J. Wong
2022-12-30 22:19   ` [PATCH 2/5] xfs_db: allow setting current address to log blocks Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 00/45] libxfs: shard the realtime section Darrick J. Wong
2022-12-30 22:19   ` [PATCH 02/45] xfs: define the format of rt groups Darrick J. Wong
2022-12-30 22:19   ` [PATCH 01/45] xfs: create incore realtime group structures Darrick J. Wong
2022-12-30 22:19   ` [PATCH 05/45] xfs: grow the realtime section when realtime groups are enabled Darrick J. Wong
2022-12-30 22:19   ` [PATCH 08/45] xfs: add frextents to the lazysbcounters when rtgroups enabled Darrick J. Wong
2022-12-30 22:19   ` [PATCH 03/45] xfs: update primary realtime super every time we update the primary fs super Darrick J. Wong
2022-12-30 22:19   ` [PATCH 07/45] xfs: check that rtblock extents do not overlap with the rt group metadata Darrick J. Wong
2022-12-30 22:19   ` [PATCH 06/45] xfs: export realtime group geometry via XFS_FSOP_GEOM Darrick J. Wong
2022-12-30 22:19   ` [PATCH 04/45] xfs: write secondary realtime superblocks to disk Darrick J. Wong
2022-12-30 22:19   ` [PATCH 09/45] xfs: record rt group superblock errors in the health system Darrick J. Wong
2022-12-30 22:19   ` [PATCH 10/45] xfs: define locking primitives for realtime groups Darrick J. Wong
2022-12-30 22:19   ` [PATCH 15/45] xfs: encode the rtsummary in big endian format Darrick J. Wong
2022-12-30 22:19   ` [PATCH 13/45] xfs: encode the rtbitmap in little " Darrick J. Wong
2022-12-30 22:19   ` [PATCH 11/45] xfs: export the geometry of realtime groups to userspace Darrick J. Wong
2022-12-30 22:19   ` [PATCH 14/45] xfs: add block headers to realtime summary blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 16/45] xfs: store rtgroup information with a bmap intent Darrick J. Wong
2022-12-30 22:19   ` [PATCH 12/45] xfs: add block headers to realtime bitmap blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 17/45] xfs: scrub the realtime group superblock Darrick J. Wong
2022-12-30 22:19   ` [PATCH 19/45] xfs: scrub the rtbitmap by group Darrick J. Wong
2022-12-30 22:19   ` [PATCH 22/45] xfs_repair: improve rtbitmap discrepancy reporting Darrick J. Wong
2022-12-30 22:19   ` [PATCH 25/45] xfs_db: listify the definition of enum typnm Darrick J. Wong
2022-12-30 22:19   ` [PATCH 23/45] xfs_repair: repair rtbitmap block headers Darrick J. Wong
2022-12-30 22:19   ` [PATCH 21/45] xfs_repair: support realtime groups Darrick J. Wong
2022-12-30 22:19   ` [PATCH 24/45] xfs_repair: repair rtsummary block headers Darrick J. Wong
2022-12-30 22:19   ` [PATCH 18/45] xfs: repair secondary realtime group superblocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 20/45] libfrog: report rt groups in output Darrick J. Wong
2022-12-30 22:19   ` [PATCH 26/45] xfs_db: support dumping realtime superblocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 31/45] xfs_db: report rtgroups via version command Darrick J. Wong
2022-12-30 22:19   ` [PATCH 27/45] xfs_db: support changing the label and uuid of rt superblocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 28/45] xfs_db: listify the definition of dbm_t Darrick J. Wong
2022-12-30 22:19   ` [PATCH 32/45] xfs_db: metadump realtime devices Darrick J. Wong
2022-12-30 22:19   ` [PATCH 30/45] xfs_db: enable conversion of rt space units Darrick J. Wong
2022-12-30 22:19   ` [PATCH 29/45] xfs_db: implement check for rt superblocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 35/45] xfs_mdrestore: restore rt group superblocks to realtime device Darrick J. Wong
2022-12-30 22:19   ` [PATCH 38/45] xfs_io: display rt group in verbose bmap output Darrick J. Wong
2022-12-30 22:19   ` [PATCH 33/45] xfs_db: dump rt bitmap blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 40/45] xfs_spaceman: report on realtime group health Darrick J. Wong
2022-12-30 22:19   ` [PATCH 36/45] xfs_io: add a command to display allocation group information Darrick J. Wong
2022-12-30 22:19   ` [PATCH 34/45] xfs_db: dump rt summary blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 39/45] xfs_io: display rt group in verbose fsmap output Darrick J. Wong
2022-12-30 22:19   ` [PATCH 37/45] xfs_io: add a command to display realtime group information Darrick J. Wong
2022-12-30 22:19   ` [PATCH 43/45] mkfs: add headers to realtime bitmap blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 44/45] mkfs: add headers to realtime summary blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 45/45] mkfs: format realtime groups Darrick J. Wong
2022-12-30 22:19   ` [PATCH 41/45] xfs_scrub: scrub realtime allocation group metadata Darrick J. Wong
2022-12-30 22:19   ` [PATCH 42/45] xfs_scrub: fstrim each rtgroup in parallel Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 0/3] libxfs: widen EFI format to support rt Darrick J. Wong
2022-12-30 22:19   ` [PATCH 2/3] xfs_logprint: report realtime EFIs Darrick J. Wong
2022-12-30 22:19   ` [PATCH 1/3] xfs: support logging EFIs for realtime extents Darrick J. Wong
2022-12-30 22:19   ` [PATCH 3/3] xfs: support error injection when freeing rt extents Darrick J. Wong
2022-12-30 22:19 ` [PATCHSET v1.0 00/41] libxfs: realtime reverse-mapping support Darrick J. Wong
2022-12-30 22:19   ` [PATCH 04/41] xfs: realtime rmap btree transaction reservations Darrick J. Wong
2022-12-30 22:19   ` [PATCH 01/41] xfs: simplify the xfs_rmap_{alloc,free}_extent calling conventions Darrick J. Wong
2022-12-30 22:19   ` [PATCH 03/41] xfs: define the on-disk realtime rmap btree format Darrick J. Wong
2022-12-30 22:19   ` [PATCH 02/41] xfs: introduce realtime rmap btree definitions Darrick J. Wong
2022-12-30 22:19   ` [PATCH 06/41] xfs: prepare rmap functions to deal with rtrmapbt Darrick J. Wong
2022-12-30 22:19   ` [PATCH 07/41] xfs: add a realtime flag to the rmap update log redo items Darrick J. Wong
2022-12-30 22:19   ` [PATCH 05/41] xfs: add realtime rmap btree operations Darrick J. Wong
2022-12-30 22:19   ` [PATCH 12/41] xfs: wire up rmap map and unmap to the realtime rmapbt Darrick J. Wong
2022-12-30 22:19   ` [PATCH 15/41] xfs: allow queued realtime intents to drain before scrubbing Darrick J. Wong
2022-12-30 22:19   ` [PATCH 11/41] xfs: use realtime EFI to free extents when realtime rmap is enabled Darrick J. Wong
2022-12-30 22:19   ` [PATCH 09/41] xfs: add metadata reservations for realtime rmap btrees Darrick J. Wong
2022-12-30 22:19   ` [PATCH 13/41] xfs: create routine to allocate and initialize a realtime rmap btree inode Darrick J. Wong
2022-12-30 22:19   ` [PATCH 08/41] xfs: add realtime reverse map inode to superblock Darrick J. Wong
2022-12-30 22:19   ` [PATCH 10/41] xfs: wire up a new inode fork type for the realtime rmap Darrick J. Wong
2022-12-30 22:19   ` [PATCH 14/41] xfs: report realtime rmap btree corruption errors to the health system Darrick J. Wong
2022-12-30 22:19   ` [PATCH 18/41] xfs: create a shadow rmap btree during realtime rmap repair Darrick J. Wong
2022-12-30 22:19   ` [PATCH 21/41] xfs_db: support the realtime rmapbt Darrick J. Wong
2022-12-30 22:19   ` [PATCH 19/41] xfs: hook live realtime rmap operations during a repair operation Darrick J. Wong
2022-12-30 22:19   ` [PATCH 20/41] xfs_db: display the realtime rmap btree contents Darrick J. Wong
2022-12-30 22:19   ` [PATCH 16/41] xfs: scrub the realtime rmapbt Darrick J. Wong
2022-12-30 22:19   ` [PATCH 17/41] xfs: online repair of the realtime rmap btree Darrick J. Wong
2022-12-30 22:19   ` [PATCH 22/41] xfs_db: support rudimentary checks of the rtrmap btree Darrick J. Wong
2022-12-30 22:19   ` [PATCH 27/41] libxfs: dirty buffers should be marked uptodate too Darrick J. Wong
2022-12-30 22:19   ` [PATCH 25/41] libfrog: enable scrubbng of the realtime rmap Darrick J. Wong
2022-12-30 22:19   ` [PATCH 24/41] xfs_db: make fsmap query the realtime reverse mapping tree Darrick J. Wong
2022-12-30 22:19   ` [PATCH 29/41] xfs_repair: use realtime rmap btree data to check block types Darrick J. Wong
2022-12-30 22:19   ` [PATCH 28/41] xfs_repair: flag suspect long-format btree blocks Darrick J. Wong
2022-12-30 22:19   ` [PATCH 26/41] xfs_spaceman: report health status of the realtime rmap btree Darrick J. Wong
2022-12-30 22:19   ` [PATCH 30/41] xfs_repair: create a new set of incore rmap information for rt groups Darrick J. Wong
2022-12-30 22:19   ` [PATCH 23/41] xfs_db: copy the realtime rmap btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 36/41] xfs_repair: rebuild " Darrick J. Wong
2022-12-30 22:20   ` [PATCH 32/41] xfs_repair: refactor realtime inode check Darrick J. Wong
2022-12-30 22:20   ` [PATCH 33/41] xfs_repair: find and mark the rtrmapbt inodes Darrick J. Wong
2022-12-30 22:20   ` [PATCH 34/41] xfs_repair: check existing realtime rmapbt entries against observed rmaps Darrick J. Wong
2022-12-30 22:20   ` [PATCH 38/41] xfs_repair: reserve per-AG space while rebuilding rt metadata Darrick J. Wong
2022-12-30 22:20   ` [PATCH 35/41] xfs_repair: always check realtime file mappings against incore info Darrick J. Wong
2022-12-30 22:20   ` [PATCH 31/41] xfs_repair: collect relatime reverse-mapping data for refcount/rmap tree rebuilding Darrick J. Wong
2022-12-30 22:20   ` [PATCH 37/41] xfs_repair: rebuild the bmap btree for realtime files Darrick J. Wong
2022-12-30 22:20   ` [PATCH 41/41] mkfs: create the realtime rmap inode Darrick J. Wong
2022-12-30 22:20   ` [PATCH 39/41] xfs_repair: allow sysadmins to add realtime reverse mapping indexes Darrick J. Wong
2022-12-30 22:20   ` [PATCH 40/41] xfs_scrub: retest metadata across scrub groups after a repair Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/4] libxfs: file write utility refactoring Darrick J. Wong
2022-12-30 22:20   ` [PATCH 4/4] mkfs: use file write helper to populate files Darrick J. Wong
2022-12-30 22:20   ` [PATCH 2/4] mkfs: use libxfs_alloc_file_space for rtinit Darrick J. Wong
2022-12-30 22:20   ` [PATCH 3/4] xfs_repair: use libxfs_alloc_file_space to reallocate rt metadata Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/4] libxfs: resync libxfs_alloc_file_space interface with the kernel Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 00/41] libxfs: reflink on the realtime device Darrick J. Wong
2022-12-30 22:20   ` [PATCH 02/41] xfs: namespace the maximum length/refcount symbols Darrick J. Wong
2022-12-30 22:20   ` [PATCH 01/41] xfs: introduce realtime refcount btree definitions Darrick J. Wong
2022-12-30 22:20   ` [PATCH 06/41] xfs: prepare refcount functions to deal with rtrefcountbt Darrick J. Wong
2022-12-30 22:20   ` [PATCH 07/41] xfs: add a realtime flag to the refcount update log redo items Darrick J. Wong
2022-12-30 22:20   ` [PATCH 05/41] xfs: add realtime refcount btree operations Darrick J. Wong
2022-12-30 22:20   ` [PATCH 03/41] xfs: define the on-disk realtime refcount btree format Darrick J. Wong
2022-12-30 22:20   ` [PATCH 09/41] xfs: add metadata reservations for realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 04/41] xfs: realtime refcount btree transaction reservations Darrick J. Wong
2022-12-30 22:20   ` [PATCH 08/41] xfs: add realtime refcount btree inode to metadata directory Darrick J. Wong
2022-12-30 22:20   ` [PATCH 15/41] xfs: allow inodes to have the realtime and reflink flags Darrick J. Wong
2022-12-30 22:20   ` [PATCH 12/41] xfs: create routine to allocate and initialize a realtime refcount btree inode Darrick J. Wong
2022-12-30 22:20   ` [PATCH 11/41] xfs: wire up realtime refcount btree cursors Darrick J. Wong
2022-12-30 22:20   ` [PATCH 14/41] xfs: compute rtrmap btree max levels when reflink enabled Darrick J. Wong
2022-12-30 22:20   ` [PATCH 17/41] xfs: fix xfs_get_extsz_hint behavior with realtime alwayscow files Darrick J. Wong
2022-12-30 22:20   ` [PATCH 16/41] xfs: refcover CoW leftovers in the realtime volume Darrick J. Wong
2022-12-30 22:20   ` [PATCH 13/41] xfs: update rmap to allow cow staging extents in the rt rmap Darrick J. Wong
2022-12-30 22:20   ` [PATCH 10/41] xfs: wire up a new inode fork type for the realtime refcount Darrick J. Wong
2022-12-30 22:20   ` [PATCH 24/41] xfs_db: display the realtime refcount btree contents Darrick J. Wong
2022-12-30 22:20   ` [PATCH 23/41] libfrog: enable scrubbing of the realtime refcount data Darrick J. Wong
2022-12-30 22:20   ` [PATCH 21/41] xfs: scrub the realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 18/41] xfs: apply rt extent alignment constraints to CoW extsize hint Darrick J. Wong
2022-12-30 22:20   ` [PATCH 20/41] xfs: report realtime refcount btree corruption errors to the health system Darrick J. Wong
2022-12-30 22:20   ` [PATCH 19/41] xfs: enable extent size hints for CoW operations Darrick J. Wong
2022-12-30 22:20   ` [PATCH 22/41] xfs: online repair of the realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 26/41] xfs_db: widen block type mask to 64 bits Darrick J. Wong
2022-12-30 22:20   ` [PATCH 29/41] xfs_spaceman: report health of the realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 32/41] xfs_repair: find and mark the rtrefcountbt inode Darrick J. Wong
2022-12-30 22:20   ` [PATCH 30/41] xfs_repair: allow CoW staging extents in the realtime rmap records Darrick J. Wong
2022-12-30 22:20   ` [PATCH 28/41] xfs_db: copy the realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 31/41] xfs_repair: use realtime refcount btree data to check block types Darrick J. Wong
2022-12-30 22:20   ` [PATCH 25/41] xfs_db: support the realtime refcountbt Darrick J. Wong
2022-12-30 22:20   ` [PATCH 27/41] xfs_db: support rudimentary checks of the rtrefcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 34/41] xfs_repair: check existing realtime refcountbt entries against observed refcounts Darrick J. Wong
2022-12-30 22:20   ` [PATCH 36/41] xfs_repair: rebuild the realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 35/41] xfs_repair: reject unwritten shared extents Darrick J. Wong
2022-12-30 22:20   ` [PATCH 33/41] xfs_repair: compute refcount data for the realtime groups Darrick J. Wong
2022-12-30 22:20   ` [PATCH 39/41] xfs_repair: allow sysadmins to add realtime reflink Darrick J. Wong
2022-12-30 22:20   ` [PATCH 38/41] xfs_repair: validate CoW extent size hint on rtinherit directories Darrick J. Wong
2022-12-30 22:20   ` [PATCH 37/41] xfs_repair: allow realtime files to have the reflink flag set Darrick J. Wong
2022-12-30 22:20   ` [PATCH 40/41] mkfs: validate CoW extent size hint when rtinherit is set Darrick J. Wong
2022-12-30 22:20   ` [PATCH 41/41] mkfs: enable reflink on the realtime device Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/3] libxfs: reflink with large realtime extents Darrick J. Wong
2022-12-30 22:20   ` [PATCH 3/3] mkfs: enable reflink with realtime extent sizes > 1 Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/3] xfs: enable extent size hints for CoW when rtextsize " Darrick J. Wong
2022-12-30 22:20   ` [PATCH 2/3] xfs: fix integer overflow when validating extent size hints Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/1] libxfs: enable quota for realtime voluems Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/1] xfs_quota: report warning limits for realtime space quotas Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET 0/1] fstests: test upgrading older features Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/1] xfs: test upgrading old features Darrick J. Wong
2023-03-06 15:56     ` Zorro Lang
2023-03-06 16:41       ` Darrick J. Wong
2023-03-06 16:54         ` Zorro Lang
2023-03-06 23:14           ` Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/9] fstests: test XFS metadata directories Darrick J. Wong
2022-12-30 22:20   ` [PATCH 3/9] xfs/{030,033,178}: forcibly disable metadata directory trees Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/9] xfs/122: fix metadirino Darrick J. Wong
2022-12-30 22:20   ` [PATCH 2/9] various: fix finding metadata inode numbers when metadir is enabled Darrick J. Wong
2023-03-06 16:41     ` Zorro Lang
2022-12-30 22:20   ` [PATCH 4/9] common/repair: patch up repair sb inode value complaints Darrick J. Wong
2022-12-30 22:20   ` [PATCH 6/9] xfs/{050,144,153,299,330}: update quota reports to leave out metadir files Darrick J. Wong
2022-12-30 22:20   ` [PATCH 9/9] xfs: create fuzz tests for metadata directories Darrick J. Wong
2022-12-30 22:20   ` [PATCH 7/9] xfs/769: add metadir upgrade to test matrix Darrick J. Wong
2022-12-30 22:20   ` [PATCH 5/9] xfs/206: update for metadata directory support Darrick J. Wong
2022-12-30 22:20   ` [PATCH 8/9] xfs/509: adjust inumbers accounting for metadata directories Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/4] fstests: support metadump to external devices Darrick J. Wong
2022-12-30 22:20   ` [PATCH 3/4] common/ext4: reformat external logs during mdrestore operations Darrick J. Wong
2022-12-30 22:20   ` [PATCH 2/4] common/xfs: wipe " Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/4] common/populate: refactor caching of metadumps to a helper Darrick J. Wong
2022-12-30 22:20   ` [PATCH 4/4] common/xfs: capture external logs during metadump/mdrestore Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 00/12] xfsprogs: shard the realtime section Darrick J. Wong
2022-12-30 22:20   ` [PATCH 03/12] xfs/206: update mkfs filtering for rt groups feature Darrick J. Wong
2022-12-30 22:20   ` [PATCH 01/12] xfs/122: update for rtgroups Darrick J. Wong
2022-12-30 22:20   ` [PATCH 02/12] punch-alternating: detect xfs realtime files with large allocation units Darrick J. Wong
2022-12-30 22:20   ` [PATCH 10/12] xfs/27[46],xfs/556: fix tests to deal with rtgroups output in bmap/fsmap commands Darrick J. Wong
2022-12-30 22:20   ` [PATCH 07/12] xfs/449: update test to know about xfs_db -R Darrick J. Wong
2022-12-30 22:20   ` [PATCH 11/12] common/xfs: capture realtime devices during metadump/mdrestore Darrick J. Wong
2022-12-30 22:20   ` [PATCH 05/12] common: filter rtgroups when we're disabling metadir Darrick J. Wong
2022-12-30 22:20   ` [PATCH 08/12] xfs/122: update for rtbitmap headers Darrick J. Wong
2022-12-30 22:20   ` [PATCH 06/12] xfs/185: update for rtgroups Darrick J. Wong
2022-12-30 22:20   ` [PATCH 04/12] common: pass the realtime device to xfs_db when possible Darrick J. Wong
2022-12-30 22:20   ` [PATCH 09/12] xfs/122: udpate test to pick up rtword/suminfo ondisk unions Darrick J. Wong
2022-12-30 22:20   ` [PATCH 12/12] common/fuzzy: adapt the scrub stress tests to support rtgroups Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 00/13] fstests: fixes for realtime rmap Darrick J. Wong
2022-12-30 22:20   ` [PATCH 03/13] xfs: race fsstress with realtime rmap btree scrub and repair Darrick J. Wong
2022-12-30 22:20   ` [PATCH 04/13] xfs/769: add rtrmapbt upgrade to test matrix Darrick J. Wong
2022-12-30 22:20   ` [PATCH 05/13] xfs/122: update for rtgroups-based realtime rmap btrees Darrick J. Wong
2022-12-30 22:20   ` [PATCH 07/13] xfs/341: update test for rtgroup-based rmap Darrick J. Wong
2022-12-30 22:20   ` [PATCH 06/13] xfs: fix various problems with fsmap detecting the data device Darrick J. Wong
2022-12-30 22:20   ` [PATCH 01/13] xfs: fix tests that try to access the realtime rmap inode Darrick J. Wong
2022-12-30 22:20   ` [PATCH 02/13] fuzz: for fuzzing the rtrmapbt, find the path to the rt rmap btree file Darrick J. Wong
2022-12-30 22:20   ` [PATCH 09/13] xfs: skip tests if formatting small filesystem fails Darrick J. Wong
2022-12-30 22:20   ` [PATCH 10/13] xfs/443: use file allocation unit, not dbsize Darrick J. Wong
2022-12-30 22:20   ` [PATCH 12/13] populate: check that we created a realtime rmap btree of the given height Darrick J. Wong
2022-12-30 22:20   ` [PATCH 13/13] fuzzy: create missing fuzz tests for rt rmap btrees Darrick J. Wong
2022-12-30 22:20   ` [PATCH 11/13] populate: adjust rtrmap calculations for rtgroups Darrick J. Wong
2022-12-30 22:20   ` [PATCH 08/13] xfs/3{43,32}: adapt tests for rt extent size greater than 1 Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 00/10] fstests: reflink on the realtime device Darrick J. Wong
2022-12-30 22:20   ` [PATCH 01/10] xfs/122: update fields for realtime reflink Darrick J. Wong
2022-12-30 22:20   ` [PATCH 02/10] common/populate: create realtime refcount btree Darrick J. Wong
2022-12-30 22:20   ` [PATCH 03/10] xfs: create fuzz tests for the " Darrick J. Wong
2022-12-30 22:20   ` [PATCH 06/10] xfs: race fsstress with realtime refcount btree scrub and repair Darrick J. Wong
2022-12-30 22:20   ` [PATCH 09/10] generic/331,xfs/240: support files that skip delayed allocation Darrick J. Wong
2022-12-30 22:20   ` [PATCH 05/10] xfs/243: don't run when realtime storage is the default Darrick J. Wong
2022-12-30 22:20   ` [PATCH 04/10] xfs/27[24]: adapt for checking files on the realtime volume Darrick J. Wong
2022-12-30 22:20   ` [PATCH 08/10] xfs/769: add rtreflink upgrade to test matrix Darrick J. Wong
2022-12-30 22:20   ` [PATCH 10/10] common/xfs: fix _xfs_get_file_block_size when rtinherit is set and no rt section Darrick J. Wong
2022-12-30 22:20   ` [PATCH 07/10] xfs: remove xfs/131 now that we allow reflink on realtime volumes Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/4] fstests: reflink with large realtime extents Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/4] xfs: make sure that CoW will write around when rextsize > 1 Darrick J. Wong
2022-12-30 22:20   ` [PATCH 2/4] xfs: skip cowextsize hint fragmentation tests on realtime volumes Darrick J. Wong
2022-12-30 22:20   ` [PATCH 4/4] generic/303: avoid test failures on weird rt extent sizes Darrick J. Wong
2022-12-30 22:20   ` [PATCH 3/4] misc: add more congruent oplen testing Darrick J. Wong
2022-12-30 22:20 ` [PATCHSET v1.0 0/1] fstests: functional tests for rt quota Darrick J. Wong
2022-12-30 22:20   ` [PATCH 1/1] xfs: regression testing of quota on the realtime device 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=167243870103.715303.9270241850697635771.stgit@magnolia \
    --to=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 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.