All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: djwong@kernel.org, cem@kernel.org
Cc: Christoph Hellwig <hch@lst.de>,
	Carlos Maiolino <cmaiolino@redhat.com>,
	linux-xfs@vger.kernel.org
Subject: [PATCH 092/111] libxfs: support in-memory buffer cache targets
Date: Mon, 03 Jun 2024 12:16:02 -0700	[thread overview]
Message-ID: <171744040747.1443973.11744591949206973489.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <171744039240.1443973.5959953049110025783.stgit@frogsfrogsfrogs>

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

Allow the buffer cache to target in-memory files by connecting it to
xfiles.  The next few patches will enable creating xfs_btrees in memory.
Unlike the kernel version of this patch, we use a partitioned xfile to
avoid overflowing the fd table instead of opening a separate memfd for
each target.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
---
 libxfs/Makefile    |    4 +
 libxfs/buf_mem.c   |  235 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 libxfs/buf_mem.h   |   26 ++++++
 libxfs/init.c      |    4 +
 libxfs/libxfs_io.h |   22 +++++
 libxfs/rdwr.c      |   41 ++++-----
 6 files changed, 310 insertions(+), 22 deletions(-)
 create mode 100644 libxfs/buf_mem.c
 create mode 100644 libxfs/buf_mem.h


diff --git a/libxfs/Makefile b/libxfs/Makefile
index 43e8ae183..8dc9a7905 100644
--- a/libxfs/Makefile
+++ b/libxfs/Makefile
@@ -26,6 +26,7 @@ HFILES = \
 	libxfs_priv.h \
 	linux-err.h \
 	topology.h \
+	buf_mem.h \
 	xfile.h \
 	xfs_ag_resv.h \
 	xfs_alloc.h \
@@ -58,7 +59,8 @@ HFILES = \
 	xfs_trans_space.h \
 	xfs_dir2_priv.h
 
-CFILES = cache.c \
+CFILES = buf_mem.c \
+	cache.c \
 	defer_item.c \
 	init.c \
 	kmem.c \
