public inbox for linux-fsdevel@vger.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: tytso@mit.edu
Cc: bpf@vger.kernel.org, linux-fsdevel@vger.kernel.org,
	linux-ext4@vger.kernel.org, miklos@szeredi.hu, bernd@bsbernd.com,
	joannelkoong@gmail.com, neal@gompa.dev
Subject: [PATCH 1/6] libsupport: add caching IO manager
Date: Mon, 23 Feb 2026 15:44:56 -0800	[thread overview]
Message-ID: <177188745710.3944626.12922351035440029162.stgit@frogsfrogsfrogs> (raw)
In-Reply-To: <177188745668.3944626.16408108516155796668.stgit@frogsfrogsfrogs>

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

Start creating a caching IO manager so that we can have better caching
of metadata blocks in fuse2fs.  For now it's just a passthrough cache.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
 lib/support/iocache.h   |   17 +++
 lib/ext2fs/io_manager.c |    3 
 lib/support/Makefile.in |    6 +
 lib/support/iocache.c   |  317 +++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 342 insertions(+), 1 deletion(-)
 create mode 100644 lib/support/iocache.h
 create mode 100644 lib/support/iocache.c


diff --git a/lib/support/iocache.h b/lib/support/iocache.h
new file mode 100644
index 00000000000000..502eede08aadc5
--- /dev/null
+++ b/lib/support/iocache.h
@@ -0,0 +1,17 @@
+/*
+ * iocache.h - IO cache
+ *
+ * Copyright (C) 2025-2026 Oracle.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ * %End-Header%
+ */
+#ifndef __IOCACHE_H__
+#define __IOCACHE_H__
+
+errcode_t iocache_set_backing_manager(io_manager manager);
+extern io_manager iocache_io_manager;
+
+#endif /* __IOCACHE_H__ */
diff --git a/lib/ext2fs/io_manager.c b/lib/ext2fs/io_manager.c
index a92dba7b9dc880..a93415c151ffa0 100644
--- a/lib/ext2fs/io_manager.c
+++ b/lib/ext2fs/io_manager.c
@@ -16,9 +16,12 @@
 #if HAVE_SYS_TYPES_H
 #include <sys/types.h>
 #endif
+#include <stdbool.h>
 
 #include "ext2_fs.h"
 #include "ext2fs.h"
