All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: cem@kernel.org, djwong@kernel.org
Cc: Christoph Hellwig <hch@lst.de>, linux-xfs@vger.kernel.org
Subject: [PATCH 094/110] xfs: support in-memory btrees
Date: Mon, 25 Mar 2024 20:52:57 -0700	[thread overview]
Message-ID: <171142132733.2215168.1215845331783138642.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <171142131228.2215168.2795743548791967397.stgit@frogsfrogsfrogs>

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

Source kernel commit: a095686a2383526d7315197e2419d84ee8470217

Adapt the generic btree cursor code to be able to create a btree whose
buffers come from a (presumably in-memory) buftarg with a header block
that's specific to in-memory btrees.  We'll connect this to other parts
of online scrub in the next patches.

Note that in-memory btrees always have a block size matching the system
memory page size for efficiency reasons.  There are also a few things we
need to do to finalize a btree update; that's covered in the next patch.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
 include/libxfs.h         |    2 
 include/xfs_mount.h      |    5 +
 include/xfs_trace.h      |    7 +
 libxfs/Makefile          |    2 
 libxfs/buf_mem.c         |   13 ++
 libxfs/buf_mem.h         |    2 
 libxfs/libxfs_api_defs.h |    1 
 libxfs/libxfs_io.h       |   10 ++
 libxfs/libxfs_priv.h     |    3 +
 libxfs/xfs_btree.c       |  257 +++++++++++++++++++++++++++++++++++++++-------
 libxfs/xfs_btree.h       |    7 +
 libxfs/xfs_btree_mem.c   |  227 +++++++++++++++++++++++++++++++++++++++++
 libxfs/xfs_btree_mem.h   |   72 +++++++++++++
 13 files changed, 571 insertions(+), 37 deletions(-)
 create mode 100644 libxfs/xfs_btree_mem.c
 create mode 100644 libxfs/xfs_btree_mem.h


diff --git a/include/libxfs.h b/include/libxfs.h
index 60d3b7968775..563c40e5745e 100644
--- a/include/libxfs.h
+++ b/include/libxfs.h
@@ -9,6 +9,8 @@
 
 /* For userspace XFS_RT is always defined */
 #define CONFIG_XFS_RT
+/* Ditto in-memory btrees */
+#define CONFIG_XFS_BTREE_IN_MEM
 
 #include "libxfs_api_defs.h"
 #include "platform_defs.h"
diff --git a/include/xfs_mount.h b/include/xfs_mount.h
index 98d5b199de8c..9c492b8f5e4c 100644
--- a/include/xfs_mount.h
+++ b/include/xfs_mount.h
@@ -301,4 +301,9 @@ struct xfs_defer_drain { /* empty */ };
 static inline void xfs_perag_intent_hold(struct xfs_perag *pag) {}
 static inline void xfs_perag_intent_rele(struct xfs_perag *pag) {}
 
+static inline void libxfs_buftarg_drain(struct xfs_buftarg *btp)
+{
+	cache_purge(btp->bcache);
+}
+
 #endif	/* __XFS_MOUNT_H__ */
diff --git a/include/xfs_trace.h b/include/xfs_trace.h
index df25dc2a9d62..6c8eeff1e62a 100644
--- a/include/xfs_trace.h
+++ b/include/xfs_trace.h
@@ -6,6 +6,13 @@
 #ifndef __TRACE_H__
 #define __TRACE_H__
 
+#define trace_xfbtree_init(...)			((void) 0)
+#define trace_xfbtree_create_root_buf(...)	((void) 0)
+#define trace_xfbtree_alloc_block(...)		((void) 0)
+#define trace_xfbtree_free_block(...)		((void) 0)
+#define trace_xfbtree_trans_cancel_buf(...)	((void) 0)
+#define trace_xfbtree_trans_commit_buf(...)	((void) 0)
+
 #define trace_xfs_agfl_reset(a,b,c,d)		((void) 0)
 #define trace_xfs_agfl_free_defer(a,b,c,d,e)	((void) 0)
 #define trace_xfs_alloc_cur_check(...)		((void) 0)
diff --git a/libxfs/Makefile b/libxfs/Makefile
index 8f501fc39f7e..1e6e549fe8eb 100644
--- a/libxfs/Makefile
+++ b/libxfs/Makefile
@@ -37,6 +37,7 @@ HFILES = \
 	xfs_bmap.h \
 	xfs_bmap_btree.h \
 	xfs_btree.h \
+	xfs_btree_mem.h \
 	xfs_btree_staging.h \
 	xfs_attr_remote.h \
 	xfs_cksum.h \
@@ -81,6 +82,7 @@ CFILES = buf_mem.c \
 	xfs_bmap.c \
 	xfs_bmap_btree.c \
 	xfs_btree.c \
+	xfs_btree_mem.c \
 	xfs_btree_staging.c \
 	xfs_da_btree.c \
 	xfs_defer.c \
diff --git a/libxfs/buf_mem.c b/libxfs/buf_mem.c
index 7c8fa1d2cdcd..769cce23f3f3 100644
--- a/libxfs/buf_mem.c
+++ b/libxfs/buf_mem.c
@@ -233,3 +233,16 @@ xmbuf_unmap_page(
 	munmap(bp->b_addr, BBTOB(bp->b_length));
 	bp->b_addr = NULL;
 }
+
+/* Is this a valid daddr within the buftarg? */
+bool
+xmbuf_verify_daddr(
+	struct xfs_buftarg	*btp,
+	xfs_daddr_t		daddr)
+{
+	struct xfile		*xf = btp->bt_xfile;
+
+	ASSERT(xfs_buftarg_is_mem(btp));
+
+	return daddr < (xf->partition_bytes >> BBSHIFT);
+}
diff --git a/libxfs/buf_mem.h b/libxfs/buf_mem.h
index d2be2c4240b6..d40f9f9df8f1 100644
--- a/libxfs/buf_mem.h
+++ b/libxfs/buf_mem.h
@@ -23,4 +23,6 @@ void xmbuf_free(struct xfs_buftarg *btp);
 int xmbuf_map_page(struct xfs_buf *bp);
 void xmbuf_unmap_page(struct xfs_buf *bp);
 
+bool xmbuf_verify_daddr(struct xfs_buftarg *btp, xfs_daddr_t daddr);
+
 #endif /* __XFS_BUF_MEM_H__ */
diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h
index 0e72944bc9aa..fe8a0dc40269 100644
--- a/libxfs/libxfs_api_defs.h
+++ b/libxfs/libxfs_api_defs.h
@@ -76,6 +76,7 @@
 #define xfs_buf_read_uncached		libxfs_buf_read_uncached
 #define xfs_buf_relse			libxfs_buf_relse
 #define xfs_buf_unlock			libxfs_buf_unlock
+#define xfs_buftarg_drain		libxfs_buftarg_drain
 #define xfs_bunmapi			libxfs_bunmapi
 #define xfs_bwrite			libxfs_bwrite
 #define xfs_calc_dquots_per_chunk	libxfs_calc_dquots_per_chunk
diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h
index ae3c4a9484c7..82d86f1d1b37 100644
--- a/libxfs/libxfs_io.h
+++ b/libxfs/libxfs_io.h
@@ -282,4 +282,14 @@ xfs_buf_delwri_queue_here(struct xfs_buf *bp, struct list_head *buffer_list)
 int xfs_buf_delwri_submit(struct list_head *buffer_list);
 void xfs_buf_delwri_cancel(struct list_head *list);
 
+xfs_daddr_t xfs_buftarg_nr_sectors(struct xfs_buftarg *btp);
+
+static inline bool
+xfs_buftarg_verify_daddr(
+	struct xfs_buftarg	*btp,
+	xfs_daddr_t		daddr)
+{
+	return daddr < xfs_buftarg_nr_sectors(btp);
+}
+
 #endif	/* __LIBXFS_IO_H__ */
diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h
index aee85c155abf..865b8d0f4e1a 100644
--- a/libxfs/libxfs_priv.h
+++ b/libxfs/libxfs_priv.h
@@ -38,6 +38,7 @@
 #define __LIBXFS_INTERNAL_XFS_H__
 
 #define CONFIG_XFS_RT
+#define CONFIG_XFS_BTREE_IN_MEM
 
 #include "libxfs_api_defs.h"
 #include "platform_defs.h"
@@ -391,7 +392,9 @@ void __xfs_buf_mark_corrupt(struct xfs_buf *bp, xfs_failaddr_t fa);
 
 /* no readahead, need to avoid set-but-unused var warnings. */
 #define xfs_buf_readahead(a,d,c,ops)		({	\
+	void *__a = a;					\
 	xfs_daddr_t __d = d;				\
+	__a = __a;					\
 	__d = __d; /* no set-but-unused warning */	\
 })
 #define xfs_buf_readahead_map(a,b,c,ops)	((void) 0)	/* no readahead */
diff --git a/libxfs/xfs_btree.c b/libxfs/xfs_btree.c
index 5fd966a63371..a91441b46847 100644
--- a/libxfs/xfs_btree.c
+++ b/libxfs/xfs_btree.c
@@ -25,6 +25,9 @@
 #include "xfs_rmap_btree.h"
 #include "xfs_refcount_btree.h"
 #include "xfs_health.h"