diff --git a/libxfs/buf_mem.c b/libxfs/buf_mem.c
new file mode 100644
index 000000000..7c8fa1d2c
--- /dev/null
+++ b/libxfs/buf_mem.c
@@ -0,0 +1,235 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2023-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#include "libxfs_priv.h"
+#include "libxfs.h"
+#include "libxfs/xfile.h"
+#include "libxfs/buf_mem.h"
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+/*
+ * Buffer Cache for In-Memory Files
+ * ================================
+ *
+ * Offline fsck wants to create ephemeral ordered recordsets.  The existing
+ * btree infrastructure can do this, but we need the buffer cache to target
+ * memory instead of block devices.
+ *
+ * xfiles meet those requirements.  Therefore, the xmbuf mechanism uses a
+ * partition on an xfile to store the staging data.
+ *
+ * xmbufs assume that the caller will handle all required concurrency
+ * management.  The resulting xfs_buf objects are kept private to the xmbuf
+ * (they are not recycled to the LRU) because b_addr is mapped directly to the
+ * memfd file.
+ *
+ * The only supported block size is the system page size.
+ */
+
+/* Figure out the xfile buffer cache block size here */
+unsigned int	XMBUF_BLOCKSIZE;
+unsigned int	XMBUF_BLOCKSHIFT;
+
+void
+xmbuf_libinit(void)
+{
+	long		ret = sysconf(_SC_PAGESIZE);
+
+	/* If we don't find a power-of-two page size, go with 4k. */
+	if (ret < 0 || !is_power_of_2(ret))
+		ret = 4096;
+
+	XMBUF_BLOCKSIZE = ret;
+	XMBUF_BLOCKSHIFT = libxfs_highbit32(XMBUF_BLOCKSIZE);
+}
+
+/* Allocate a new cache node (aka a xfs_buf) */
+static struct cache_node *
+xmbuf_cache_alloc(
+	cache_key_t		key)
+{
+	struct xfs_bufkey	*bufkey = (struct xfs_bufkey *)key;
+	struct xfs_buf		*bp;
+	int			error;
+
+	bp = kmem_cache_zalloc(xfs_buf_cache, 0);
+	if (!bp)
+		return NULL;
+
+	bp->b_cache_key = bufkey->blkno;
+	bp->b_length = bufkey->bblen;
+	bp->b_target = bufkey->buftarg;
+	bp->b_mount = bufkey->buftarg->bt_mount;
+
+	pthread_mutex_init(&bp->b_lock, NULL);
+	INIT_LIST_HEAD(&bp->b_li_list);
+	bp->b_maps = &bp->__b_map;
+
+	bp->b_nmaps = 1;
+	bp->b_maps[0].bm_bn = bufkey->blkno;
+	bp->b_maps[0].bm_len = bp->b_length;
+
+	error = xmbuf_map_page(bp);
+	if (error) {
+		fprintf(stderr,
+ _("%s: %s can't mmap %u bytes at xfile offset %llu: %s\n"),
+				progname, __FUNCTION__, BBTOB(bp->b_length),
+				(unsigned long long)BBTOB(bufkey->blkno),
+				strerror(error));
+
+		kmem_cache_free(xfs_buf_cache, bp);
+		return NULL;
+	}
+
+	return &bp->b_node;
+}
+
+/* Flush a buffer to disk before purging the cache node */
+static int
+xmbuf_cache_flush(
+	struct cache_node	*node)
+{
+	/* direct mapped buffers do not need writing */
+	return 0;
+}
+
+/* Release resources, free the buffer. */
+static void
+xmbuf_cache_relse(
+	struct cache_node	*node)
+{
+	struct xfs_buf		*bp;
+
+	bp = container_of(node, struct xfs_buf, b_node);
+	xmbuf_unmap_page(bp);
+	kmem_cache_free(xfs_buf_cache, bp);
+}
+
+/* Release a bunch of buffers */
+static unsigned int
+xmbuf_cache_bulkrelse(
+	struct cache		*cache,
+	struct list_head	*list)
+{
+	struct cache_node	*cn, *n;
+	int			count = 0;
+
+	if (list_empty(list))
+		return 0;
+
+	list_for_each_entry_safe(cn, n, list, cn_mru) {
+		xmbuf_cache_relse(cn);
+		count++;
+	}
+
+	return count;
+}
+
+static struct cache_operations xmbuf_bcache_operations = {
+	.hash		= libxfs_bhash,
+	.alloc		= xmbuf_cache_alloc,
+	.flush		= xmbuf_cache_flush,
+	.relse		= xmbuf_cache_relse,
+	.compare	= libxfs_bcompare,
+	.bulkrelse	= xmbuf_cache_bulkrelse
+};
+
+/*
+ * Allocate a buffer cache target for a memory-backed file and set up the
+ * buffer target.
+ */
+int
+xmbuf_alloc(
+	struct xfs_mount	*mp,
+	const char		*descr,
+	unsigned long long	maxpos,
+	struct xfs_buftarg	**btpp)
+{
+	struct xfs_buftarg	*btp;
+	struct xfile		*xfile;
+	struct cache		*cache;
+	int			error;
+
+	btp = kzalloc(sizeof(*btp), GFP_KERNEL);
+	if (!btp)
+		return -ENOMEM;
+
+	error = xfile_create(descr, maxpos, &xfile);
+	if (error)
+		goto out_btp;
+
+	cache = cache_init(0, LIBXFS_BHASHSIZE(NULL), &xmbuf_bcache_operations);
+	if (!cache) {
+		error = -ENOMEM;
+		goto out_xfile;
+	}
+
+	/* Initialize buffer target */
+	btp->bt_mount = mp;
+	btp->bt_bdev = (dev_t)-1;
+	btp->bt_bdev_fd = -1;
+	btp->bt_xfile = xfile;
+	btp->bcache = cache;
+
+	error = pthread_mutex_init(&btp->lock, NULL);
+	if (error)
+		goto out_cache;
+
+	*btpp = btp;
+	return 0;
+
+out_cache:
+	cache_destroy(cache);
+out_xfile:
+	xfile_destroy(xfile);
+out_btp:
+	kfree(btp);
+	return error;
+}
+
+/* Free a buffer cache target for a memory-backed file. */
+void
+xmbuf_free(
+	struct xfs_buftarg	*btp)
+{
+	ASSERT(xfs_buftarg_is_mem(btp));
+
+	cache_destroy(btp->bcache);
+	pthread_mutex_destroy(&btp->lock);
+	xfile_destroy(btp->bt_xfile);
+	kfree(btp);
+}
+
+/* Directly map a memfd page into the buffer cache. */
+int
+xmbuf_map_page(
+	struct xfs_buf		*bp)
+{
+	struct xfile		*xfile = bp->b_target->bt_xfile;
+	void			*p;
+	loff_t			pos;
+
+	pos = xfile->partition_pos + BBTOB(xfs_buf_daddr(bp));
+	p = mmap(NULL, BBTOB(bp->b_length), PROT_READ | PROT_WRITE, MAP_SHARED,
+			xfile->fcb->fd, pos);
+	if (p == MAP_FAILED)
+		return -errno;
+
+	bp->b_addr = p;
+	bp->b_flags |= LIBXFS_B_UPTODATE | LIBXFS_B_UNCHECKED;
+	bp->b_error = 0;
+	return 0;
+}
+
+/* Unmap a memfd page that was mapped into the buffer cache. */
+void
+xmbuf_unmap_page(
+	struct xfs_buf		*bp)
+{
+	munmap(bp->b_addr, BBTOB(bp->b_length));
+	bp->b_addr = NULL;
+}
diff --git a/libxfs/buf_mem.h b/libxfs/buf_mem.h
new file mode 100644
index 000000000..d2be2c424
--- /dev/null
+++ b/libxfs/buf_mem.h
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2023-2024 Oracle.  All Rights Reserved.
+ * Author: Darrick J. Wong <djwong@kernel.org>
+ */
+#ifndef __XFS_BUF_MEM_H__
+#define __XFS_BUF_MEM_H__
+
+extern unsigned int		XMBUF_BLOCKSIZE;
+extern unsigned int		XMBUF_BLOCKSHIFT;
+
+void xmbuf_libinit(void);
+
+static inline bool xfs_buftarg_is_mem(const struct xfs_buftarg *target)
+{
+	return target->bt_xfile != NULL;
+}
+
+int xmbuf_alloc(struct xfs_mount *mp, const char *descr,
+		unsigned long long maxpos, struct xfs_buftarg **btpp);
+void xmbuf_free(struct xfs_buftarg *btp);
+
+int xmbuf_map_page(struct xfs_buf *bp);
+void xmbuf_unmap_page(struct xfs_buf *bp);
+
+#endif /* __XFS_BUF_MEM_H__ */
diff --git a/libxfs/init.c b/libxfs/init.c
index eaeb0b666..82618a07e 100644
--- a/libxfs/init.c
+++ b/libxfs/init.c
@@ -22,6 +22,8 @@
 #include "xfs_rmap_btree.h"
 #include "xfs_refcount_btree.h"
 #include "libfrog/platform.h"
+#include "libxfs/xfile.h"
+#include "libxfs/buf_mem.h"
 
 #include "xfs_format.h"
 #include "xfs_da_format.h"
@@ -253,6 +255,7 @@ int
 libxfs_init(struct libxfs_init *a)
 {
 	xfs_check_ondisk_structs();
+	xmbuf_libinit();
 	rcu_init();
 	rcu_register_thread();
 	radix_tree_init();
@@ -463,6 +466,7 @@ libxfs_buftarg_alloc(
 	btp->bt_mount = mp;
 	btp->bt_bdev = dev->dev;
 	btp->bt_bdev_fd = dev->fd;
+	btp->bt_xfile = NULL;
 	btp->flags = 0;
 	if (write_fails) {
 		btp->writes_left = write_fails;
diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h
index 7877e1768..ae3c4a948 100644
--- a/libxfs/libxfs_io.h
+++ b/libxfs/libxfs_io.h
@@ -27,6 +27,7 @@ struct xfs_buftarg {
 	unsigned long		writes_left;
 	dev_t			bt_bdev;
 	int			bt_bdev_fd;
+	struct xfile		*bt_xfile;
 	unsigned int		flags;
 	struct cache		*bcache;	/* buffer cache */
 };
@@ -58,6 +59,27 @@ xfs_buftarg_trip_write(
 void libxfs_buftarg_init(struct xfs_mount *mp, struct libxfs_init *xi);
 int libxfs_blkdev_issue_flush(struct xfs_buftarg *btp);
 
+/*
+ * The bufkey is used to pass the new buffer information to the cache object
+ * allocation routine. Because discontiguous buffers need to pass different
+ * information, we need fields to pass that information. However, because the
+ * blkno and bblen is needed for the initial cache entry lookup (i.e. for
+ * bcompare) the fact that the map/nmaps is non-null to switch to discontiguous
+ * buffer initialisation instead of a contiguous buffer.
+ */
+struct xfs_bufkey {
+	struct xfs_buftarg	*buftarg;
+	xfs_daddr_t		blkno;
+	unsigned int		bblen;
+	struct xfs_buf_map	*map;
+	int			nmaps;
+};
+
+/* for buf_mem.c only: */
+unsigned int libxfs_bhash(cache_key_t key, unsigned int hashsize,
+		unsigned int hashshift);
+int libxfs_bcompare(struct cache_node *node, cache_key_t key);
+
 #define LIBXFS_BBTOOFF64(bbs)	(((xfs_off_t)(bbs)) << BBSHIFT)
 
 #define XB_PAGES        2
diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c
index cf986a7e7..50760cd86 100644
--- a/libxfs/rdwr.c
+++ b/libxfs/rdwr.c
@@ -18,7 +18,8 @@
 #include "xfs_inode.h"
 #include "xfs_trans.h"
 #include "libfrog/platform.h"
-
+#include "libxfs/xfile.h"
+#include "libxfs/buf_mem.h"
 #include "libxfs.h"
 
 static void libxfs_brelse(struct cache_node *node);
@@ -69,6 +70,9 @@ libxfs_device_zero(struct xfs_buftarg *btp, xfs_daddr_t start, uint len)
 	char		*z;
 	int		error;
 
+	if (xfs_buftarg_is_mem(btp))
+		return -EOPNOTSUPP;
+
 	start_offset = LIBXFS_BBTOOFF64(start);
 
 	/* try to use special zeroing methods, fall back to writes if needed */
@@ -167,26 +171,10 @@ static struct cache_mru		xfs_buf_freelist =
 	{{&xfs_buf_freelist.cm_list, &xfs_buf_freelist.cm_list},
 	 0, PTHREAD_MUTEX_INITIALIZER };
 
-/*
- * The bufkey is used to pass the new buffer information to the cache object
- * allocation routine. Because discontiguous buffers need to pass different
- * information, we need fields to pass that information. However, because the
- * blkno and bblen is needed for the initial cache entry lookup (i.e. for
- * bcompare) the fact that the map/nmaps is non-null to switch to discontiguous
- * buffer initialisation instead of a contiguous buffer.
- */
-struct xfs_bufkey {
-	struct xfs_buftarg	*buftarg;
-	xfs_daddr_t		blkno;
-	unsigned int		bblen;
-	struct xfs_buf_map	*map;
-	int			nmaps;
-};
-
 /*  2^63 + 2^61 - 2^57 + 2^54 - 2^51 - 2^18 + 1 */
 #define GOLDEN_RATIO_PRIME	0x9e37fffffffc0001UL
 #define CACHE_LINE_SIZE		64
-static unsigned int
+unsigned int
 libxfs_bhash(cache_key_t key, unsigned int hashsize, unsigned int hashshift)
 {
 	uint64_t	hashval = ((struct xfs_bufkey *)key)->blkno;
@@ -197,7 +185,7 @@ libxfs_bhash(cache_key_t key, unsigned int hashsize, unsigned int hashshift)
 	return tmp % hashsize;
 }
 
-static int
+int
 libxfs_bcompare(
 	struct cache_node	*node,
 	cache_key_t		key)
@@ -231,6 +219,8 @@ static void
 __initbuf(struct xfs_buf *bp, struct xfs_buftarg *btp, xfs_daddr_t bno,
 		unsigned int bytes)
 {
+	ASSERT(!xfs_buftarg_is_mem(btp));
+
 	bp->b_flags = 0;
 	bp->b_cache_key = bno;
 	bp->b_length = BTOBB(bytes);
@@ -577,7 +567,6 @@ libxfs_balloc(
 	return &bp->b_node;
 }
 
-
 static int
 __read_buf(int fd, void *buf, int len, off_t offset, int flags)
 {
@@ -607,6 +596,9 @@ libxfs_readbufr(struct xfs_buftarg *btp, xfs_daddr_t blkno, struct xfs_buf *bp,
 
 	ASSERT(len <= bp->b_length);
 
+	if (xfs_buftarg_is_mem(btp))
+		return 0;
+
 	error = __read_buf(fd, bp->b_addr, bytes, LIBXFS_BBTOOFF64(blkno), flags);
 	if (!error &&
 	    bp->b_target == btp &&
@@ -639,6 +631,9 @@ libxfs_readbufr_map(struct xfs_buftarg *btp, struct xfs_buf *bp, int flags)
 	void	*buf;
 	int	i;
 
+	if (xfs_buftarg_is_mem(btp))
+		return 0;
+
 	buf = bp->b_addr;
 	for (i = 0; i < bp->b_nmaps; i++) {
 		off_t	offset = LIBXFS_BBTOOFF64(bp->b_maps[i].bm_bn);
@@ -857,7 +852,9 @@ libxfs_bwrite(
 		}
 	}
 
-	if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) {
+	if (xfs_buftarg_is_mem(bp->b_target)) {
+		bp->b_error = 0;
+	} else if (!(bp->b_flags & LIBXFS_B_DISCONTIG)) {
 		bp->b_error = __write_buf(fd, bp->b_addr, BBTOB(bp->b_length),
 				    LIBXFS_BBTOOFF64(xfs_buf_daddr(bp)),
 				    bp->b_flags);
@@ -917,6 +914,8 @@ libxfs_buf_prepare_mru(
 		xfs_perag_put(bp->b_pag);
 	bp->b_pag = NULL;
 
+	ASSERT(!xfs_buftarg_is_mem(btp));
+
 	if (!(bp->b_flags & LIBXFS_B_DIRTY))
 		return;
 


  parent reply	other threads:[~2024-06-03 19:16 UTC|newest]

Thread overview: 152+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-03 18:45 [PATCHBOMB] xfsprogs: catch us up to 6.9 (final) Darrick J. Wong
2024-06-03 18:48 ` [PATCHSET v30.5 01/10] libxfs: prepare to sync with 6.9 Darrick J. Wong
2024-06-03 18:51   ` [PATCH 1/3] libxfs: actually set m_fsname Darrick J. Wong
2024-06-03 18:51   ` [PATCH 2/3] libxfs: clean up xfs_da_unmount usage Darrick J. Wong
2024-06-03 18:52   ` [PATCH 3/3] libfrog: create a new scrub group for things requiring full inode scans Darrick J. Wong
2024-06-03 18:49 ` [PATCHSET v30.5 02/10] libxfs: sync with 6.9 Darrick J. Wong
2024-06-03 18:52   ` [PATCH 001/111] xfs: convert kmem_zalloc() to kzalloc() Darrick J. Wong
2024-06-03 18:52   ` [PATCH 002/111] xfs: convert kmem_alloc() to kmalloc() Darrick J. Wong
2024-06-03 18:52   ` [PATCH 003/111] xfs: convert remaining kmem_free() to kfree() Darrick J. Wong
2024-06-03 18:53   ` [PATCH 004/111] xfs: use __GFP_NOLOCKDEP instead of GFP_NOFS Darrick J. Wong
2024-06-03 18:53   ` [PATCH 005/111] xfs: use GFP_KERNEL in pure transaction contexts Darrick J. Wong
2024-06-03 18:53   ` [PATCH 006/111] xfs: clean up remaining GFP_NOFS users Darrick J. Wong
2024-06-03 18:53   ` [PATCH 007/111] xfs: use xfs_defer_alloc a bit more Darrick J. Wong
2024-06-03 18:54   ` [PATCH 008/111] xfs: Replace xfs_isilocked with xfs_assert_ilocked Darrick J. Wong
2024-06-03 18:54   ` [PATCH 009/111] xfs: create a static name for the dot entry too Darrick J. Wong
2024-06-03 18:54   ` [PATCH 010/111] xfs: create a predicate to determine if two xfs_names are the same Darrick J. Wong
2024-06-03 18:54   ` [PATCH 011/111] xfs: create a macro for decoding ftypes in tracepoints Darrick J. Wong
2024-06-03 18:55   ` [PATCH 012/111] xfs: report the health of quota counts Darrick J. Wong
2024-06-03 18:55   ` [PATCH 013/111] xfs: implement live quotacheck inode scan Darrick J. Wong
2024-06-03 18:55   ` [PATCH 014/111] xfs: report health of inode link counts Darrick J. Wong
2024-06-03 18:55   ` [PATCH 015/111] xfs: teach scrub to check file nlinks Darrick J. Wong
2024-06-03 18:56   ` [PATCH 016/111] xfs: separate the marking of sick and checked metadata Darrick J. Wong
2024-06-03 18:56   ` [PATCH 017/111] xfs: report fs corruption errors to the health tracking system Darrick J. Wong
2024-06-03 18:56   ` [PATCH 018/111] xfs: report ag header " Darrick J. Wong
2024-06-03 18:57   ` [PATCH 019/111] xfs: report block map " Darrick J. Wong
2024-06-03 18:57   ` [PATCH 020/111] xfs: report btree block corruption errors to the health system Darrick J. Wong
2024-06-03 18:57   ` [PATCH 021/111] xfs: report dir/attr " Darrick J. Wong
2024-06-03 18:57   ` [PATCH 022/111] xfs: report inode " Darrick J. Wong
2024-06-03 18:58   ` [PATCH 023/111] xfs: report realtime metadata " Darrick J. Wong
2024-06-03 18:58   ` [PATCH 024/111] xfs: report XFS_IS_CORRUPT " Darrick J. Wong
2024-06-03 18:58   ` [PATCH 025/111] xfs: add secondary and indirect classes to the health tracking system Darrick J. Wong
2024-06-03 18:58   ` [PATCH 026/111] xfs: remember sick inodes that get inactivated Darrick J. Wong
2024-06-03 18:59   ` [PATCH 027/111] xfs: update health status if we get a clean bill of health Darrick J. Wong
2024-06-03 18:59   ` [PATCH 028/111] xfs: consolidate btree block freeing tracepoints Darrick J. Wong
2024-06-03 18:59   ` [PATCH 029/111] xfs: consolidate btree block allocation tracepoints Darrick J. Wong
2024-06-03 18:59   ` [PATCH 030/111] xfs: set the btree cursor bc_ops in xfs_btree_alloc_cursor Darrick J. Wong
2024-06-03 19:00   ` [PATCH 031/111] xfs: drop XFS_BTREE_CRC_BLOCKS Darrick J. Wong
2024-06-03 19:00   ` [PATCH 032/111] xfs: encode the btree geometry flags in the btree ops structure Darrick J. Wong
2024-06-03 19:00   ` [PATCH 033/111] xfs: remove bc_ino.flags Darrick J. Wong
2024-06-03 19:00   ` [PATCH 034/111] xfs: consolidate the xfs_alloc_lookup_* helpers Darrick J. Wong
2024-06-03 19:01   ` [PATCH 035/111] xfs: turn the allocbt cursor active field into a btree flag Darrick J. Wong
2024-06-03 19:01   ` [PATCH 036/111] xfs: extern some btree ops structures Darrick J. Wong
2024-06-03 19:01   ` [PATCH 037/111] xfs: initialize btree blocks using btree_ops structure Darrick J. Wong
2024-06-03 19:01   ` [PATCH 038/111] xfs: rename btree block/buffer init functions Darrick J. Wong
2024-06-03 19:02   ` [PATCH 039/111] xfs: btree convert xfs_btree_init_block to xfs_btree_init_buf calls Darrick J. Wong
2024-06-03 19:02   ` [PATCH 040/111] xfs: remove the unnecessary daddr paramter to _init_block Darrick J. Wong
2024-06-03 19:02   ` [PATCH 041/111] xfs: set btree block buffer ops in _init_buf Darrick J. Wong
2024-06-03 19:03   ` [PATCH 042/111] xfs: move lru refs to the btree ops structure Darrick J. Wong
2024-06-03 19:03   ` [PATCH 043/111] xfs: move the btree stats offset into struct btree_ops Darrick J. Wong
2024-06-03 19:03   ` [PATCH 044/111] xfs: factor out a xfs_btree_owner helper Darrick J. Wong
2024-06-03 19:03   ` [PATCH 045/111] xfs: factor out a btree block owner check Darrick J. Wong
2024-06-03 19:04   ` [PATCH 046/111] xfs: store the btree pointer length in struct xfs_btree_ops Darrick J. Wong
2024-06-03 19:04   ` [PATCH 047/111] xfs: split out a btree type from the btree ops geometry flags Darrick J. Wong
2024-06-03 19:04   ` [PATCH 048/111] xfs: split the per-btree union in struct xfs_btree_cur Darrick J. Wong
2024-06-03 19:04   ` [PATCH 049/111] xfs: create predicate to determine if cursor is at inode root level Darrick J. Wong
2024-06-03 19:05   ` [PATCH 050/111] xfs: move comment about two 2 keys per pointer in the rmap btree Darrick J. Wong
2024-06-03 19:05   ` [PATCH 051/111] xfs: add a xfs_btree_init_ptr_from_cur Darrick J. Wong
2024-06-03 19:05   ` [PATCH 052/111] xfs: don't override bc_ops for staging btrees Darrick J. Wong
2024-06-03 19:05   ` [PATCH 053/111] xfs: fold xfs_allocbt_init_common into xfs_allocbt_init_cursor Darrick J. Wong
2024-06-03 19:06   ` [PATCH 054/111] xfs: remove xfs_allocbt_stage_cursor Darrick J. Wong
2024-06-03 19:06   ` [PATCH 055/111] xfs: fold xfs_inobt_init_common into xfs_inobt_init_cursor Darrick J. Wong
2024-06-03 19:06   ` [PATCH 056/111] xfs: remove xfs_inobt_stage_cursor Darrick J. Wong
2024-06-03 19:06   ` [PATCH 057/111] xfs: fold xfs_refcountbt_init_common into xfs_refcountbt_init_cursor Darrick J. Wong
2024-06-03 19:07   ` [PATCH 058/111] xfs: remove xfs_refcountbt_stage_cursor Darrick J. Wong
2024-06-03 19:07   ` [PATCH 059/111] xfs: fold xfs_rmapbt_init_common into xfs_rmapbt_init_cursor Darrick J. Wong
2024-06-03 19:07   ` [PATCH 060/111] xfs: remove xfs_rmapbt_stage_cursor Darrick J. Wong
2024-06-03 19:07   ` [PATCH 061/111] xfs: make full use of xfs_btree_stage_ifakeroot in xfs_bmbt_stage_cursor Darrick J. Wong
2024-06-03 19:08   ` [PATCH 062/111] xfs: make staging file forks explicit Darrick J. Wong
2024-06-03 19:08   ` [PATCH 063/111] xfs: fold xfs_bmbt_init_common into xfs_bmbt_init_cursor Darrick J. Wong
2024-06-03 19:08   ` [PATCH 064/111] xfs: remove xfs_bmbt_stage_cursor Darrick J. Wong
2024-06-03 19:09   ` [PATCH 065/111] xfs: split the agf_roots and agf_levels arrays Darrick J. Wong
2024-06-03 19:09   ` [PATCH 066/111] xfs: add a name field to struct xfs_btree_ops Darrick J. Wong
2024-06-03 19:09   ` [PATCH 067/111] xfs: add a sick_mask " Darrick J. Wong
2024-06-03 19:09   ` [PATCH 068/111] xfs: split xfs_allocbt_init_cursor Darrick J. Wong
2024-06-03 19:10   ` [PATCH 069/111] xfs: remove xfs_inobt_cur Darrick J. Wong
2024-06-03 19:10   ` [PATCH 070/111] xfs: remove the btnum argument to xfs_inobt_count_blocks Darrick J. Wong
2024-06-03 19:10   ` [PATCH 071/111] xfs: split xfs_inobt_insert_sprec Darrick J. Wong
2024-06-03 19:10   ` [PATCH 072/111] xfs: split xfs_inobt_init_cursor Darrick J. Wong
2024-06-03 19:11   ` [PATCH 073/111] xfs: pass a 'bool is_finobt' to xfs_inobt_insert Darrick J. Wong
2024-06-03 19:11   ` [PATCH 074/111] xfs: remove xfs_btnum_t Darrick J. Wong
2024-06-03 19:11   ` [PATCH 075/111] xfs: simplify xfs_btree_check_sblock_siblings Darrick J. Wong
2024-06-03 19:11   ` [PATCH 076/111] xfs: simplify xfs_btree_check_lblock_siblings Darrick J. Wong
2024-06-03 19:12   ` [PATCH 077/111] xfs: open code xfs_btree_check_lptr in xfs_bmap_btree_to_extents Darrick J. Wong
2024-06-03 19:12   ` [PATCH 078/111] xfs: consolidate btree ptr checking Darrick J. Wong
2024-06-03 19:12   ` [PATCH 079/111] xfs: misc cleanups for __xfs_btree_check_sblock Darrick J. Wong
2024-06-03 19:12   ` [PATCH 080/111] xfs: remove the crc variable in __xfs_btree_check_lblock Darrick J. Wong
2024-06-03 19:13   ` [PATCH 081/111] xfs: tighten up validation of root block in inode forks Darrick J. Wong
2024-06-03 19:13   ` [PATCH 082/111] xfs: consolidate btree block verification Darrick J. Wong
2024-06-03 19:13   ` [PATCH 083/111] xfs: rename btree helpers that depends on the block number representation Darrick J. Wong
2024-06-03 19:13   ` [PATCH 084/111] xfs: factor out a __xfs_btree_check_lblock_hdr helper Darrick J. Wong
2024-06-03 19:14   ` [PATCH 085/111] xfs: remove xfs_btree_reada_bufl Darrick J. Wong
2024-06-03 19:14   ` [PATCH 086/111] xfs: remove xfs_btree_reada_bufs Darrick J. Wong
2024-06-03 19:14   ` [PATCH 087/111] xfs: move and rename xfs_btree_read_bufl Darrick J. Wong
2024-06-03 19:14   ` [PATCH 088/111] libxfs: teach buftargs to maintain their own buffer hashtable Darrick J. Wong
2024-06-03 19:15   ` [PATCH 089/111] libxfs: add xfile support Darrick J. Wong
2024-06-03 19:15   ` [PATCH 090/111] libxfs: partition memfd files to avoid using too many fds Darrick J. Wong
2024-06-03 19:15   ` [PATCH 091/111] xfs: teach buftargs to maintain their own buffer hashtable Darrick J. Wong
2024-06-03 19:16   ` Darrick J. Wong [this message]
2024-06-03 19:16   ` [PATCH 093/111] xfs: add a xfs_btree_ptrs_equal helper Darrick J. Wong
2024-06-03 19:16   ` [PATCH 094/111] xfs: support in-memory btrees Darrick J. Wong
2024-06-03 19:16   ` [PATCH 095/111] xfs: launder in-memory btree buffers before transaction commit Darrick J. Wong
2024-06-03 19:17   ` [PATCH 096/111] xfs: create a helper to decide if a file mapping targets the rt volume Darrick J. Wong
2024-06-03 19:17   ` [PATCH 097/111] xfs: repair the rmapbt Darrick J. Wong
2024-06-03 19:17   ` [PATCH 098/111] xfs: create a shadow rmap btree during rmap repair Darrick J. Wong
2024-06-03 19:17   ` [PATCH 099/111] xfs: hook live rmap operations during a repair operation Darrick J. Wong
2024-06-03 19:18   ` [PATCH 100/111] xfs: clean up bmap log intent item tracepoint callsites Darrick J. Wong
2024-06-03 19:18   ` [PATCH 101/111] xfs: move xfs_bmap_defer_add to xfs_bmap_item.c Darrick J. Wong
2024-06-03 19:18   ` [PATCH 102/111] xfs: fix xfs_bunmapi to allow unmapping of partial rt extents Darrick J. Wong
2024-06-03 19:18   ` [PATCH 103/111] xfs: add a realtime flag to the bmap update log redo items Darrick J. Wong
2024-06-03 19:19   ` [PATCH 104/111] xfs: support deferred bmap updates on the attr fork Darrick J. Wong
2024-06-03 19:19   ` [PATCH 105/111] xfs: xfs_bmap_finish_one should map unwritten extents properly Darrick J. Wong
2024-06-03 19:19   ` [PATCH 106/111] xfs: move xfs_symlink_remote.c declarations to xfs_symlink_remote.h Darrick J. Wong
2024-06-03 19:19   ` [PATCH 107/111] xfs: move remote symlink target read function to libxfs Darrick J. Wong
2024-06-03 19:20   ` [PATCH 108/111] xfs: move symlink target write " Darrick J. Wong
2024-06-03 19:20   ` [PATCH 109/111] xfs: xfs_btree_bload_prep_block() should use __GFP_NOFAIL Darrick J. Wong
2024-06-03 19:20   ` [PATCH 110/111] xfs: shrink failure needs to hold AGI buffer Darrick J. Wong
2024-06-03 19:20   ` [PATCH 111/111] xfs: allow sunit mount option to repair bad primary sb stripe values Darrick J. Wong
2024-06-03 18:49 ` [PATCHSET v30.5 03/10] xfsprogs: bmap log intent cleanups Darrick J. Wong
2024-06-03 19:21   ` [PATCH 1/4] libxfs: remove kmem_alloc, kmem_zalloc, and kmem_free Darrick J. Wong
2024-06-03 19:21   ` [PATCH 2/4] libxfs: add a bi_entry helper Darrick J. Wong
2024-06-03 19:21   ` [PATCH 3/4] libxfs: reuse xfs_bmap_update_cancel_item Darrick J. Wong
2024-06-03 19:22   ` [PATCH 4/4] libxfs: add a xattr_entry helper Darrick J. Wong
2024-06-03 18:49 ` [PATCHSET v30.5 04/10] xfsprogs: widen BUI formats to support realtime Darrick J. Wong
2024-06-03 19:22   ` [PATCH 1/1] libxfs: add a realtime flag to the bmap update log redo items Darrick J. Wong
2024-06-03 18:49 ` [PATCHSET v30.5 05/10] xfs_spaceman: updates for 6.9 Darrick J. Wong
2024-06-03 19:22   ` [PATCH 1/2] xfs_spaceman: report the health of quota counts Darrick J. Wong
2024-06-03 19:22   ` [PATCH 2/2] xfs_spaceman: report health of inode link counts Darrick J. Wong
2024-06-03 18:50 ` [PATCHSET v30.5 06/10] xfs_scrub: updates for 6.9 Darrick J. Wong
2024-06-03 19:23   ` [PATCH 1/5] xfs_scrub: implement live quotacheck inode scan Darrick J. Wong
2024-06-03 19:23   ` [PATCH 2/5] xfs_scrub: check file link counts Darrick J. Wong
2024-06-03 19:23   ` [PATCH 3/5] xfs_scrub: update health status if we get a clean bill of health Darrick J. Wong
2024-06-03 19:23   ` [PATCH 4/5] xfs_scrub: use multiple threads to run in-kernel metadata scrubs that scan inodes Darrick J. Wong
2024-06-03 19:24   ` [PATCH 5/5] xfs_scrub: upload clean bills of health Darrick J. Wong
2024-06-03 18:50 ` [PATCHSET v30.5 07/10] xfs_repair: minor fixes Darrick J. Wong
2024-06-03 19:24   ` [PATCH 1/2] xfs_repair: log when buffers fail CRC checks even if we just recompute it Darrick J. Wong
2024-06-03 19:24   ` [PATCH 2/2] xfs_repair: check num before bplist[num] Darrick J. Wong
2024-06-03 18:50 ` [PATCHSET v30.5 08/10] xfs_repair: use in-memory rmap btrees Darrick J. Wong
2024-06-03 19:24   ` [PATCH 1/6] libxfs: provide a kernel-compatible kasprintf Darrick J. Wong
2024-06-03 19:25   ` [PATCH 2/6] xfs_repair: convert regular rmap repair to use in-memory btrees Darrick J. Wong
2024-06-03 19:25   ` [PATCH 3/6] xfs_repair: verify on-disk rmap btrees with in-memory btree data Darrick J. Wong
2024-06-03 19:25   ` [PATCH 4/6] xfs_repair: compute refcount data from in-memory rmap btrees Darrick J. Wong
2024-06-03 19:25   ` [PATCH 5/6] xfs_repair: reduce rmap bag memory usage when creating refcounts Darrick J. Wong
2024-06-03 19:26   ` [PATCH 6/6] xfs_repair: remove the old rmap collection slabs Darrick J. Wong
2024-06-03 18:51 ` [PATCHSET v30.5 09/10] xfs_repair: reduce refcount repair memory usage Darrick J. Wong
2024-06-03 19:26   ` [PATCH 1/4] xfs_repair: define an in-memory btree for storing refcount bag info Darrick J. Wong
2024-06-03 19:26   ` [PATCH 2/4] xfs_repair: create refcount bag Darrick J. Wong
2024-06-03 19:27   ` [PATCH 3/4] xfs_repair: port to the new refcount bag structure Darrick J. Wong
2024-06-03 19:27   ` [PATCH 4/4] xfs_repair: remove the old bag implementation Darrick J. Wong
2024-06-03 18:51 ` [PATCHSET v30.5 10/10] mkfs: cleanups for 6.9 Darrick J. Wong
2024-06-03 19:27   ` [PATCH 1/1] mkfs: use libxfs to create symlinks Darrick J. Wong
  -- strict thread matches above, loose matches on Subject: below --
2024-05-22  2:45 [PATCHSET v30.4 02/10] libxfs: sync with 6.9 Darrick J. Wong
2024-05-22  3:12 ` [PATCH 092/111] libxfs: support in-memory buffer cache targets Darrick J. Wong
2024-04-16  0:58 [PATCHSET 2/4] libxfs: sync with 6.9 Darrick J. Wong
2024-04-16  1:01 ` [PATCH 092/111] libxfs: support in-memory buffer cache targets 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=171744040747.1443973.11744591949206973489.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=cem@kernel.org \
    --cc=cmaiolino@redhat.com \
    --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.