+#include "support/list.h"
+#include "support/cache.h"
 
 errcode_t io_channel_set_options(io_channel channel, const char *opts)
 {
diff --git a/lib/support/Makefile.in b/lib/support/Makefile.in
index a09814f574008c..2950e80222ee72 100644
--- a/lib/support/Makefile.in
+++ b/lib/support/Makefile.in
@@ -15,6 +15,7 @@ all::
 
 OBJS=		bthread.o \
 		cstring.o \
+		iocache.o \
 		mkquota.o \
 		plausible.o \
 		profile.o \
@@ -44,7 +45,8 @@ SRCS=		$(srcdir)/argv_parse.c \
 		$(srcdir)/quotaio_v2.c \
 		$(srcdir)/dict.c \
 		$(srcdir)/devname.c \
-		$(srcdir)/cache.c
+		$(srcdir)/cache.c \
+		$(srcdir)/iocache.c
 
 LIBRARY= libsupport
 LIBDIR= support
@@ -191,3 +193,5 @@ devname.o: $(srcdir)/devname.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(srcdir)/devname.h $(srcdir)/nls-enable.h
 cache.o: $(srcdir)/cache.c $(top_builddir)/lib/config.h \
  $(srcdir)/cache.h $(srcdir)/list.h $(srcdir)/xbitops.h
+iocache.o: $(srcdir)/iocache.c $(top_builddir)/lib/config.h \
+ $(srcdir)/iocache.h $(srcdir)/cache.h $(srcdir)/list.h $(srcdir)/xbitops.h
diff --git a/lib/support/iocache.c b/lib/support/iocache.c
new file mode 100644
index 00000000000000..615f1fcc2d7f84
--- /dev/null
+++ b/lib/support/iocache.c
@@ -0,0 +1,317 @@
+/*
+ * iocache.c - caching IO manager
+ *
+ * Copyright (C) 2025-2026 Oracle.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Public
+ * License.
+ * %End-Header%
+ */
+#include "config.h"
+#include "ext2fs/ext2_fs.h"
+#include "ext2fs/ext2fs.h"
+#include "ext2fs/ext2fsP.h"
+#include "support/iocache.h"
+
+#define IOCACHE_IO_CHANNEL_MAGIC	0x424F5254	/* BORT */
+
+static io_manager iocache_backing_manager;
+
+struct iocache_private_data {
+	int			magic;
+	io_channel		real;
+};
+
+static struct iocache_private_data *IOCACHE(io_channel channel)
+{
+	return (struct iocache_private_data *)channel->private_data;
+}
+
+static errcode_t iocache_read_error(io_channel channel, unsigned long block,
+				    int count, void *data, size_t size,
+				    int actual_bytes_read, errcode_t error)
+{
+	io_channel iocache_channel = channel->app_data;
+
+	return iocache_channel->read_error(iocache_channel, block, count, data,
+					   size, actual_bytes_read, error);
+}
+
+static errcode_t iocache_write_error(io_channel channel, unsigned long block,
+				     int count, const void *data, size_t size,
+				     int actual_bytes_written,
+				     errcode_t error)
+{
+	io_channel iocache_channel = channel->app_data;
+
+	return iocache_channel->write_error(iocache_channel, block, count, data,
+					    size, actual_bytes_written, error);
+}
+
+static errcode_t iocache_open(const char *name, int flags, io_channel *channel)
+{
+	io_channel	io = NULL;
+	io_channel	real;
+	struct iocache_private_data *data = NULL;
+	errcode_t	retval;
+
+	if (!name)
+		return EXT2_ET_BAD_DEVICE_NAME;
+	if (!iocache_backing_manager)
+		return EXT2_ET_INVALID_ARGUMENT;
+
+	retval = iocache_backing_manager->open(name, flags, &real);
+	if (retval)
+		return retval;
+
+	retval = ext2fs_get_mem(sizeof(struct struct_io_channel), &io);
+	if (retval)
+		goto out_backing;
+	memset(io, 0, sizeof(struct struct_io_channel));
+	io->magic = EXT2_ET_MAGIC_IO_CHANNEL;
+
+	retval = ext2fs_get_mem(sizeof(struct iocache_private_data), &data);
+	if (retval)
+		goto out_channel;
+	memset(data, 0, sizeof(struct iocache_private_data));
+	data->magic = IOCACHE_IO_CHANNEL_MAGIC;
+
+	io->manager = iocache_io_manager;
+	retval = ext2fs_get_mem(strlen(name) + 1, &io->name);
+	if (retval)
+		goto out_data;
+
+	strcpy(io->name, name);
+	io->private_data = data;
+	io->block_size = real->block_size;
+	io->read_error = 0;
+	io->write_error = 0;
+	io->refcount = 1;
+	io->flags = real->flags;
+	data->real = real;
+	real->app_data = io;
+	real->read_error = iocache_read_error;
+	real->write_error = iocache_write_error;
+
+	*channel = io;
+	return 0;
+
+out_data:
+	ext2fs_free_mem(&data);
+out_channel:
+	ext2fs_free_mem(&io);
+out_backing:
+	io_channel_close(real);
+	return retval;
+}
+
+static errcode_t iocache_close(io_channel channel)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+	errcode_t	retval = 0;
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	if (--channel->refcount > 0)
+		return 0;
+	if (data->real)
+		retval = io_channel_close(data->real);
+	ext2fs_free_mem(&channel->private_data);
+	if (channel->name)
+		ext2fs_free_mem(&channel->name);
+	ext2fs_free_mem(&channel);
+
+	return retval;
+}
+
+static errcode_t iocache_set_blksize(io_channel channel, int blksize)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+	errcode_t retval;
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	retval = io_channel_set_blksize(data->real, blksize);
+	if (retval)
+		return retval;
+
+	channel->block_size = data->real->block_size;
+	return 0;
+}
+
+static errcode_t iocache_flush(io_channel channel)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_flush(data->real);
+}
+
+static errcode_t iocache_write_byte(io_channel channel, unsigned long offset,
+				    int count, const void *buf)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_write_byte(data->real, offset, count, buf);
+}
+
+static errcode_t iocache_set_option(io_channel channel, const char *option,
+				    const char *arg)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return data->real->manager->set_option(data->real, option, arg);
+}
+
+static errcode_t iocache_get_stats(io_channel channel, io_stats *io_stats)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return data->real->manager->get_stats(data->real, io_stats);
+}
+
+static errcode_t iocache_read_blk64(io_channel channel,
+				    unsigned long long block, int count,
+				    void *buf)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_read_blk64(data->real, block, count, buf);
+}
+
+static errcode_t iocache_write_blk64(io_channel channel,
+				     unsigned long long block, int count,
+				     const void *buf)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_write_blk64(data->real, block, count, buf);
+}
+
+static errcode_t iocache_read_blk(io_channel channel, unsigned long block,
+				  int count, void *buf)
+{
+	return iocache_read_blk64(channel, block, count, buf);
+}
+
+static errcode_t iocache_write_blk(io_channel channel, unsigned long block,
+				   int count, const void *buf)
+{
+	return iocache_write_blk64(channel, block, count, buf);
+}
+
+static errcode_t iocache_discard(io_channel channel, unsigned long long block,
+				 unsigned long long count)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_discard(data->real, block, count);
+}
+
+static errcode_t iocache_cache_readahead(io_channel channel,
+					 unsigned long long block,
+					 unsigned long long count)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_cache_readahead(data->real, block, count);
+}
+
+static errcode_t iocache_zeroout(io_channel channel, unsigned long long block,
+				 unsigned long long count)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_zeroout(data->real, block, count);
+}
+
+static errcode_t iocache_get_fd(io_channel channel, int *fd)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_get_fd(data->real, fd);
+}
+
+static errcode_t iocache_invalidate_blocks(io_channel channel,
+					   unsigned long long block,
+					   unsigned long long count)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_invalidate_blocks(data->real, block, count);
+}
+
+static errcode_t iocache_flock(io_channel channel, unsigned int flock_flags)
+{
+	struct iocache_private_data *data = IOCACHE(channel);
+
+	EXT2_CHECK_MAGIC(channel, EXT2_ET_MAGIC_IO_CHANNEL);
+	EXT2_CHECK_MAGIC(data, IOCACHE_IO_CHANNEL_MAGIC);
+
+	return io_channel_flock(data->real, flock_flags);
+}
+
+static struct struct_io_manager struct_iocache_manager = {
+	.magic			= EXT2_ET_MAGIC_IO_MANAGER,
+	.name			= "iocache I/O manager",
+	.open			= iocache_open,
+	.close			= iocache_close,
+	.set_blksize		= iocache_set_blksize,
+	.read_blk		= iocache_read_blk,
+	.write_blk		= iocache_write_blk,
+	.flush			= iocache_flush,
+	.write_byte		= iocache_write_byte,
+	.set_option		= iocache_set_option,
+	.get_stats		= iocache_get_stats,
+	.read_blk64		= iocache_read_blk64,
+	.write_blk64		= iocache_write_blk64,
+	.discard		= iocache_discard,
+	.cache_readahead	= iocache_cache_readahead,
+	.zeroout		= iocache_zeroout,
+	.get_fd			= iocache_get_fd,
+	.invalidate_blocks	= iocache_invalidate_blocks,
+	.flock			= iocache_flock,
+};
+
+io_manager iocache_io_manager = &struct_iocache_manager;
+
+errcode_t iocache_set_backing_manager(io_manager manager)
+{
+	iocache_backing_manager = manager;
+	return 0;
+}


  reply	other threads:[~2026-02-23 23:44 UTC|newest]