+#include "xfile.h"
+#include "buf_mem.h"
+#include "xfs_btree_mem.h"
 
 /*
  * Btree magic numbers.
@@ -72,6 +75,25 @@ xfs_btree_check_fsblock_siblings(
 	return NULL;
 }
 
+static inline xfs_failaddr_t
+xfs_btree_check_memblock_siblings(
+	struct xfs_buftarg	*btp,
+	xfbno_t			bno,
+	__be64			dsibling)
+{
+	xfbno_t			sibling;
+
+	if (dsibling == cpu_to_be64(NULLFSBLOCK))
+		return NULL;
+
+	sibling = be64_to_cpu(dsibling);
+	if (sibling == bno)
+		return __this_address;
+	if (!xmbuf_verify_daddr(btp, xfbno_to_daddr(sibling)))
+		return __this_address;
+	return NULL;
+}
+
 static inline xfs_failaddr_t
 xfs_btree_check_agblock_siblings(
 	struct xfs_perag	*pag,
@@ -161,6 +183,34 @@ __xfs_btree_check_fsblock(
 	return fa;
 }
 
+/*
+ * Check an in-memory btree block header.  Return the address of the failing
+ * check, or NULL if everything is ok.
+ */
+static xfs_failaddr_t
+__xfs_btree_check_memblock(
+	struct xfs_btree_cur	*cur,
+	struct xfs_btree_block	*block,
+	int			level,
+	struct xfs_buf		*bp)
+{
+	struct xfs_buftarg	*btp = cur->bc_mem.xfbtree->target;
+	xfs_failaddr_t		fa;
+	xfbno_t			bno;
+
+	fa = __xfs_btree_check_lblock_hdr(cur, block, level, bp);
+	if (fa)
+		return fa;
+
+	bno = xfs_daddr_to_xfbno(xfs_buf_daddr(bp));
+	fa = xfs_btree_check_memblock_siblings(btp, bno,
+			block->bb_u.l.bb_leftsib);
+	if (!fa)
+		fa = xfs_btree_check_memblock_siblings(btp, bno,
+				block->bb_u.l.bb_rightsib);
+	return fa;
+}
+
 /*
  * Check a short btree block header.  Return the address of the failing check,
  * or NULL if everything is ok.
@@ -213,9 +263,17 @@ __xfs_btree_check_block(
 	int			level,
 	struct xfs_buf		*bp)
 {
-	if (cur->bc_ops->type == XFS_BTREE_TYPE_AG)
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_MEM:
+		return __xfs_btree_check_memblock(cur, block, level, bp);
+	case XFS_BTREE_TYPE_AG:
 		return __xfs_btree_check_agblock(cur, block, level, bp);
-	return __xfs_btree_check_fsblock(cur, block, level, bp);
+	case XFS_BTREE_TYPE_INODE:
+		return __xfs_btree_check_fsblock(cur, block, level, bp);
+	default:
+		ASSERT(0);
+		return __this_address;
+	}
 }
 
 static inline unsigned int xfs_btree_block_errtag(struct xfs_btree_cur *cur)
@@ -259,14 +317,22 @@ __xfs_btree_check_ptr(
 	if (level <= 0)
 		return -EFSCORRUPTED;
 
-	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_MEM:
+		if (!xfbtree_verify_bno(cur->bc_mem.xfbtree,
+				be64_to_cpu((&ptr->l)[index])))
+			return -EFSCORRUPTED;
+		break;
+	case XFS_BTREE_TYPE_INODE:
 		if (!xfs_verify_fsbno(cur->bc_mp,
 				be64_to_cpu((&ptr->l)[index])))
 			return -EFSCORRUPTED;
-	} else {
+		break;
+	case XFS_BTREE_TYPE_AG:
 		if (!xfs_verify_agbno(cur->bc_ag.pag,
 				be32_to_cpu((&ptr->s)[index])))
 			return -EFSCORRUPTED;
+		break;
 	}
 
 	return 0;
@@ -287,17 +353,26 @@ xfs_btree_check_ptr(
 
 	error = __xfs_btree_check_ptr(cur, ptr, index, level);
 	if (error) {
-		if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
+		switch (cur->bc_ops->type) {
+		case XFS_BTREE_TYPE_MEM:
+			xfs_err(cur->bc_mp,
+"In-memory: Corrupt %sbt flags 0x%x pointer at level %d index %d fa %pS.",
+				cur->bc_ops->name, cur->bc_flags, level, index,
+				__this_address);
+			break;
+		case XFS_BTREE_TYPE_INODE:
 			xfs_err(cur->bc_mp,
 "Inode %llu fork %d: Corrupt %sbt pointer at level %d index %d.",
 				cur->bc_ino.ip->i_ino,
 				cur->bc_ino.whichfork, cur->bc_ops->name,
 				level, index);
-		} else {
+			break;
+		case XFS_BTREE_TYPE_AG:
 			xfs_err(cur->bc_mp,
 "AG %u: Corrupt %sbt pointer at level %d index %d.",
 				cur->bc_ag.pag->pag_agno, cur->bc_ops->name,
 				level, index);
+			break;
 		}
 		xfs_btree_mark_sick(cur);
 	}
@@ -454,11 +529,35 @@ xfs_btree_del_cursor(
 	case XFS_BTREE_TYPE_INODE:
 		/* nothing to do */
 		break;
+	case XFS_BTREE_TYPE_MEM:
+		if (cur->bc_mem.pag)
+			xfs_perag_put(cur->bc_mem.pag);
+		break;
 	}
 
 	kmem_cache_free(cur->bc_cache, cur);
 }
 
+/* Return the buffer target for this btree's buffer. */
+static inline struct xfs_buftarg *
+xfs_btree_buftarg(
+	struct xfs_btree_cur	*cur)
+{
+	if (cur->bc_ops->type == XFS_BTREE_TYPE_MEM)
+		return cur->bc_mem.xfbtree->target;
+	return cur->bc_mp->m_ddev_targp;
+}
+
+/* Return the block size (in units of 512b sectors) for this btree. */
+static inline unsigned int
+xfs_btree_bbsize(
+	struct xfs_btree_cur	*cur)
+{
+	if (cur->bc_ops->type == XFS_BTREE_TYPE_MEM)
+		return XFBNO_BBSIZE;
+	return cur->bc_mp->m_bsize;
+}
+
 /*
  * Duplicate the btree cursor.
  * Allocate a new one, copy the record, re-get the buffers.
@@ -502,10 +601,11 @@ xfs_btree_dup_cursor(
 		new->bc_levels[i].ra = cur->bc_levels[i].ra;
 		bp = cur->bc_levels[i].bp;
 		if (bp) {
-			error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp,
-						   xfs_buf_daddr(bp), mp->m_bsize,
-						   0, &bp,
-						   cur->bc_ops->buf_ops);
+			error = xfs_trans_read_buf(mp, tp,
+					xfs_btree_buftarg(cur),
+					xfs_buf_daddr(bp),
+					xfs_btree_bbsize(cur), 0, &bp,
+					cur->bc_ops->buf_ops);
 			if (xfs_metadata_is_sick(error))
 				xfs_btree_mark_sick(new);
 			if (error) {
@@ -882,6 +982,32 @@ xfs_btree_readahead_fsblock(
 	return rval;
 }
 
+STATIC int
+xfs_btree_readahead_memblock(
+	struct xfs_btree_cur	*cur,
+	int			lr,
+	struct xfs_btree_block	*block)
+{
+	struct xfs_buftarg	*btp = cur->bc_mem.xfbtree->target;
+	xfbno_t			left = be64_to_cpu(block->bb_u.l.bb_leftsib);
+	xfbno_t			right = be64_to_cpu(block->bb_u.l.bb_rightsib);
+	int			rval = 0;
+
+	if ((lr & XFS_BTCUR_LEFTRA) && left != NULLFSBLOCK) {
+		xfs_buf_readahead(btp, xfbno_to_daddr(left), XFBNO_BBSIZE,
+				cur->bc_ops->buf_ops);
+		rval++;
+	}
+
+	if ((lr & XFS_BTCUR_RIGHTRA) && right != NULLFSBLOCK) {
+		xfs_buf_readahead(btp, xfbno_to_daddr(right), XFBNO_BBSIZE,
+				cur->bc_ops->buf_ops);
+		rval++;
+	}
+
+	return rval;
+}
+
 STATIC int
 xfs_btree_readahead_agblock(
 	struct xfs_btree_cur	*cur,
@@ -936,9 +1062,17 @@ xfs_btree_readahead(
 	cur->bc_levels[lev].ra |= lr;
 	block = XFS_BUF_TO_BLOCK(cur->bc_levels[lev].bp);
 
-	if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN)
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_AG:
+		return xfs_btree_readahead_agblock(cur, lr, block);
+	case XFS_BTREE_TYPE_INODE:
 		return xfs_btree_readahead_fsblock(cur, lr, block);
-	return xfs_btree_readahead_agblock(cur, lr, block);
+	case XFS_BTREE_TYPE_MEM:
+		return xfs_btree_readahead_memblock(cur, lr, block);
+	default:
+		ASSERT(0);
+		return 0;
+	}
 }
 
 STATIC int
@@ -947,23 +1081,24 @@ xfs_btree_ptr_to_daddr(
 	const union xfs_btree_ptr	*ptr,
 	xfs_daddr_t			*daddr)
 {
-	xfs_fsblock_t		fsbno;
-	xfs_agblock_t		agbno;
 	int			error;
 
 	error = xfs_btree_check_ptr(cur, ptr, 0, 1);
 	if (error)
 		return error;
 
-	if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN) {
-		fsbno = be64_to_cpu(ptr->l);
-		*daddr = XFS_FSB_TO_DADDR(cur->bc_mp, fsbno);
-	} else {
-		agbno = be32_to_cpu(ptr->s);
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_AG:
 		*daddr = XFS_AGB_TO_DADDR(cur->bc_mp, cur->bc_ag.pag->pag_agno,
-				agbno);
+				be32_to_cpu(ptr->s));
+		break;
+	case XFS_BTREE_TYPE_INODE:
+		*daddr = XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l));
+		break;
+	case XFS_BTREE_TYPE_MEM:
+		*daddr = xfbno_to_daddr(be64_to_cpu(ptr->l));
+		break;
 	}
-
 	return 0;
 }
 
@@ -983,8 +1118,9 @@ xfs_btree_readahead_ptr(
 
 	if (xfs_btree_ptr_to_daddr(cur, ptr, &daddr))
 		return;
-	xfs_buf_readahead(cur->bc_mp->m_ddev_targp, daddr,
-			  cur->bc_mp->m_bsize * count, cur->bc_ops->buf_ops);
+	xfs_buf_readahead(xfs_btree_buftarg(cur), daddr,
+			xfs_btree_bbsize(cur) * count,
+			cur->bc_ops->buf_ops);
 }
 
 /*
@@ -1169,9 +1305,17 @@ static inline __u64
 xfs_btree_owner(
 	struct xfs_btree_cur    *cur)
 {
-	if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE)
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_MEM:
+		return cur->bc_mem.xfbtree->owner;
+	case XFS_BTREE_TYPE_INODE:
 		return cur->bc_ino.ip->i_ino;
-	return cur->bc_ag.pag->pag_agno;
+	case XFS_BTREE_TYPE_AG:
+		return cur->bc_ag.pag->pag_agno;
+	default:
+		ASSERT(0);
+		return 0;
+	}
 }
 
 void
@@ -1215,12 +1359,18 @@ xfs_btree_buf_to_ptr(
 	struct xfs_buf		*bp,
 	union xfs_btree_ptr	*ptr)
 {
-	if (cur->bc_ops->ptr_len == XFS_BTREE_LONG_PTR_LEN)
-		ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp,
-					xfs_buf_daddr(bp)));
-	else {
+	switch (cur->bc_ops->type) {
+	case XFS_BTREE_TYPE_AG:
 		ptr->s = cpu_to_be32(xfs_daddr_to_agbno(cur->bc_mp,
 					xfs_buf_daddr(bp)));
+		break;
+	case XFS_BTREE_TYPE_INODE:
+		ptr->l = cpu_to_be64(XFS_DADDR_TO_FSB(cur->bc_mp,
+					xfs_buf_daddr(bp)));
+		break;
+	case XFS_BTREE_TYPE_MEM:
+		ptr->l = cpu_to_be64(xfs_daddr_to_xfbno(xfs_buf_daddr(bp)));
+		break;
 	}
 }
 
@@ -1239,15 +1389,14 @@ xfs_btree_get_buf_block(
 	struct xfs_btree_block		**block,
 	struct xfs_buf			**bpp)
 {
-	struct xfs_mount	*mp = cur->bc_mp;
-	xfs_daddr_t		d;
-	int			error;
+	xfs_daddr_t			d;
+	int				error;
 
 	error = xfs_btree_ptr_to_daddr(cur, ptr, &d);
 	if (error)
 		return error;
-	error = xfs_trans_get_buf(cur->bc_tp, mp->m_ddev_targp, d, mp->m_bsize,
-			0, bpp);
+	error = xfs_trans_get_buf(cur->bc_tp, xfs_btree_buftarg(cur), d,
+			xfs_btree_bbsize(cur), 0, bpp);
 	if (error)
 		return error;
 
@@ -1278,9 +1427,9 @@ xfs_btree_read_buf_block(
 	error = xfs_btree_ptr_to_daddr(cur, ptr, &d);
 	if (error)
 		return error;
-	error = xfs_trans_read_buf(mp, cur->bc_tp, mp->m_ddev_targp, d,
-				   mp->m_bsize, flags, bpp,
-				   cur->bc_ops->buf_ops);
+	error = xfs_trans_read_buf(mp, cur->bc_tp, xfs_btree_buftarg(cur), d,
+			xfs_btree_bbsize(cur), flags, bpp,
+			cur->bc_ops->buf_ops);
 	if (xfs_metadata_is_sick(error))
 		xfs_btree_mark_sick(cur);
 	if (error)
@@ -4579,6 +4728,8 @@ xfs_btree_fsblock_verify(
 	xfs_fsblock_t		fsb;
 	xfs_failaddr_t		fa;
 
+	ASSERT(!xfs_buftarg_is_mem(bp->b_target));
+
 	/* numrecs verification */
 	if (be16_to_cpu(block->bb_numrecs) > max_recs)
 		return __this_address;
@@ -4593,6 +4744,36 @@ xfs_btree_fsblock_verify(
 	return fa;
 }
 
+/* Verify an in-memory btree block. */
+xfs_failaddr_t
+xfs_btree_memblock_verify(
+	struct xfs_buf		*bp,
+	unsigned int		max_recs)
+{
+	struct xfs_btree_block	*block = XFS_BUF_TO_BLOCK(bp);
+	struct xfs_buftarg	*btp = bp->b_target;
+	xfs_failaddr_t		fa;
+	xfbno_t			bno;
+
+	ASSERT(xfs_buftarg_is_mem(bp->b_target));
+
+	/* numrecs verification */
+	if (be16_to_cpu(block->bb_numrecs) > max_recs)
+		return __this_address;
+
+	/* sibling pointer verification */
+	bno = xfs_daddr_to_xfbno(xfs_buf_daddr(bp));
+	fa = xfs_btree_check_memblock_siblings(btp, bno,
+			block->bb_u.l.bb_leftsib);
+	if (fa)
+		return fa;
+	fa = xfs_btree_check_memblock_siblings(btp, bno,
+			block->bb_u.l.bb_rightsib);
+	if (fa)
+		return fa;
+
+	return NULL;
+}
 /**
  * xfs_btree_agblock_v5hdr_verify() -- verify the v5 fields of a short-format
  *				      btree block
@@ -4634,6 +4815,8 @@ xfs_btree_agblock_verify(
 	xfs_agblock_t		agbno;
 	xfs_failaddr_t		fa;
 
+	ASSERT(!xfs_buftarg_is_mem(bp->b_target));
+
 	/* numrecs verification */
 	if (be16_to_cpu(block->bb_numrecs) > max_recs)
 		return __this_address;
diff --git a/libxfs/xfs_btree.h b/libxfs/xfs_btree.h
index bacd67cc8ced..f93374278aa1 100644
--- a/libxfs/xfs_btree.h
+++ b/libxfs/xfs_btree.h
@@ -112,6 +112,7 @@ static inline enum xbtree_key_contig xbtree_key_contig(uint64_t x, uint64_t y)
 enum xfs_btree_type {
 	XFS_BTREE_TYPE_AG,
 	XFS_BTREE_TYPE_INODE,
+	XFS_BTREE_TYPE_MEM,
 };
 
 struct xfs_btree_ops {
@@ -281,6 +282,10 @@ struct xfs_btree_cur
 			struct xfs_buf		*agbp;
 			struct xbtree_afakeroot	*afake;	/* for staging cursor */
 		} bc_ag;
+		struct {
+			struct xfbtree		*xfbtree;
+			struct xfs_perag	*pag;
+		} bc_mem;
 	};
 
 	/* per-format private data */
@@ -455,6 +460,8 @@ xfs_failaddr_t xfs_btree_fsblock_v5hdr_verify(struct xfs_buf *bp,
 		uint64_t owner);
 xfs_failaddr_t xfs_btree_fsblock_verify(struct xfs_buf *bp,
 		unsigned int max_recs);
+xfs_failaddr_t xfs_btree_memblock_verify(struct xfs_buf *bp,
+		unsigned int max_recs);
 
 unsigned int xfs_btree_compute_maxlevels(const unsigned int *limits,
 		unsigned long long records);
diff --git a/libxfs/xfs_btree_mem.c b/libxfs/xfs_btree_mem.c
new file mode 100644
index 000000000000..31835e065652
--- /dev/null
+++ b/libxfs/xfs_btree_mem.c
@@ -0,0 +1,227 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#include "libxfs_priv.h"
+#include "xfs_fs.h"
+#include "xfs_shared.h"
+#include "xfs_format.h"
+#include "xfs_log_format.h"
+#include "xfs_trans_resv.h"
+#include "xfs_mount.h"
+#include "xfs_trans.h"
+#include "xfs_btree.h"
+#include "xfile.h"
+#include "buf_mem.h"
+#include "xfs_btree_mem.h"
+#include "xfs_ag.h"
+#include "xfs_trace.h"
+
+/* Set the root of an in-memory btree. */
+void
+xfbtree_set_root(
+	struct xfs_btree_cur		*cur,
+	const union xfs_btree_ptr	*ptr,
+	int				inc)
+{
+	ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
+
+	cur->bc_mem.xfbtree->root = *ptr;
+	cur->bc_mem.xfbtree->nlevels += inc;
+}
+
+/* Initialize a pointer from the in-memory btree header. */
+void
+xfbtree_init_ptr_from_cur(
+	struct xfs_btree_cur		*cur,
+	union xfs_btree_ptr		*ptr)
+{
+	ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
+
+	*ptr = cur->bc_mem.xfbtree->root;
+}
+
+/* Duplicate an in-memory btree cursor. */
+struct xfs_btree_cur *
+xfbtree_dup_cursor(
+	struct xfs_btree_cur		*cur)
+{
+	struct xfs_btree_cur		*ncur;
+
+	ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
+
+	ncur = xfs_btree_alloc_cursor(cur->bc_mp, cur->bc_tp, cur->bc_ops,
+			cur->bc_maxlevels, cur->bc_cache);
+	ncur->bc_flags = cur->bc_flags;
+	ncur->bc_nlevels = cur->bc_nlevels;
+	ncur->bc_mem.xfbtree = cur->bc_mem.xfbtree;
+
+	if (cur->bc_mem.pag)
+		ncur->bc_mem.pag = xfs_perag_hold(cur->bc_mem.pag);
+
+	return ncur;
+}
+
+/* Close the btree xfile and release all resources. */
+void
+xfbtree_destroy(
+	struct xfbtree		*xfbt)
+{
+	xfs_buftarg_drain(xfbt->target);
+}
+
+/* Compute the number of bytes available for records. */
+static inline unsigned int
+xfbtree_rec_bytes(
+	struct xfs_mount		*mp,
+	const struct xfs_btree_ops	*ops)
+{
+	return XMBUF_BLOCKSIZE - XFS_BTREE_LBLOCK_CRC_LEN;
+}
+
+/* Initialize an empty leaf block as the btree root. */
+STATIC int
+xfbtree_init_leaf_block(
+	struct xfs_mount		*mp,
+	struct xfbtree			*xfbt,
+	const struct xfs_btree_ops	*ops)
+{
+	struct xfs_buf			*bp;
+	xfbno_t				bno = xfbt->highest_bno++;
+	int				error;
+
+	error = xfs_buf_get(xfbt->target, xfbno_to_daddr(bno), XFBNO_BBSIZE,
+			&bp);
+	if (error)
+		return error;
+
+	trace_xfbtree_create_root_buf(xfbt, bp);
+
+	bp->b_ops = ops->buf_ops;
+	xfs_btree_init_buf(mp, bp, ops, 0, 0, xfbt->owner);
+	xfs_buf_relse(bp);
+
+	xfbt->root.l = cpu_to_be64(bno);
+	return 0;
+}
+
+/*
+ * Create an in-memory btree root that can be used with the given xmbuf.
+ * Callers must set xfbt->owner.
+ */
+int
+xfbtree_init(
+	struct xfs_mount		*mp,
+	struct xfbtree			*xfbt,
+	struct xfs_buftarg		*btp,
+	const struct xfs_btree_ops	*ops)
+{
+	unsigned int			blocklen = xfbtree_rec_bytes(mp, ops);
+	unsigned int			keyptr_len;
+	int				error;
+
+	/* Requires a long-format CRC-format btree */
+	if (!xfs_has_crc(mp)) {
+		ASSERT(xfs_has_crc(mp));
+		return -EINVAL;
+	}
+	if (ops->ptr_len != XFS_BTREE_LONG_PTR_LEN) {
+		ASSERT(ops->ptr_len == XFS_BTREE_LONG_PTR_LEN);
+		return -EINVAL;
+	}
+
+	memset(xfbt, 0, sizeof(*xfbt));
+	xfbt->target = btp;
+
+	/* Set up min/maxrecs for this btree. */
+	keyptr_len = ops->key_len + sizeof(__be64);
+	xfbt->maxrecs[0] = blocklen / ops->rec_len;
+	xfbt->maxrecs[1] = blocklen / keyptr_len;
+	xfbt->minrecs[0] = xfbt->maxrecs[0] / 2;
+	xfbt->minrecs[1] = xfbt->maxrecs[1] / 2;
+	xfbt->highest_bno = 0;
+	xfbt->nlevels = 1;
+
+	/* Initialize the empty btree. */
+	error = xfbtree_init_leaf_block(mp, xfbt, ops);
+	if (error)
+		goto err_freesp;
+
+	trace_xfbtree_init(mp, xfbt, ops);
+
+	return 0;
+
+err_freesp:
+	xfs_buftarg_drain(xfbt->target);
+	return error;
+}
+
+/* Allocate a block to our in-memory btree. */
+int
+xfbtree_alloc_block(
+	struct xfs_btree_cur		*cur,
+	const union xfs_btree_ptr	*start,
+	union xfs_btree_ptr		*new,
+	int				*stat)
+{
+	struct xfbtree			*xfbt = cur->bc_mem.xfbtree;
+	xfbno_t				bno = xfbt->highest_bno++;
+
+	ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
+
+	trace_xfbtree_alloc_block(xfbt, cur, bno);
+
+	/* Fail if the block address exceeds the maximum for the buftarg. */
+	if (!xfbtree_verify_bno(xfbt, bno)) {
+		ASSERT(xfbtree_verify_bno(xfbt, bno));
+		*stat = 0;
+		return 0;
+	}
+
+	new->l = cpu_to_be64(bno);
+	*stat = 1;
+	return 0;
+}
+
+/* Free a block from our in-memory btree. */
+int
+xfbtree_free_block(
+	struct xfs_btree_cur	*cur,
+	struct xfs_buf		*bp)
+{
+	struct xfbtree		*xfbt = cur->bc_mem.xfbtree;
+	xfs_daddr_t		daddr = xfs_buf_daddr(bp);
+	xfbno_t			bno = xfs_daddr_to_xfbno(daddr);
+
+	ASSERT(cur->bc_ops->type == XFS_BTREE_TYPE_MEM);
+
+	trace_xfbtree_free_block(xfbt, cur, bno);
+
+	if (bno + 1 == xfbt->highest_bno)
+		xfbt->highest_bno--;
+
+	return 0;
+}
+
+/* Return the minimum number of records for a btree block. */
+int
+xfbtree_get_minrecs(
+	struct xfs_btree_cur	*cur,
+	int			level)
+{
+	struct xfbtree		*xfbt = cur->bc_mem.xfbtree;
+
+	return xfbt->minrecs[level != 0];
+}
+
+/* Return the maximum number of records for a btree block. */
+int
+xfbtree_get_maxrecs(
+	struct xfs_btree_cur	*cur,
+	int			level)
+{
+	struct xfbtree		*xfbt = cur->bc_mem.xfbtree;
+
+	return xfbt->maxrecs[level != 0];
+}
diff --git a/libxfs/xfs_btree_mem.h b/libxfs/xfs_btree_mem.h
new file mode 100644
index 000000000000..ecc2ceac3ed4
--- /dev/null
+++ b/libxfs/xfs_btree_mem.h
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (c) 2021-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#ifndef __XFS_BTREE_MEM_H__
+#define __XFS_BTREE_MEM_H__
+
+typedef uint64_t xfbno_t;
+
+#define XFBNO_BLOCKSIZE			(XMBUF_BLOCKSIZE)
+#define XFBNO_BBSHIFT			(XMBUF_BLOCKSHIFT - BBSHIFT)
+#define XFBNO_BBSIZE			(XFBNO_BLOCKSIZE >> BBSHIFT)
+
+static inline xfs_daddr_t xfbno_to_daddr(xfbno_t blkno)
+{
+	return blkno << XFBNO_BBSHIFT;
+}
+
+static inline xfbno_t xfs_daddr_to_xfbno(xfs_daddr_t daddr)
+{
+	return daddr >> XFBNO_BBSHIFT;
+}
+
+struct xfbtree {
+	/* buffer cache target for this in-memory btree */
+	struct xfs_buftarg		*target;
+
+	/* Highest block number that has been written to. */
+	xfbno_t				highest_bno;
+
+	/* Owner of this btree. */
+	unsigned long long		owner;
+
+	/* Btree header */
+	union xfs_btree_ptr		root;
+	unsigned int			nlevels;
+
+	/* Minimum and maximum records per block. */
+	unsigned int			maxrecs[2];
+	unsigned int			minrecs[2];
+};
+
+#ifdef CONFIG_XFS_BTREE_IN_MEM
+static inline bool xfbtree_verify_bno(struct xfbtree *xfbt, xfbno_t bno)
+{
+	return xmbuf_verify_daddr(xfbt->target, xfbno_to_daddr(bno));
+}
+
+void xfbtree_set_root(struct xfs_btree_cur *cur,
+		const union xfs_btree_ptr *ptr, int inc);
+void xfbtree_init_ptr_from_cur(struct xfs_btree_cur *cur,
+		union xfs_btree_ptr *ptr);
+struct xfs_btree_cur *xfbtree_dup_cursor(struct xfs_btree_cur *cur);
+
+int xfbtree_get_minrecs(struct xfs_btree_cur *cur, int level);
+int xfbtree_get_maxrecs(struct xfs_btree_cur *cur, int level);
+
+int xfbtree_alloc_block(struct xfs_btree_cur *cur,
+		const union xfs_btree_ptr *start, union xfs_btree_ptr *ptr,
+		int *stat);
+int xfbtree_free_block(struct xfs_btree_cur *cur, struct xfs_buf *bp);
+
+/* Callers must set xfbt->target and xfbt->owner before calling this */
+int xfbtree_init(struct xfs_mount *mp, struct xfbtree *xfbt,
+		struct xfs_buftarg *btp, const struct xfs_btree_ops *ops);
+void xfbtree_destroy(struct xfbtree *xfbt);
+#else
+# define xfbtree_verify_bno(...)	(false)
+#endif /* CONFIG_XFS_BTREE_IN_MEM */
+
+#endif /* __XFS_BTREE_MEM_H__ */


  parent reply	other threads:[~2024-03-26  3:52 UTC|newest]

Thread overview: 307+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-26  2:45 [PATCHBOMB v2] xfsprogs: everything headed towards 6.9 Darrick J. Wong
2024-03-26  2:54 ` Darrick J. Wong
2024-03-26  2:54 ` [PATCHSET 01/18] xfsprogs: convert utilities to use new rt helpers Darrick J. Wong
2024-03-26  2:59   ` [PATCH 01/13] libxfs: fix incorrect porting to 6.7 Darrick J. Wong
2024-03-26  2:59   ` [PATCH 02/13] mkfs: fix log sunit rounding when external logs are in use Darrick J. Wong
2024-03-26  3:00   ` [PATCH 03/13] xfs_repair: fix confusing rt space units in the duplicate detection code Darrick J. Wong
2024-03-26  3:00   ` [PATCH 04/13] libxfs: create a helper to compute leftovers of realtime extents Darrick J. Wong
2024-03-26  3:00   ` [PATCH 05/13] libxfs: use helpers to convert rt block numbers to rt extent numbers Darrick J. Wong
2024-03-26  3:00   ` [PATCH 06/13] xfs_repair: convert utility to use new rt extent helpers and types Darrick J. Wong
2024-03-26  3:01   ` [PATCH 07/13] mkfs: " Darrick J. Wong
2024-03-26  3:01   ` [PATCH 08/13] xfs_{db,repair}: convert open-coded xfs_rtword_t pointer accesses to helper Darrick J. Wong
2024-03-26  3:01   ` [PATCH 09/13] xfs_repair: convert helpers for rtbitmap block/wordcount computations Darrick J. Wong
2024-03-26  3:02   ` [PATCH 10/13] xfs_{db,repair}: use accessor functions for bitmap words Darrick J. Wong
2024-03-26  3:02   ` [PATCH 11/13] xfs_{db,repair}: use helpers for rtsummary block/wordcount computations Darrick J. Wong
2024-03-26  3:02   ` [PATCH 12/13] xfs_{db,repair}: use accessor functions for summary info words Darrick J. Wong
2024-03-26  3:02   ` [PATCH 13/13] xfs_{db,repair}: use m_blockwsize instead of sb_blocksize for rt blocks Darrick J. Wong
2024-03-26  2:55 ` [PATCHSET 02/18] libxfs: sync with 6.8 Darrick J. Wong
2024-03-26  3:03   ` [PATCH 01/67] xfs: use xfs_defer_pending objects to recover intent items Darrick J. Wong
2024-03-26  3:03   ` [PATCH 02/67] xfs: recreate work items when recovering " Darrick J. Wong
2024-03-26  3:03   ` [PATCH 03/67] xfs: use xfs_defer_finish_one to finish recovered work items Darrick J. Wong
2024-03-26  3:03   ` [PATCH 04/67] xfs: move ->iop_recover to xfs_defer_op_type Darrick J. Wong
2024-03-26  3:04   ` [PATCH 05/67] xfs: hoist intent done flag setting to ->finish_item callsite Darrick J. Wong
2024-03-26  3:04   ` [PATCH 06/67] xfs: hoist ->create_intent boilerplate to its callsite Darrick J. Wong
2024-03-26  3:04   ` [PATCH 07/67] xfs: use xfs_defer_create_done for the relogging operation Darrick J. Wong
2024-03-26  3:04   ` [PATCH 08/67] xfs: clean out XFS_LI_DIRTY setting boilerplate from ->iop_relog Darrick J. Wong
2024-03-26  3:05   ` [PATCH 09/67] xfs: hoist xfs_trans_add_item calls to defer ops functions Darrick J. Wong
2024-03-26  3:05   ` [PATCH 10/67] xfs: move ->iop_relog to struct xfs_defer_op_type Darrick J. Wong
2024-03-26  3:05   ` [PATCH 11/67] xfs: make rextslog computation consistent with mkfs Darrick J. Wong
2024-03-26  3:05   ` [PATCH 12/67] xfs: fix 32-bit truncation in xfs_compute_rextslog Darrick J. Wong
2024-03-26  3:06   ` [PATCH 13/67] xfs: don't allow overly small or large realtime volumes Darrick J. Wong
2024-03-26  3:06   ` [PATCH 14/67] xfs: elide ->create_done calls for unlogged deferred work Darrick J. Wong
2024-03-26  3:06   ` [PATCH 15/67] xfs: don't append work items to logged xfs_defer_pending objects Darrick J. Wong
2024-03-26  3:07   ` [PATCH 16/67] xfs: allow pausing of pending deferred work items Darrick J. Wong
2024-03-26  3:07   ` [PATCH 17/67] xfs: remove __xfs_free_extent_later Darrick J. Wong
2024-03-26  3:07   ` [PATCH 18/67] xfs: automatic freeing of freshly allocated unwritten space Darrick J. Wong
2024-03-26  3:07   ` [PATCH 19/67] xfs: remove unused fields from struct xbtree_ifakeroot Darrick J. Wong
2024-03-26  3:08   ` [PATCH 20/67] xfs: force small EFIs for reaping btree extents Darrick J. Wong
2024-03-26  3:08   ` [PATCH 21/67] xfs: ensure logflagsp is initialized in xfs_bmap_del_extent_real Darrick J. Wong
2024-03-26  3:08   ` [PATCH 22/67] xfs: update dir3 leaf block metadata after swap Darrick J. Wong
2024-03-26  3:08   ` [PATCH 23/67] xfs: extract xfs_da_buf_copy() helper function Darrick J. Wong
2024-03-26  3:09   ` [PATCH 24/67] xfs: move xfs_ondisk.h to libxfs/ Darrick J. Wong
2024-03-26  3:09   ` [PATCH 25/67] xfs: consolidate the xfs_attr_defer_* helpers Darrick J. Wong
2024-03-26  3:09   ` [PATCH 26/67] xfs: store an ops pointer in struct xfs_defer_pending Darrick J. Wong
2024-03-26  3:09   ` [PATCH 27/67] xfs: pass the defer ops instead of type to xfs_defer_start_recovery Darrick J. Wong
2024-03-26  3:10   ` [PATCH 28/67] xfs: pass the defer ops directly to xfs_defer_add Darrick J. Wong
2024-03-26  3:10   ` [PATCH 29/67] xfs: force all buffers to be written during btree bulk load Darrick J. Wong
2024-03-26  3:10   ` [PATCH 30/67] xfs: set XBF_DONE on newly formatted btree block that are ready for writing Darrick J. Wong
2024-03-26  3:10   ` [PATCH 31/67] xfs: read leaf blocks when computing keys for bulkloading into node blocks Darrick J. Wong
2024-03-26  3:11   ` [PATCH 32/67] xfs: move btree bulkload record initialization to ->get_record implementations Darrick J. Wong
2024-03-26  3:11   ` [PATCH 33/67] xfs: constrain dirty buffers while formatting a staged btree Darrick J. Wong
2024-03-26  3:11   ` [PATCH 34/67] xfs: repair free space btrees Darrick J. Wong
2024-03-26  3:11   ` [PATCH 35/67] xfs: repair inode btrees Darrick J. Wong
2024-03-26  3:12   ` [PATCH 36/67] xfs: repair refcount btrees Darrick J. Wong
2024-03-26  3:12   ` [PATCH 37/67] xfs: dont cast to char * for XFS_DFORK_*PTR macros Darrick J. Wong
2024-03-26  3:12   ` [PATCH 38/67] xfs: set inode sick state flags when we zap either ondisk fork Darrick J. Wong
2024-03-26  3:13   ` [PATCH 39/67] xfs: zap broken inode forks Darrick J. Wong
2024-03-26  3:13   ` [PATCH 40/67] xfs: repair inode fork block mapping data structures Darrick J. Wong
2024-03-26  3:13   ` [PATCH 41/67] xfs: create a ranged query function for refcount btrees Darrick J. Wong
2024-03-26  3:13   ` [PATCH 42/67] xfs: create a new inode fork block unmap helper Darrick J. Wong
2024-03-26  3:14   ` [PATCH 43/67] xfs: improve dquot iteration for scrub Darrick J. Wong
2024-03-26  3:14   ` [PATCH 44/67] xfs: add lock protection when remove perag from radix tree Darrick J. Wong
2024-03-26  3:14   ` [PATCH 45/67] xfs: fix perag leak when growfs fails Darrick J. Wong
2024-03-26  3:14   ` [PATCH 46/67] xfs: remove the xfs_alloc_arg argument to xfs_bmap_btalloc_accounting Darrick J. Wong
2024-03-26  3:15   ` [PATCH 47/67] xfs: also use xfs_bmap_btalloc_accounting for RT allocations Darrick J. Wong
2024-03-26  3:15   ` [PATCH 48/67] xfs: return -ENOSPC from xfs_rtallocate_* Darrick J. Wong
2024-03-26  3:15   ` [PATCH 49/67] xfs: indicate if xfs_bmap_adjacent changed ap->blkno Darrick J. Wong
2024-03-26  3:15   ` [PATCH 50/67] xfs: move xfs_rtget_summary to xfs_rtbitmap.c Darrick J. Wong
2024-03-26  3:16   ` [PATCH 51/67] xfs: split xfs_rtmodify_summary_int Darrick J. Wong
2024-03-26  3:16   ` [PATCH 52/67] xfs: remove rt-wrappers from xfs_format.h Darrick J. Wong
2024-03-26  3:16   ` [PATCH 53/67] xfs: remove XFS_RTMIN/XFS_RTMAX Darrick J. Wong
2024-03-26  3:16   ` [PATCH 54/67] xfs: make if_data a void pointer Darrick J. Wong
2024-03-26  3:17   ` [PATCH 55/67] xfs: return if_data from xfs_idata_realloc Darrick J. Wong
2024-03-26  3:17   ` [PATCH 56/67] xfs: move the xfs_attr_sf_lookup tracepoint Darrick J. Wong
2024-03-26  3:17   ` [PATCH 57/67] xfs: simplify xfs_attr_sf_findname Darrick J. Wong
2024-03-26  3:17   ` [PATCH 58/67] xfs: remove xfs_attr_shortform_lookup Darrick J. Wong
2024-03-26  3:18   ` [PATCH 59/67] xfs: use xfs_attr_sf_findname in xfs_attr_shortform_getvalue Darrick J. Wong
2024-03-26  3:18   ` [PATCH 60/67] xfs: remove struct xfs_attr_shortform Darrick J. Wong
2024-03-26  3:18   ` [PATCH 61/67] xfs: remove xfs_attr_sf_hdr_t Darrick J. Wong
2024-03-26  3:19   ` [PATCH 62/67] xfs: turn the XFS_DA_OP_REPLACE checks in xfs_attr_shortform_addname into asserts Darrick J. Wong
2024-03-26  3:19   ` [PATCH 63/67] xfs: fix a use after free in xfs_defer_finish_recovery Darrick J. Wong
2024-03-26  3:19   ` [PATCH 64/67] xfs: use the op name in trace_xlog_intent_recovery_failed Darrick J. Wong
2024-03-26  3:19   ` [PATCH 65/67] xfs: fix backwards logic in xfs_bmap_alloc_account Darrick J. Wong
2024-03-26  3:20   ` [PATCH 66/67] xfs: reset XFS_ATTR_INCOMPLETE filter on node removal Darrick J. Wong
2024-03-26  3:20   ` [PATCH 67/67] xfs: remove conditional building of rt geometry validator functions Darrick J. Wong
2024-03-26  2:55 ` [PATCHSET 03/18] xfs_repair: faster btree bulkloading Darrick J. Wong
2024-03-26  3:20   ` [PATCH 1/2] xfs_repair: adjust btree bulkloading slack computations to match online repair Darrick J. Wong
2024-03-26  3:20   ` [PATCH 2/2] xfs_repair: bulk load records into new btree blocks Darrick J. Wong
2024-03-26  2:55 ` [PATCHSET 04/18] xfsprogs: bug fixes for 6.8 Darrick J. Wong
2024-03-26  3:21   ` [PATCH 1/5] xfs_repair: double-check with shortform attr verifiers Darrick J. Wong
2024-03-26  3:21   ` [PATCH 2/5] xfs_db: fix alignment checks in getbitval Darrick J. Wong
2024-03-26  5:14     ` Christoph Hellwig
2024-03-26 16:28       ` Darrick J. Wong
2024-03-26 16:36         ` Christoph Hellwig
2024-03-26 17:31           ` Darrick J. Wong
2024-03-26  3:21   ` [PATCH 3/5] xfs_scrub: fix threadcount estimates for phase 6 Darrick J. Wong
2024-03-26  5:15     ` Christoph Hellwig
2024-03-26 16:30       ` Darrick J. Wong
2024-03-26 16:36         ` Christoph Hellwig
2024-03-26  3:21   ` [PATCH 4/5] xfs_scrub: don't fail while reporting media scan errors Darrick J. Wong
2024-03-26  5:15     ` Christoph Hellwig
2024-03-26  3:22   ` [PATCH 5/5] xfs_io: add linux madvise advice codes Darrick J. Wong
2024-03-26  5:15     ` Christoph Hellwig
2024-03-26  2:56 ` [PATCHSET V2 05/18] xfsprogs: fix log sector size detection Darrick J. Wong
2024-03-26  3:00   ` Darrick J. Wong
2024-03-26  5:16     ` Christoph Hellwig
2024-03-26  3:22   ` [PATCH 1/5] libxfs: remove the unused fs_topology_t typedef Darrick J. Wong
2024-03-26  3:22   ` [PATCH 2/5] libxfs: refactor the fs_topology structure Darrick J. Wong
2024-03-26  3:22   ` [PATCH 3/5] libxfs: remove the S_ISREG check from blkid_get_topology Darrick J. Wong
2024-03-26  3:23   ` [PATCH 4/5] libxfs: also query log device topology in get_topology Darrick J. Wong
2024-03-26  3:23   ` [PATCH 5/5] mkfs: use a sensible log sector size default Darrick J. Wong
2024-03-26  2:56 ` [PATCHSET 06/18] mkfs: scale shards on ssds Darrick J. Wong
2024-03-26  3:23   ` [PATCH 1/2] mkfs: allow sizing allocation groups for concurrency Darrick J. Wong
2024-03-26  3:23   ` [PATCH 2/2] mkfs: allow sizing internal logs " Darrick J. Wong
2024-03-26  2:56 ` [PATCHSET v29.4 07/18] xfs_scrub: scan metadata files in parallel Darrick J. Wong
2024-03-26  3:24   ` [PATCH 1/3] libfrog: rename XFROG_SCRUB_TYPE_* to XFROG_SCRUB_GROUP_* Darrick J. Wong
2024-03-26  3:24   ` [PATCH 2/3] libfrog: promote XFROG_SCRUB_DESCR_SUMMARY to a scrub type Darrick J. Wong
2024-03-26  3:24   ` [PATCH 3/3] xfs_scrub: scan whole-fs metadata files in parallel Darrick J. Wong
2024-03-26  2:56 ` [PATCHSET v29.4 08/18] xfs_repair: rebuild inode fork mappings Darrick J. Wong
2024-03-26  3:25   ` [PATCH 1/3] xfs_repair: push inode buf and dinode pointers all the way to inode fork processing Darrick J. Wong
2024-03-26  3:25   ` [PATCH 2/3] xfs_repair: sync bulkload data structures with kernel newbt code Darrick J. Wong
2024-03-26  3:25   ` [PATCH 3/3] xfs_repair: rebuild block mappings from rmapbt data Darrick J. Wong
2024-03-26  2:57 ` [PATCHSET 09/18] xfs_repair: support more than 4 billion records Darrick J. Wong
2024-03-26  3:25   ` [PATCH 1/8] xfs_db: add a bmbt inflation command Darrick J. Wong
2024-03-26  3:26   ` [PATCH 2/8] xfs_repair: slab and bag structs need to track more than 2^32 items Darrick J. Wong
2024-03-26  3:26   ` [PATCH 3/8] xfs_repair: support more than 2^32 rmapbt records per AG Darrick J. Wong
2024-03-26  3:26   ` [PATCH 4/8] xfs_repair: support more than 2^32 owners per physical block Darrick J. Wong
2024-03-26  3:26   ` [PATCH 5/8] xfs_repair: clean up lock resources Darrick J. Wong
2024-03-26  3:27   ` [PATCH 6/8] xfs_repair: constrain attr fork extent count Darrick J. Wong
2024-03-26  3:27   ` [PATCH 7/8] xfs_repair: don't create block maps for data files Darrick J. Wong
2024-03-26  3:27   ` [PATCH 8/8] xfs_repair: support more than INT_MAX block maps Darrick J. Wong
2024-03-26  2:57 ` [PATCHSET v29.4 10/18] libxfs: prepare to sync with 6.9 Darrick J. Wong
2024-03-26  3:27   ` [PATCH 1/3] libxfs: actually set m_fsname Darrick J. Wong
2024-03-26  3:28   ` [PATCH 2/3] libxfs: clean up xfs_da_unmount usage Darrick J. Wong
2024-03-26  3:28   ` [PATCH 3/3] libfrog: create a new scrub group for things requiring full inode scans Darrick J. Wong
2024-03-26  2:57 ` [PATCHSET 11/18] libxfs: sync with 6.9 Darrick J. Wong
2024-03-26  3:28   ` [PATCH 001/110] xfs: convert kmem_zalloc() to kzalloc() Darrick J. Wong
2024-03-26  3:28   ` [PATCH 002/110] xfs: convert kmem_alloc() to kmalloc() Darrick J. Wong
2024-03-26  3:29   ` [PATCH 003/110] xfs: convert remaining kmem_free() to kfree() Darrick J. Wong
2024-03-26  3:29   ` [PATCH 004/110] xfs: use __GFP_NOLOCKDEP instead of GFP_NOFS Darrick J. Wong
2024-03-26  3:29   ` [PATCH 005/110] xfs: use GFP_KERNEL in pure transaction contexts Darrick J. Wong
2024-03-26  3:29   ` [PATCH 006/110] xfs: clean up remaining GFP_NOFS users Darrick J. Wong
2024-03-26  3:30   ` [PATCH 007/110] xfs: use xfs_defer_alloc a bit more Darrick J. Wong
2024-03-26  3:30   ` [PATCH 008/110] xfs: Replace xfs_isilocked with xfs_assert_ilocked Darrick J. Wong
2024-03-26  3:30   ` [PATCH 009/110] xfs: create a static name for the dot entry too Darrick J. Wong
2024-03-26  3:31   ` [PATCH 010/110] xfs: create a predicate to determine if two xfs_names are the same Darrick J. Wong
2024-03-26  3:31   ` [PATCH 011/110] xfs: create a macro for decoding ftypes in tracepoints Darrick J. Wong
2024-03-26  3:31   ` [PATCH 012/110] xfs: report the health of quota counts Darrick J. Wong
2024-03-26  3:31   ` [PATCH 013/110] xfs: implement live quotacheck inode scan Darrick J. Wong
2024-03-26  3:32   ` [PATCH 014/110] xfs: report health of inode link counts Darrick J. Wong
2024-03-26  3:32   ` [PATCH 015/110] xfs: teach scrub to check file nlinks Darrick J. Wong
2024-03-26  3:32   ` [PATCH 016/110] xfs: separate the marking of sick and checked metadata Darrick J. Wong
2024-03-26  3:32   ` [PATCH 017/110] xfs: report fs corruption errors to the health tracking system Darrick J. Wong
2024-03-26  3:33   ` [PATCH 018/110] xfs: report ag header " Darrick J. Wong
2024-03-26  3:33   ` [PATCH 019/110] xfs: report block map " Darrick J. Wong
2024-03-26  3:33   ` [PATCH 020/110] xfs: report btree block corruption errors to the health system Darrick J. Wong
2024-03-26  3:33   ` [PATCH 021/110] xfs: report dir/attr " Darrick J. Wong
2024-03-26  3:34   ` [PATCH 022/110] xfs: report inode " Darrick J. Wong
2024-03-26  3:34   ` [PATCH 023/110] xfs: report realtime metadata " Darrick J. Wong
2024-03-26  3:34   ` [PATCH 024/110] xfs: report XFS_IS_CORRUPT " Darrick J. Wong
2024-03-26  3:34   ` [PATCH 025/110] xfs: add secondary and indirect classes to the health tracking system Darrick J. Wong
2024-03-26  3:35   ` [PATCH 026/110] xfs: remember sick inodes that get inactivated Darrick J. Wong
2024-03-26  3:35   ` [PATCH 027/110] xfs: update health status if we get a clean bill of health Darrick J. Wong
2024-03-26  3:35   ` [PATCH 028/110] xfs: consolidate btree block freeing tracepoints Darrick J. Wong
2024-03-26  3:35   ` [PATCH 029/110] xfs: consolidate btree block allocation tracepoints Darrick J. Wong
2024-03-26  3:36   ` [PATCH 030/110] xfs: set the btree cursor bc_ops in xfs_btree_alloc_cursor Darrick J. Wong
2024-03-26  3:36   ` [PATCH 031/110] xfs: drop XFS_BTREE_CRC_BLOCKS Darrick J. Wong
2024-03-26  3:36   ` [PATCH 032/110] xfs: encode the btree geometry flags in the btree ops structure Darrick J. Wong
2024-03-26  3:37   ` [PATCH 033/110] xfs: remove bc_ino.flags Darrick J. Wong
2024-03-26  3:37   ` [PATCH 034/110] xfs: consolidate the xfs_alloc_lookup_* helpers Darrick J. Wong
2024-03-26  3:37   ` [PATCH 035/110] xfs: turn the allocbt cursor active field into a btree flag Darrick J. Wong
2024-03-26  3:37   ` [PATCH 036/110] xfs: extern some btree ops structures Darrick J. Wong
2024-03-26  3:38   ` [PATCH 037/110] xfs: initialize btree blocks using btree_ops structure Darrick J. Wong
2024-03-26  3:38   ` [PATCH 038/110] xfs: rename btree block/buffer init functions Darrick J. Wong
2024-03-26  3:38   ` [PATCH 039/110] xfs: btree convert xfs_btree_init_block to xfs_btree_init_buf calls Darrick J. Wong
2024-03-26  3:38   ` [PATCH 040/110] xfs: remove the unnecessary daddr paramter to _init_block Darrick J. Wong
2024-03-26  3:39   ` [PATCH 041/110] xfs: set btree block buffer ops in _init_buf Darrick J. Wong
2024-03-26  3:39   ` [PATCH 042/110] xfs: move lru refs to the btree ops structure Darrick J. Wong
2024-03-26  3:39   ` [PATCH 043/110] xfs: move the btree stats offset into struct btree_ops Darrick J. Wong
2024-03-26  3:39   ` [PATCH 044/110] xfs: factor out a xfs_btree_owner helper Darrick J. Wong
2024-03-26  3:40   ` [PATCH 045/110] xfs: factor out a btree block owner check Darrick J. Wong
2024-03-26  3:40   ` [PATCH 046/110] xfs: store the btree pointer length in struct xfs_btree_ops Darrick J. Wong
2024-03-26  3:40   ` [PATCH 047/110] xfs: split out a btree type from the btree ops geometry flags Darrick J. Wong
2024-03-26  3:40   ` [PATCH 048/110] xfs: split the per-btree union in struct xfs_btree_cur Darrick J. Wong
2024-03-26  3:41   ` [PATCH 049/110] xfs: create predicate to determine if cursor is at inode root level Darrick J. Wong
2024-03-26  3:41   ` [PATCH 050/110] xfs: move comment about two 2 keys per pointer in the rmap btree Darrick J. Wong
2024-03-26  3:41   ` [PATCH 051/110] xfs: add a xfs_btree_init_ptr_from_cur Darrick J. Wong
2024-03-26  3:41   ` [PATCH 052/110] xfs: don't override bc_ops for staging btrees Darrick J. Wong
2024-03-26  3:42   ` [PATCH 053/110] xfs: fold xfs_allocbt_init_common into xfs_allocbt_init_cursor Darrick J. Wong
2024-03-26  3:42   ` [PATCH 054/110] xfs: remove xfs_allocbt_stage_cursor Darrick J. Wong
2024-03-26  3:42   ` [PATCH 055/110] xfs: fold xfs_inobt_init_common into xfs_inobt_init_cursor Darrick J. Wong
2024-03-26  3:43   ` [PATCH 056/110] xfs: remove xfs_inobt_stage_cursor Darrick J. Wong
2024-03-26  3:43   ` [PATCH 057/110] xfs: fold xfs_refcountbt_init_common into xfs_refcountbt_init_cursor Darrick J. Wong
2024-03-26  3:43   ` [PATCH 058/110] xfs: remove xfs_refcountbt_stage_cursor Darrick J. Wong
2024-03-26  3:43   ` [PATCH 059/110] xfs: fold xfs_rmapbt_init_common into xfs_rmapbt_init_cursor Darrick J. Wong
2024-03-26  3:44   ` [PATCH 060/110] xfs: remove xfs_rmapbt_stage_cursor Darrick J. Wong
2024-03-26  3:44   ` [PATCH 061/110] xfs: make full use of xfs_btree_stage_ifakeroot in xfs_bmbt_stage_cursor Darrick J. Wong
2024-03-26  3:44   ` [PATCH 062/110] xfs: make staging file forks explicit Darrick J. Wong
2024-03-26  3:44   ` [PATCH 063/110] xfs: fold xfs_bmbt_init_common into xfs_bmbt_init_cursor Darrick J. Wong
2024-03-26  3:45   ` [PATCH 064/110] xfs: remove xfs_bmbt_stage_cursor Darrick J. Wong
2024-03-26  3:45   ` [PATCH 065/110] xfs: split the agf_roots and agf_levels arrays Darrick J. Wong
2024-03-26  3:45   ` [PATCH 066/110] xfs: add a name field to struct xfs_btree_ops Darrick J. Wong
2024-03-26  3:45   ` [PATCH 067/110] xfs: add a sick_mask " Darrick J. Wong
2024-03-26  3:46   ` [PATCH 068/110] xfs: split xfs_allocbt_init_cursor Darrick J. Wong
2024-03-26  3:46   ` [PATCH 069/110] xfs: remove xfs_inobt_cur Darrick J. Wong
2024-03-26  3:46   ` [PATCH 070/110] xfs: remove the btnum argument to xfs_inobt_count_blocks Darrick J. Wong
2024-03-26  3:46   ` [PATCH 071/110] xfs: split xfs_inobt_insert_sprec Darrick J. Wong
2024-03-26  3:47   ` [PATCH 072/110] xfs: split xfs_inobt_init_cursor Darrick J. Wong
2024-03-26  3:47   ` [PATCH 073/110] xfs: pass a 'bool is_finobt' to xfs_inobt_insert Darrick J. Wong
2024-03-26  3:47   ` [PATCH 074/110] xfs: remove xfs_btnum_t Darrick J. Wong
2024-03-26  3:47   ` [PATCH 075/110] xfs: simplify xfs_btree_check_sblock_siblings Darrick J. Wong
2024-03-26  3:48   ` [PATCH 076/110] xfs: simplify xfs_btree_check_lblock_siblings Darrick J. Wong
2024-03-26  3:48   ` [PATCH 077/110] xfs: open code xfs_btree_check_lptr in xfs_bmap_btree_to_extents Darrick J. Wong
2024-03-26  3:48   ` [PATCH 078/110] xfs: consolidate btree ptr checking Darrick J. Wong
2024-03-26  3:49   ` [PATCH 079/110] xfs: misc cleanups for __xfs_btree_check_sblock Darrick J. Wong
2024-03-26  3:49   ` [PATCH 080/110] xfs: remove the crc variable in __xfs_btree_check_lblock Darrick J. Wong
2024-03-26  3:49   ` [PATCH 081/110] xfs: tighten up validation of root block in inode forks Darrick J. Wong
2024-03-26  3:49   ` [PATCH 082/110] xfs: consolidate btree block verification Darrick J. Wong
2024-03-26  3:50   ` [PATCH 083/110] xfs: rename btree helpers that depends on the block number representation Darrick J. Wong
2024-03-26  3:50   ` [PATCH 084/110] xfs: factor out a __xfs_btree_check_lblock_hdr helper Darrick J. Wong
2024-03-26  3:50   ` [PATCH 085/110] xfs: remove xfs_btree_reada_bufl Darrick J. Wong
2024-03-26  3:50   ` [PATCH 086/110] xfs: remove xfs_btree_reada_bufs Darrick J. Wong
2024-03-26  3:51   ` [PATCH 087/110] xfs: move and rename xfs_btree_read_bufl Darrick J. Wong
2024-03-26  3:51   ` [PATCH 088/110] libxfs: teach buftargs to maintain their own buffer hashtable Darrick J. Wong
2024-03-26  3:51   ` [PATCH 089/110] libxfs: add xfile support Darrick J. Wong
2024-03-26  5:29     ` Christoph Hellwig
2024-03-26 16:47       ` Darrick J. Wong
2024-03-26 16:49         ` Christoph Hellwig
2024-03-26 16:51           ` Darrick J. Wong
2024-03-26 17:06             ` Christoph Hellwig
2024-03-26  5:37     ` Christoph Hellwig
2024-03-26 16:50       ` Darrick J. Wong
2024-03-26  3:51   ` [PATCH 090/110] libxfs: partition memfd files to avoid using too many fds Darrick J. Wong
2024-03-26  3:52   ` [PATCH 091/110] xfs: teach buftargs to maintain their own buffer hashtable Darrick J. Wong
2024-03-26  3:52   ` [PATCH 092/110] libxfs: support in-memory buffer cache targets Darrick J. Wong
2024-03-26  3:52   ` [PATCH 093/110] xfs: add a xfs_btree_ptrs_equal helper Darrick J. Wong
2024-03-26  3:52   ` Darrick J. Wong [this message]
2024-03-26  5:32     ` [PATCH 094/110] xfs: support in-memory btrees Christoph Hellwig
2024-03-26 17:02       ` Darrick J. Wong
2024-03-26 17:06         ` Christoph Hellwig
2024-03-26  3:53   ` [PATCH 095/110] xfs: launder in-memory btree buffers before transaction commit Darrick J. Wong
2024-03-26  3:53   ` [PATCH 096/110] xfs: create a helper to decide if a file mapping targets the rt volume Darrick J. Wong
2024-03-26  3:53   ` [PATCH 097/110] xfs: repair the rmapbt Darrick J. Wong
2024-03-26  3:53   ` [PATCH 098/110] xfs: create a shadow rmap btree during rmap repair Darrick J. Wong
2024-03-26  3:54   ` [PATCH 099/110] xfs: hook live rmap operations during a repair operation Darrick J. Wong
2024-03-26  3:54   ` [PATCH 100/110] xfs: clean up bmap log intent item tracepoint callsites Darrick J. Wong
2024-03-26  3:54   ` [PATCH 101/110] xfs: move xfs_bmap_defer_add to xfs_bmap_item.c Darrick J. Wong
2024-03-26  3:55   ` [PATCH 102/110] xfs: fix xfs_bunmapi to allow unmapping of partial rt extents Darrick J. Wong
2024-03-26  3:55   ` [PATCH 103/110] xfs: add a realtime flag to the bmap update log redo items Darrick J. Wong
2024-03-26  3:55   ` [PATCH 104/110] xfs: support deferred bmap updates on the attr fork Darrick J. Wong
2024-03-26  3:55   ` [PATCH 105/110] xfs: xfs_bmap_finish_one should map unwritten extents properly Darrick J. Wong
2024-03-26  3:56   ` [PATCH 106/110] xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h Darrick J. Wong
2024-03-26  3:56   ` [PATCH 107/110] xfs: move remote symlink target read function to libxfs Darrick J. Wong
2024-03-26  3:56   ` [PATCH 108/110] xfs: move symlink target write " Darrick J. Wong
2024-03-26  3:56   ` [PATCH 109/110] xfs: xfs_btree_bload_prep_block() should use __GFP_NOFAIL Darrick J. Wong
2024-03-26  3:57   ` [PATCH 110/110] xfs: shrink failure needs to hold AGI buffer Darrick J. Wong
2024-03-26  5:42   ` [PATCHSET 11/18] libxfs: sync with 6.9 Christoph Hellwig
2024-03-26  2:57 ` [PATCHSET v29.4 12/18] xfsprogs: bmap log intent cleanups Darrick J. Wong
2024-03-26  3:57   ` [PATCH 1/4] libxfs: remove kmem_alloc, kmem_zalloc, and kmem_free Darrick J. Wong
2024-03-26  3:57   ` [PATCH 2/4] libxfs: add a bi_entry helper Darrick J. Wong
2024-03-26  3:57   ` [PATCH 3/4] xfs: reuse xfs_bmap_update_cancel_item Darrick J. Wong
2024-03-26  3:58   ` [PATCH 4/4] xfs: add a xattr_entry helper Darrick J. Wong
2024-03-26  2:58 ` [PATCHSET v29.4 13/18] xfsprogs: widen BUI formats to support realtime Darrick J. Wong
2024-03-26  3:58   ` [PATCH 1/1] xfs: add a realtime flag to the bmap update log redo items Darrick J. Wong
2024-03-26  5:42     ` Christoph Hellwig
2024-03-26  2:58 ` [PATCHSET v29.4 14/18] xfs_spaceman: updates for 6.9 Darrick J. Wong
2024-03-26  3:58   ` [PATCH 1/2] xfs_spaceman: report the health of quota counts Darrick J. Wong
2024-03-26  5:43     ` Christoph Hellwig
2024-03-26  3:58   ` [PATCH 2/2] xfs_spaceman: report health of inode link counts Darrick J. Wong
2024-03-26  5:43     ` Christoph Hellwig
2024-03-26  2:58 ` [PATCHSET v29.4 15/18] xfs_scrub: updates for 6.9 Darrick J. Wong
2024-03-26  3:59   ` [PATCH 1/5] xfs_scrub: implement live quotacheck inode scan Darrick J. Wong
2024-03-26  5:44     ` Christoph Hellwig
2024-03-26  3:59   ` [PATCH 2/5] xfs_scrub: check file link counts Darrick J. Wong
2024-03-26  5:44     ` Christoph Hellwig
2024-03-26  3:59   ` [PATCH 3/5] xfs_scrub: update health status if we get a clean bill of health Darrick J. Wong
2024-03-26  5:44     ` Christoph Hellwig
2024-03-26  4:00   ` [PATCH 4/5] xfs_scrub: use multiple threads to run in-kernel metadata scrubs that scan inodes Darrick J. Wong
2024-03-26  5:45     ` Christoph Hellwig
2024-03-26  4:00   ` [PATCH 5/5] xfs_scrub: upload clean bills of health Darrick J. Wong
2024-03-26  5:45     ` Christoph Hellwig
2024-03-26  2:58 ` [PATCHSET v29.4 16/18] xfs_repair: use in-memory rmap btrees Darrick J. Wong
2024-03-26  4:00   ` [PATCH 1/5] xfs_repair: convert regular rmap repair to use in-memory btrees Darrick J. Wong
2024-03-26  5:49     ` Christoph Hellwig
2024-03-26 17:14       ` Darrick J. Wong
2024-03-26  4:00   ` [PATCH 2/5] xfs_repair: verify on-disk rmap btrees with in-memory btree data Darrick J. Wong
2024-03-26  5:52     ` Christoph Hellwig
2024-03-26  4:01   ` [PATCH 3/5] xfs_repair: compute refcount data from in-memory rmap btrees Darrick J. Wong
2024-03-26  5:55     ` Christoph Hellwig
2024-03-26 17:22       ` Darrick J. Wong
2024-03-26  4:01   ` [PATCH 4/5] xfs_repair: reduce rmap bag memory usage when creating refcounts Darrick J. Wong
2024-03-26  5:55     ` Christoph Hellwig
2024-03-26  4:01   ` [PATCH 5/5] xfs_repair: remove the old rmap collection slabs Darrick J. Wong
2024-03-26  5:55     ` Christoph Hellwig
2024-03-26  2:59 ` [PATCHSET v29.4 17/18] xfs_repair: reduce refcount repair memory usage Darrick J. Wong
2024-03-26  4:01   ` [PATCH 1/4] xfs_repair: define an in-memory btree for storing refcount bag info Darrick J. Wong
2024-03-26  5:57     ` Christoph Hellwig
2024-03-26 17:22       ` Darrick J. Wong
2024-03-26  4:02   ` [PATCH 2/4] xfs_repair: create refcount bag Darrick J. Wong
2024-03-26  5:58     ` Christoph Hellwig
2024-03-26  4:02   ` [PATCH 3/4] xfs_repair: port to the new refcount bag structure Darrick J. Wong
2024-03-26  5:58     ` Christoph Hellwig
2024-03-26  4:02   ` [PATCH 4/4] xfs_repair: remove the old bag implementation Darrick J. Wong
2024-03-26  5:58     ` Christoph Hellwig
2024-03-26  2:59 ` [PATCHSET v29.4 18/18] mkfs: cleanups for 6.9 Darrick J. Wong
2024-03-26  4:02   ` [PATCH 1/1] mkfs: use libxfs to create symlinks Darrick J. Wong
2024-03-26  5:56     ` Christoph Hellwig
2024-03-26 17:08       ` 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=171142132733.2215168.1215845331783138642.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=cem@kernel.org \
    --cc=hch@lst.de \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

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

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is 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.