Thread overview: 233+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-23 22:46 [PATCHBLIZZARD v7] fuse/libfuse/e2fsprogs: containerize ext4 for safer operation Darrick J. Wong
2026-02-23 23:00 ` [PATCHSET v7 1/9] fuse: general bug fixes Darrick J. Wong
2026-02-23 23:06   ` [PATCH 1/5] fuse: flush pending FUSE_RELEASE requests before sending FUSE_DESTROY Darrick J. Wong
2026-02-24 19:33     ` Joanne Koong
2026-02-24 19:57       ` Darrick J. Wong
2026-02-24 20:03         ` Joanne Koong
2026-02-23 23:06   ` [PATCH 2/5] fuse: quiet down complaints in fuse_conn_limit_write Darrick J. Wong
2026-02-24  8:36     ` Horst Birthelmer
2026-02-24 19:17       ` Darrick J. Wong
2026-02-24 20:09     ` Joanne Koong
2026-02-27 16:05     ` Miklos Szeredi
2026-02-23 23:07   ` [PATCH 3/5] fuse: implement file attributes mask for statx Darrick J. Wong
2026-03-25 18:35     ` Joanne Koong
2026-03-25 22:12       ` Darrick J. Wong
2026-02-23 23:07   ` [PATCH 4/5] fuse: update file mode when updating acls Darrick J. Wong
2026-03-25 19:39     ` Joanne Koong
2026-03-25 22:23       ` Darrick J. Wong
2026-02-23 23:07   ` [PATCH 5/5] fuse: propagate default and file acls on creation Darrick J. Wong
2026-02-23 23:00 ` [PATCHSET v7 2/9] iomap: cleanups ahead of adding fuse support Darrick J. Wong
2026-02-23 23:07   ` [PATCH 1/2] iomap: allow directio callers to supply _COMP_WORK Darrick J. Wong
2026-02-24 14:00     ` Christoph Hellwig
2026-02-24 19:17       ` Darrick J. Wong
2026-02-23 23:08   ` [PATCH 2/2] iomap: allow NULL swap info bdev when activating swapfile Darrick J. Wong
2026-02-24 14:01     ` Christoph Hellwig
2026-02-24 19:26       ` Darrick J. Wong
2026-02-25 14:16         ` Christoph Hellwig
2026-02-25 17:03           ` Darrick J. Wong
2026-02-25 17:49             ` Christoph Hellwig
2026-02-23 23:01 ` [PATCHSET v7 3/9] fuse: cleanups ahead of adding fuse support Darrick J. Wong
2026-02-23 23:08   ` [PATCH 1/2] fuse: move the passthrough-specific code back to passthrough.c Darrick J. Wong
2026-02-23 23:08   ` [PATCH 2/2] fuse_trace: " Darrick J. Wong
2026-02-23 23:01 ` [PATCHSET v7 4/9] fuse: allow servers to use iomap for better file IO performance Darrick J. Wong
2026-02-23 23:08   ` [PATCH 01/33] fuse: implement the basic iomap mechanisms Darrick J. Wong
2026-02-23 23:09   ` [PATCH 02/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:09   ` [PATCH 03/33] fuse: make debugging configurable at runtime Darrick J. Wong
2026-02-23 23:09   ` [PATCH 04/33] fuse: adapt FUSE_DEV_IOC_BACKING_{OPEN,CLOSE} to add new iomap devices Darrick J. Wong
2026-02-23 23:09   ` [PATCH 05/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:10   ` [PATCH 06/33] fuse: enable SYNCFS and ensure we flush everything before sending DESTROY Darrick J. Wong
2026-02-23 23:10   ` [PATCH 07/33] fuse: clean up per-file type inode initialization Darrick J. Wong
2026-02-23 23:10   ` [PATCH 08/33] fuse: create a per-inode flag for setting exclusive mode Darrick J. Wong
2026-02-23 23:11   ` [PATCH 09/33] fuse: create a per-inode flag for toggling iomap Darrick J. Wong
2026-02-23 23:11   ` [PATCH 10/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:11   ` [PATCH 11/33] fuse: isolate the other regular file IO paths from iomap Darrick J. Wong
2026-02-23 23:11   ` [PATCH 12/33] fuse: implement basic iomap reporting such as FIEMAP and SEEK_{DATA,HOLE} Darrick J. Wong
2026-02-23 23:12   ` [PATCH 13/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:12   ` [PATCH 14/33] fuse: implement direct IO with iomap Darrick J. Wong
2026-02-23 23:12   ` [PATCH 15/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:12   ` [PATCH 16/33] fuse: implement buffered " Darrick J. Wong
2026-02-27 18:04     ` Darrick J. Wong
2026-02-23 23:13   ` [PATCH 17/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:13   ` [PATCH 18/33] fuse: use an unrestricted backing device with iomap pagecache io Darrick J. Wong
2026-02-23 23:13   ` [PATCH 19/33] fuse: implement large folios for iomap pagecache files Darrick J. Wong
2026-02-23 23:13   ` [PATCH 20/33] fuse: advertise support for iomap Darrick J. Wong
2026-02-23 23:14   ` [PATCH 21/33] fuse: query filesystem geometry when using iomap Darrick J. Wong
2026-02-23 23:14   ` [PATCH 22/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:14   ` [PATCH 23/33] fuse: implement fadvise for iomap files Darrick J. Wong
2026-02-23 23:14   ` [PATCH 24/33] fuse: invalidate ranges of block devices being used for iomap Darrick J. Wong
2026-02-23 23:15   ` [PATCH 25/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:15   ` [PATCH 26/33] fuse: implement inline data file IO via iomap Darrick J. Wong
2026-02-27 18:02     ` Darrick J. Wong
2026-02-23 23:15   ` [PATCH 27/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:15   ` [PATCH 28/33] fuse: allow more statx fields Darrick J. Wong
2026-02-23 23:16   ` [PATCH 29/33] fuse: support atomic writes with iomap Darrick J. Wong
2026-02-24 12:58     ` Pankaj Raghav (Samsung)
2026-02-24 19:30       ` Darrick J. Wong
2026-02-24 21:18         ` Pankaj Raghav (Samsung)
2026-02-23 23:16   ` [PATCH 30/33] fuse_trace: " Darrick J. Wong
2026-02-23 23:16   ` [PATCH 31/33] fuse: disable direct fs reclaim for any fuse server that uses iomap Darrick J. Wong
2026-02-23 23:17   ` [PATCH 32/33] fuse: enable swapfile activation on iomap Darrick J. Wong
2026-02-23 23:17   ` [PATCH 33/33] fuse: implement freeze and shutdowns for iomap filesystems Darrick J. Wong
2026-02-23 23:01 ` [PATCHSET v7 5/9] fuse: allow servers to specify root node id Darrick J. Wong
2026-02-23 23:17   ` [PATCH 1/3] fuse: make the root nodeid dynamic Darrick J. Wong
2026-02-23 23:17   ` [PATCH 2/3] fuse_trace: " Darrick J. Wong
2026-02-23 23:18   ` [PATCH 3/3] fuse: allow setting of root nodeid Darrick J. Wong
2026-02-23 23:01 ` [PATCHSET v7 6/9] fuse: handle timestamps and ACLs correctly when iomap is enabled Darrick J. Wong
2026-02-23 23:18   ` [PATCH 1/9] fuse: enable caching of timestamps Darrick J. Wong
2026-02-23 23:18   ` [PATCH 2/9] fuse: force a ctime update after a fileattr_set call when in iomap mode Darrick J. Wong
2026-02-23 23:18   ` [PATCH 3/9] fuse: allow local filesystems to set some VFS iflags Darrick J. Wong
2026-02-23 23:19   ` [PATCH 4/9] fuse_trace: " Darrick J. Wong
2026-02-23 23:19   ` [PATCH 5/9] fuse: cache atime when in iomap mode Darrick J. Wong
2026-02-23 23:19   ` [PATCH 6/9] fuse: let the kernel handle KILL_SUID/KILL_SGID for iomap filesystems Darrick J. Wong
2026-02-23 23:19   ` [PATCH 7/9] fuse_trace: " Darrick J. Wong
2026-02-23 23:20   ` [PATCH 8/9] fuse: update ctime when updating acls on an iomap inode Darrick J. Wong
2026-02-23 23:20   ` [PATCH 9/9] fuse: always cache ACLs when using iomap Darrick J. Wong
2026-02-23 23:02 ` [PATCHSET v7 7/9] fuse: cache iomap mappings for even better file IO performance Darrick J. Wong
2026-02-23 23:20   ` [PATCH 01/12] fuse: cache iomaps Darrick J. Wong
2026-02-27 18:07     ` Darrick J. Wong
2026-02-23 23:20   ` [PATCH 02/12] fuse_trace: " Darrick J. Wong
2026-02-23 23:21   ` [PATCH 03/12] fuse: use the iomap cache for iomap_begin Darrick J. Wong
2026-02-23 23:21   ` [PATCH 04/12] fuse_trace: " Darrick J. Wong
2026-02-23 23:21   ` [PATCH 05/12] fuse: invalidate iomap cache after file updates Darrick J. Wong
2026-02-23 23:21   ` [PATCH 06/12] fuse_trace: " Darrick J. Wong
2026-02-23 23:22   ` [PATCH 07/12] fuse: enable iomap cache management Darrick J. Wong
2026-02-23 23:22   ` [PATCH 08/12] fuse_trace: " Darrick J. Wong
2026-02-23 23:22   ` [PATCH 09/12] fuse: overlay iomap inode info in struct fuse_inode Darrick J. Wong
2026-02-23 23:23   ` [PATCH 10/12] fuse: constrain iomap mapping cache size Darrick J. Wong
2026-02-23 23:23   ` [PATCH 11/12] fuse_trace: " Darrick J. Wong
2026-02-23 23:23   ` [PATCH 12/12] fuse: enable iomap Darrick J. Wong
2026-02-23 23:02 ` [PATCHSET v7 8/9] fuse: run fuse servers as a contained service Darrick J. Wong
2026-02-23 23:23   ` [PATCH 1/2] fuse: allow privileged mount helpers to pre-approve iomap usage Darrick J. Wong
2026-02-23 23:24   ` [PATCH 2/2] fuse: set iomap backing device block size Darrick J. Wong
2026-02-23 23:02 ` [PATCHSET RFC 9/9] fuse: allow fuse servers to upload iomap BPF programs Darrick J. Wong
2026-02-23 23:24   ` [PATCH 1/5] fuse: enable fuse servers to upload BPF programs to handle iomap requests Darrick J. Wong
2026-02-23 23:24   ` [PATCH 2/5] fuse_trace: " Darrick J. Wong
2026-02-23 23:24   ` [PATCH 3/5] fuse: prevent iomap bpf programs from writing to most of the system Darrick J. Wong
2026-02-23 23:25   ` [PATCH 4/5] fuse: add kfuncs for iomap bpf programs to manage the cache Darrick J. Wong
2026-02-23 23:25   ` [PATCH 5/5] fuse: make fuse_inode opaque to iomap bpf programs Darrick J. Wong
2026-02-23 23:02 ` [PATCHSET v7 1/6] libfuse: allow servers to use iomap for better file IO performance Darrick J. Wong
2026-02-23 23:25   ` [PATCH 01/25] libfuse: bump kernel and library ABI versions Darrick J. Wong
2026-02-23 23:25   ` [PATCH 02/25] libfuse: wait in do_destroy until all open files are closed Darrick J. Wong
2026-02-23 23:26   ` [PATCH 03/25] libfuse: add kernel gates for FUSE_IOMAP Darrick J. Wong
2026-02-23 23:26   ` [PATCH 04/25] libfuse: add fuse commands for iomap_begin and end Darrick J. Wong
2026-02-23 23:26   ` [PATCH 05/25] libfuse: add upper level iomap commands Darrick J. Wong
2026-02-23 23:26   ` [PATCH 06/25] libfuse: add a lowlevel notification to add a new device to iomap Darrick J. Wong
2026-02-23 23:27   ` [PATCH 07/25] libfuse: add upper-level iomap add device function Darrick J. Wong
2026-02-23 23:27   ` [PATCH 08/25] libfuse: add iomap ioend low level handler Darrick J. Wong
2026-02-23 23:27   ` [PATCH 09/25] libfuse: add upper level iomap ioend commands Darrick J. Wong
2026-02-23 23:27   ` [PATCH 10/25] libfuse: add a reply function to send FUSE_ATTR_* to the kernel Darrick J. Wong
2026-02-23 23:28   ` [PATCH 11/25] libfuse: connect high level fuse library to fuse_reply_attr_iflags Darrick J. Wong
2026-02-23 23:28   ` [PATCH 12/25] libfuse: support enabling exclusive mode for files Darrick J. Wong
2026-02-23 23:28   ` [PATCH 13/25] libfuse: support direct I/O through iomap Darrick J. Wong
2026-02-23 23:29   ` [PATCH 14/25] libfuse: don't allow hardlinking of iomap files in the upper level fuse library Darrick J. Wong
2026-02-23 23:29   ` [PATCH 15/25] libfuse: allow discovery of the kernel's iomap capabilities Darrick J. Wong
2026-02-23 23:29   ` [PATCH 16/25] libfuse: add lower level iomap_config implementation Darrick J. Wong
2026-02-23 23:29   ` [PATCH 17/25] libfuse: add upper " Darrick J. Wong
2026-02-23 23:30   ` [PATCH 18/25] libfuse: add low level code to invalidate iomap block device ranges Darrick J. Wong
2026-02-23 23:30   ` [PATCH 19/25] libfuse: add upper-level API to invalidate parts of an iomap block device Darrick J. Wong
2026-02-23 23:30   ` [PATCH 20/25] libfuse: add atomic write support Darrick J. Wong
2026-02-23 23:30   ` [PATCH 21/25] libfuse: allow disabling of fs memory reclaim and write throttling Darrick J. Wong
2026-02-23 23:31   ` [PATCH 22/25] libfuse: create a helper to transform an open regular file into an open loopdev Darrick J. Wong
2026-02-23 23:31   ` [PATCH 23/25] libfuse: add swapfile support for iomap files Darrick J. Wong
2026-02-23 23:31   ` [PATCH 24/25] libfuse: add lower-level filesystem freeze, thaw, and shutdown requests Darrick J. Wong
2026-02-23 23:31   ` [PATCH 25/25] libfuse: add upper-level filesystem freeze, thaw, and shutdown events Darrick J. Wong
2026-02-23 23:03 ` [PATCHSET v7 2/6] libfuse: allow servers to specify root node id Darrick J. Wong
2026-02-23 23:32   ` [PATCH 1/1] libfuse: allow root_nodeid mount option Darrick J. Wong
2026-02-23 23:03 ` [PATCHSET v7 3/6] libfuse: implement syncfs Darrick J. Wong
2026-02-23 23:32   ` [PATCH 1/2] libfuse: add strictatime/lazytime mount options Darrick J. Wong
2026-02-23 23:32   ` [PATCH 2/2] libfuse: set sync, immutable, and append when loading files Darrick J. Wong
2026-02-23 23:03 ` [PATCHSET v7 4/6] libfuse: cache iomap mappings for even better file IO performance Darrick J. Wong
2026-02-23 23:32   ` [PATCH 1/5] libfuse: enable iomap cache management for lowlevel fuse Darrick J. Wong
2026-02-23 23:33   ` [PATCH 2/5] libfuse: add upper-level iomap cache management Darrick J. Wong
2026-02-23 23:33   ` [PATCH 3/5] libfuse: allow constraining of iomap mapping cache size Darrick J. Wong
2026-02-23 23:33   ` [PATCH 4/5] libfuse: add upper-level iomap mapping cache constraint code Darrick J. Wong
2026-02-23 23:33   ` [PATCH 5/5] libfuse: enable iomap Darrick J. Wong
2026-02-23 23:03 ` [PATCHSET v7 5/6] libfuse: run fuse servers as a contained service Darrick J. Wong
2026-02-23 23:34   ` [PATCH 1/5] libfuse: add systemd/inetd socket service mounting helper Darrick J. Wong
2026-02-23 23:34   ` [PATCH 2/5] libfuse: integrate fuse services into mount.fuse3 Darrick J. Wong
2026-02-23 23:34   ` [PATCH 3/5] libfuse: delegate iomap privilege from mount.service to fuse services Darrick J. Wong
2026-02-23 23:34   ` [PATCH 4/5] libfuse: enable setting iomap block device block size Darrick J. Wong
2026-02-23 23:35   ` [PATCH 5/5] fuservicemount: create loop devices for regular files Darrick J. Wong
2026-02-23 23:04 ` [PATCHSET RFC 6/6] fuse: allow fuse servers to upload iomap BPF programs Darrick J. Wong
2026-02-23 23:35   ` [PATCH 1/3] libfuse: allow fuse servers to upload bpf code for iomap functions Darrick J. Wong
2026-02-23 23:35   ` [PATCH 2/3] libfuse: add kfuncs for iomap bpf programs to manage the cache Darrick J. Wong
2026-02-23 23:36   ` [PATCH 3/3] libfuse: make fuse_inode opaque to iomap bpf programs Darrick J. Wong
2026-02-23 23:04 ` [PATCHSET v7 1/8] fuse2fs: use fuse iomap data paths for better file I/O performance Darrick J. Wong
2026-02-23 23:36   ` [PATCH 01/19] fuse2fs: implement bare minimum iomap for file mapping reporting Darrick J. Wong
2026-02-23 23:36   ` [PATCH 02/19] fuse2fs: add iomap= mount option Darrick J. Wong
2026-02-23 23:36   ` [PATCH 03/19] fuse2fs: implement iomap configuration Darrick J. Wong
2026-02-23 23:37   ` [PATCH 04/19] fuse2fs: register block devices for use with iomap Darrick J. Wong
2026-02-23 23:37   ` [PATCH 05/19] fuse2fs: implement directio file reads Darrick J. Wong
2026-02-23 23:37   ` [PATCH 06/19] fuse2fs: add extent dump function for debugging Darrick J. Wong
2026-02-23 23:37   ` [PATCH 07/19] fuse2fs: implement direct write support Darrick J. Wong
2026-02-23 23:38   ` [PATCH 08/19] fuse2fs: turn on iomap for pagecache IO Darrick J. Wong
2026-02-23 23:38   ` [PATCH 09/19] fuse2fs: don't zero bytes in punch hole Darrick J. Wong
2026-02-23 23:38   ` [PATCH 10/19] fuse2fs: don't do file data block IO when iomap is enabled Darrick J. Wong
2026-02-23 23:38   ` [PATCH 11/19] fuse2fs: try to create loop device when ext4 device is a regular file Darrick J. Wong
2026-02-23 23:39   ` [PATCH 12/19] fuse2fs: enable file IO to inline data files Darrick J. Wong
2026-02-23 23:39   ` [PATCH 13/19] fuse2fs: set iomap-related inode flags Darrick J. Wong
2026-02-23 23:39   ` [PATCH 14/19] fuse2fs: configure block device block size Darrick J. Wong
2026-02-23 23:39   ` [PATCH 15/19] fuse4fs: separate invalidation Darrick J. Wong
2026-02-23 23:40   ` [PATCH 16/19] fuse2fs: implement statx Darrick J. Wong
2026-02-23 23:40   ` [PATCH 17/19] fuse2fs: enable atomic writes Darrick J. Wong
2026-02-23 23:40   ` [PATCH 18/19] fuse4fs: disable fs reclaim and write throttling Darrick J. Wong
2026-02-23 23:41   ` [PATCH 19/19] fuse2fs: implement freeze and shutdown requests Darrick J. Wong
2026-02-23 23:04 ` [PATCHSET v7 2/8] fuse4fs: specify the root node id Darrick J. Wong
2026-02-23 23:41   ` [PATCH 1/1] fuse4fs: don't use inode number translation when possible Darrick J. Wong
2026-02-23 23:05 ` [PATCHSET v7 3/8] fuse2fs: handle timestamps and ACLs correctly when iomap is enabled Darrick J. Wong
2026-02-23 23:41   ` [PATCH 01/10] fuse2fs: add strictatime/lazytime mount options Darrick J. Wong
2026-02-23 23:41   ` [PATCH 02/10] fuse2fs: skip permission checking on utimens when iomap is enabled Darrick J. Wong
2026-02-23 23:42   ` [PATCH 03/10] fuse2fs: let the kernel tell us about acl/mode updates Darrick J. Wong
2026-02-23 23:42   ` [PATCH 04/10] fuse2fs: better debugging for file mode updates Darrick J. Wong
2026-02-23 23:42   ` [PATCH 05/10] fuse2fs: debug timestamp updates Darrick J. Wong
2026-02-23 23:42   ` [PATCH 06/10] fuse2fs: use coarse timestamps for iomap mode Darrick J. Wong
2026-02-23 23:43   ` [PATCH 07/10] fuse2fs: add tracing for retrieving timestamps Darrick J. Wong
2026-02-23 23:43   ` [PATCH 08/10] fuse2fs: enable syncfs Darrick J. Wong
2026-02-23 23:43   ` [PATCH 09/10] fuse2fs: set sync, immutable, and append at file load time Darrick J. Wong
2026-02-23 23:43   ` [PATCH 10/10] fuse4fs: increase attribute timeout in iomap mode Darrick J. Wong
2026-02-23 23:05 ` [PATCHSET v7 4/8] fuse2fs: cache iomap mappings for even better file IO performance Darrick J. Wong
2026-02-23 23:44   ` [PATCH 1/3] fuse2fs: enable caching of iomaps Darrick J. Wong
2026-02-23 23:44   ` [PATCH 2/3] fuse2fs: constrain iomap mapping cache size Darrick J. Wong
2026-02-23 23:44   ` [PATCH 3/3] fuse2fs: enable iomap Darrick J. Wong
2026-02-23 23:05 ` [PATCHSET v7 5/8] fuse2fs: improve block and inode caching Darrick J. Wong
2026-02-23 23:44   ` Darrick J. Wong [this message]
2026-02-23 23:45   ` [PATCH 2/6] iocache: add the actual buffer cache Darrick J. Wong
2026-02-23 23:45   ` [PATCH 3/6] iocache: bump buffer mru priority every 50 accesses Darrick J. Wong
2026-02-23 23:45   ` [PATCH 4/6] fuse2fs: enable caching IO manager Darrick J. Wong
2026-02-23 23:45   ` [PATCH 5/6] fuse2fs: increase inode cache size Darrick J. Wong
2026-02-23 23:46   ` [PATCH 6/6] libext2fs: improve caching for inodes Darrick J. Wong
2026-02-23 23:05 ` [PATCHSET v7 6/8] fuse4fs: run servers as a contained service Darrick J. Wong
2026-02-23 23:46   ` [PATCH 1/8] libext2fs: fix MMP code to work with unixfd IO manager Darrick J. Wong
2026-02-23 23:46   ` [PATCH 2/8] fuse4fs: enable safe service mode Darrick J. Wong
2026-02-23 23:47   ` [PATCH 3/8] fuse4fs: set proc title when in fuse " Darrick J. Wong
2026-02-23 23:47   ` [PATCH 4/8] fuse4fs: upsert first file mapping to kernel on open Darrick J. Wong
2026-02-23 23:47   ` [PATCH 5/8] fuse4fs: set iomap backing device blocksize Darrick J. Wong
2026-02-23 23:47   ` [PATCH 6/8] fuse4fs: ask for loop devices when opening via fuservicemount Darrick J. Wong
2026-02-23 23:48   ` [PATCH 7/8] fuse4fs: make MMP work correctly in safe service mode Darrick J. Wong
2026-02-23 23:48   ` [PATCH 8/8] debian: update packaging for fuse4fs service Darrick J. Wong
2026-02-23 23:06 ` [PATCHSET v7 7/8] fuse4fs: reclaim buffer cache under memory pressure Darrick J. Wong
2026-02-23 23:48   ` [PATCH 1/4] libsupport: add pressure stall monitor Darrick J. Wong
2026-02-23 23:48   ` [PATCH 2/4] fuse2fs: only reclaim buffer cache when there is memory pressure Darrick J. Wong
2026-02-23 23:49   ` [PATCH 3/4] fuse4fs: enable memory pressure monitoring with service containers Darrick J. Wong
2026-02-23 23:49   ` [PATCH 4/4] fuse2fs: flush dirty metadata periodically Darrick J. Wong
2026-02-23 23:06 ` [PATCHSET RFC 8/8] fuse: allow fuse servers to upload iomap BPF programs Darrick J. Wong
2026-02-23 23:49   ` [PATCH 1/3] fuse4fs: add dynamic iomap bpf prototype which will break FIEMAP Darrick J. Wong
2026-02-23 23:49   ` [PATCH 2/3] fuse4fs: wire up caching examples to fuse iomap bpf program Darrick J. Wong
2026-02-23 23:50   ` [PATCH 3/3] fuse4fs: adjust test bpf program to deal with opaque inodes Darrick J. Wong
2026-03-16 17:56 ` [PATCHBLIZZARD v7] fuse/libfuse/e2fsprogs: containerize ext4 for safer operation Joanne Koong
2026-03-16 18:04   ` Darrick J. Wong
2026-03-16 23:08     ` Joanne Koong
2026-03-16 23:41       ` Darrick J. Wong
2026-03-17  0:20         ` Demi Marie Obenour
2026-03-17 13:59           ` Theodore Tso
2026-03-17 14:05             ` Demi Marie Obenour
2026-03-17 15:20               ` Theodore Tso
2026-03-18 21:31           ` Darrick J. Wong
2026-03-19  7:28             ` Demi Marie Obenour
2026-03-19 16:08               ` Darrick J. Wong
2026-03-20 17:04                 ` Joanne Koong
2026-03-20 20:31                   ` Darrick J. Wong
2026-03-17  0:10       ` Demi Marie Obenour
  -- strict thread matches above, loose matches on Subject: below --
2025-10-29  0:42 [PATCHSET v6 5/6] fuse2fs: improve block and inode caching Darrick J. Wong
2025-10-29  1:17 ` [PATCH 1/6] libsupport: add caching IO manager Darrick J. Wong
2025-09-16  0:23 [PATCHSET RFC v5 8/9] fuse2fs: improve block and inode caching Darrick J. Wong
2025-09-16  1:07 ` [PATCH 1/6] libsupport: add caching IO manager Darrick J. Wong
2025-08-21  0:50 [PATCHSET RFC v4 6/6] fuse2fs: improve block and inode caching Darrick J. Wong
2025-08-21  1:23 ` [PATCH 1/6] libsupport: add caching IO manager 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=177188745710.3944626.12922351035440029162.stgit@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=bernd@bsbernd.com \
    --cc=bpf@vger.kernel.org \
    --cc=joannelkoong@gmail.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=neal@gompa.dev \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

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

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox