From: "Darrick J. Wong" <djwong@kernel.org>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: miklos@szeredi.hu, bernd@bsbernd.com, neal@gompa.dev,
linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: Re: [PATCHSET v6 4/8] fuse: allow servers to use iomap for better file IO performance
Date: Thu, 29 Jan 2026 15:12:17 -0800 [thread overview]
Message-ID: <20260129231217.GA7693@frogsfrogsfrogs> (raw)
In-Reply-To: <CAJnrk1ag3ffQC=U1ZXVLTipDyo1VBQBM3MYNB6=6d4ywLOEieA@mail.gmail.com>
On Thu, Jan 29, 2026 at 02:50:23PM -0800, Joanne Koong wrote:
> On Thu, Jan 29, 2026 at 12:02 PM Darrick J. Wong <djwong@kernel.org> wrote:
> >
> > On Wed, Jan 28, 2026 at 05:12:54PM -0800, Joanne Koong wrote:
> >
> > <snip>
> >
> > > > > > > > Hrmm. Now that /is/ an interesting proposal. Does BPF have a data
> > > > > > > > structure that supports interval mappings? I think the existing bpf map
> > > > > > >
> > > > > > > Not yet but I don't see why a b+ tree like data strucutre couldn't be added.
> > > > > > > Maybe one workaround in the meantime that could work is using a sorted
> > > > > > > array map and doing binary search on that, until interval mappings can
> > > > > > > be natively supported?
> > > > > >
> > > > > > I guess, though I already had a C structure to borrow from xfs ;)
> > > > > >
> > > > > > > > only does key -> value. Also, is there an upper limit on the size of a
> > > > > > > > map? You could have hundreds of millions of maps for a very fragmented
> > > > > > > > regular file.
> > > > > > >
> > > > > > > If I'm remembering correctly, there's an upper limit on the number of
> > > > > > > map entries, which is bounded by u32
> > > > > >
> > > > > > That's problematic, since files can have 64-bit logical block numbers.
> > > > >
> > > > > The key size supports 64-bits. The u32 bound would be the limit on the
> > > > > number of extents for the file.
> > > >
> > > > Oh, ok. If one treats the incore map as a cache and evicts things when
> > > > they get too old, then that would be fine. I misread that as an upper
> > > > limit on the *range* of the map entry keys. :/
> > >
> > > I think for more complicated servers, the bpf prog handling for
> > > iomap_begin() would essentially just serve as a cache where if it's
> > > not found in the cache, then it sends off the FUSE_IOMAP_BEGIN request
> > > to the server. For servers that don't need as much complicated logic
> > > (eg famfs), the iomap_begin() logic would just be executed within the
> > > bpf prog itself.
> >
> > Yes, I like the fuse_iomap_begin logic flow of:
> >
> > 1. Try to use a mapping in the iext tree
> > 2. Call a BPF program to try to generate a mapping
> > 3. Issue a fuse command to userspace
> >
> > wherein #2 and #3 can signal that #1 should be retried. (This is
> > already provided by FUSE_IOMAP_TYPE_RETRY_CACHE, FWIW)
> >
> > That said, BPF doesn't expose an interval btree data structure. I think
> > it would be better to add the iext mapping cache and make it so that bpf
> > programs could call fuse_iomap_cache_{upsert,remove,lookup}. You could
> > use the interval tree too, but the iext tree has the advantage of higher
> > fanout factor.
> >
> > > > As it stands, I need to figure out a way to trim the iomap btree when
> > > > memory gets tight. Right now it'll drop the cache whenever someone
> > > > closes the file, but that won't help for long-life processes that open a
> > > > heavily fragmented file and never close it.
> > > >
> > > > A coding-intensive way to do that would be to register a shrinker and
> > > > deal with that, but ugh. A really stupid way would be to drop the whole
> > > > cache once you get beyond (say) 64k of memory usage (~2000 mappings).
> > >
> > > This kind of seems like another point in favor of giving userspace
> > > control of the caching layer. They could then implement whatever
> > > eviction policies they want.
> >
> > Note that userspace already can control the cached iomappings --
> > FUSE_NOTIFY_IOMAP_UPSERT pushes a mapping into the iext tree, and
> > FUSE_NOTIFY_IOMAP_INVAL removes them. The fuse server can decide to
>
> This incurs round-trip context-switch costs though, which the bpf prog
> approach doesn't incur.
I realize that, but I think we're simply headed towards a fast path
wherein you can upload a bpf program; and a slow path for big complex
filesystems like ext4. ext4 always gonna be slow. :)
> > evict whenever it pleases, though admittedly the iext tree doesn't track
> > usage information of any kind, so how would the fuse server know?
> >
> > The static limit is merely the kernel's means to establish a hard limit
> > on the memory consumption of the iext tree, since it can't trust
> > userspace completely.
> >
> > > It also allows them to prepopulate the cache upfront (eg when
> > > servicing a file open request, if the file is below a certain size or
> > > if the server knows what'll be hot, it could put those extents into
> > > the map from the get-go).
> >
> > Hrm. I haven't tried issuing FUSE_NOTIFY_IOMAP_UPSERT during an open
> > call, but I suppose it's possible.
(It's quite possible; running through QA now)
> > > in my opinion, the fuse-iomap layer should try to be as simple/minimal
> > > and as generic as possible. I haven't read through iomap_cache.c yet
> > > but the header comment suggests it's adapted from the xfs extent tree
> >
> > Rudely copied, not adapted ;)
> >
> > I actually wonder if I should make a horrible macro to generate the
> > fuse_iext_* structures and functions, and then xfs_iext_tree.c and
> > fuse_iomap_cache.c can "share" that hairba^Wcode.
> >
> > > cache. As I understand it, different filesystem implementations have
> > > different caching architectures that are better suited for their use
> > > cases
> >
> > Err. The way this evolved is ... way too long to go into in this email.
> > Here's a truncated version; I can tell you the full story next week.
> >
> > Most filesystems store their file mapping data on disk in whatever
> > format the designers specified. When the pagecache asks them to read
> > or write the cache, they attach buffer heads to the folio, fill out the
> > buffer heads with the minimum mapping information needed to map the
> > folios to disk addresses. bios are constructed for each folio based on
> > what's in the bufferhead.
> >
> > This was fine for filesystems that map each block individually, such as
> > FFS/ext2/ext3/fat...
> >
> > > (I'm guessing that's the case, otherwise there would just be one
> > > general cache inside iomap all the filesystems would use?). It seems a
> >
> > ...but newer filesystems such as xfs/ext4/btrfs map a bunch of blocks at
> > a time. Each of them invented their own private incore mapping
> > structures to mirror the ondisk structure. xfs kept using the old
> > bufferheads into the early 2010s, ext4 is still using them, and btrfs
> > went its own way from the start.
> >
> > Eventually XFS grew its own internal extent-to-bio mapping code that
> > flipped the model -- rather than get a pagecache folio, map the folio to
> > blocks, and issue IOs based on the blocks, it would get the file
> > mapping, grab folios for the whole mapping, and issue bios for the batch
> > of folios. That's more efficient, but at this point we have a legacy
> > codebase problem for everything else in fs/.
> >
> > In 2019, hch and I decided to export the extent-to-bio mapping code from
> > xfs so that new filesystems could start with something cleaner than
> > bufferheads. In the past 7 years, nobody's added a new filesystem with
> > complex mapping requirements; they've only ported existing filesystems
> > to it, without further refactoring of their incore data structures.
> > That's why there's no generic iomap cache.
>
> Oh I see, so it actually *is* a generic cache? Just that the other
No, quite the opposite. fs/iomap/ handles individual mapping records,
but does not itself implement a cache. A filesystem /could/ decide that
it wants to translate its ondisk mappings directly into a struct iomap
and then push that struct iomap object into a cache, but it would have
to implement the incore cache itself.
"struct iomap" is merely a generic interface; prior to the hoist, the IO
mapping code in xfs directly handled struct xfs_bmbt_irec objects. Now
xfs translates xfs_bmbt_irec objects from its own cache into a struct
iomap and returns that from ->iomap_begin.
That said it wouldn't be terrible to provide a generic cache
implementation. But the hard part is that caching struct iomap objects
would result in more memory use for XFS because xfs_bmbt_irec is
bitpacked.
> filesystems haven't ported over to it yet? That changes my opinion a
> lot on this then. If it's a generic cache that pretty much any modern
> filesystem should use, then it seems reasonable to me to have it on
> the fuse iomap kernel side. Though in that case, it seems a lot
> cleaner imo if the cache could be ported to the iomap layer as a
> generic cache (which seems like it'd be useful anyways for other
> filesystems to use if/when they port over to it, if I'm understanding
> what you're saying correctly), and then fuse just call into that api.
<nod> That sounds like a good long term goal. For now let's get it
working inside fuse and then we can see if any other filesystems are
interested.
Also unclear: do filesystems want to hang more data off the incore
mapping data than the dataset that iomap itself needs? That would
hamper attempts to make a generic iomap cache.
> >
> > > lot better to me to just let the userspace server define that
> > > themselves. And selfishly from the fuse perspective, would be less
> >
> > Well if I turned the iext code into a template then fuse would only need
> > enough glue code to declare a template class and use it. The glue part
> > is only ... 230LOC.
>
> Nice, I think this would be a lot nicer / less of a headache in the
> future for fuse to maintain.
>
> >
> > > code we would have to maintain. And I guess too if some servers don't
> > > need caching (like famfs?), they could avoid that overhead.
> >
> > Hrm. Right now the struct fuse_iomap_cache is embedded in struct
> > fuse_inode, but that could be turned into a dynamic allocation.
> >
> > > > > > > > At one point I suggested to the famfs maintainer that it might be
> > > > > > > > easier/better to implement the interleaved mapping lookups as bpf
> > > > > > > > programs instead of being stuck with a fixed format in the fuse
> > > > > > > > userspace abi, but I don't know if he ever implemented that.
> > > > > > >
> > > > > > > This seems like a good use case for it too
> > > > > > > >
> > > > > > > > > Is this your
> > > > > > > > > assessment of it as well or do you think the server-side logic for
> > > > > > > > > iomap_begin()/iomap_end() is too complicated to make this realistic?
> > > > > > > > > Asking because I'm curious whether this direction makes sense, not
> > > > > > > > > because I think it would be a blocker for your series.
> > > > > > > >
> > > > > > > > For disk-based filesystems I think it would be difficult to model a bpf
> > > > > > > > program to do mappings, since they can basically point anywhere and be
> > > > > > > > of any size.
> > > > > > >
> > > > > > > Hmm I'm not familiar enough with disk-based filesystems to know what
> > > > > > > the "point anywhere and be of any size" means. For the mapping stuff,
> > > > > > > doesn't it just point to a block number? Or are you saying the problem
> > > > > > > would be there's too many mappings since a mapping could be any size?
> > > > > >
> > > > > > The second -- mappings can be any size, and unprivileged userspace can
> > > > > > control the mappings.
> > > > >
> > > > > If I'm understanding what you're saying here, this is the same
> > > > > discussion as the one above about the u32 bound, correct?
> > > >
> > > > A different thing -- file data mappings are irregularly sized, can
> > > > contain sparse holes, etc. Userspace controls the size and offset of
> > > > each mapping record (thanks to magic things like fallocate) so it'd be
> > > > very difficult to create a bpf program to generate mappings on the fly.
> > >
> > > Would the bpf prog have to generate mappings on the fly though? If the
> > > userspace does things like fallocate, those operations would still go
> > > through to the server as a regular request (eg FUSE_FALLOCATE) and on
> > > the server side, it'd add that to the map dynamically from userspace.
> >
> > That depends on the fuse server design. For simple things like famfs
> > where the layout is bog simple and there's no fancy features like
> > delayed allocation or unwritten extents, then you could probably get
> > away a BPF program to generate the entire mapping set. I suspect an
> > object-store type filesystem (aka write a file once, close it, snapshot
> > it, and never change it again) might be good at landing all the file
> > data in relatively few extent mappings, and it could actually compile a
> > custom bpf program for that file and push it to the kernel.
> >
> > > > Also you could have 2^33 mappings records for a file, so I think you
> > > > can't even write a bpf program that large.
> > >
> > > I think this depends on what map structure gets used. If there is
> > > native support added for b+ tree like data structures, I don't see why
> > > it wouldn't be able to.
> >
> > <nod>
> >
> > > > > > > I was thinking the issue would be more that there might be other logic
> > > > > > > inside ->iomap_begin()/->iomap_end() besides the mapping stuff that
> > > > > > > would need to be done that would be too out-of-scope for bpf. But I
> > > > > > > think I need to read through the fuse4fs stuff to understand more what
> > > > > > > it's doing in those functions.
> > > > >
> > > > > Looking at fuse4fs logic cursorily, it seems doable? What I like about
> > > > > offloading this to bpf too is it would also then allow John's famfs to
> > > > > just go through your iomap plumbing as a use case of it instead of
> > > > > being an entirely separate thing. Though maybe there's some other
> > > > > reason for that that you guys have discussed prior. In any case, I'll
> > > > > ask this on John's main famfs patchset. It kind of seems to me that
> > > > > you guys are pretty much doing the exact same thing conceptually.
> > > >
> > > > Yes, though John's famfs has the nice property that memory controller
> > > > interleaving is mathematically regular and likely makes for a compact
> > > > bpf program.
> > >
> > > I tried out integrating the bpf hooks into fuse for iomap_begin() just
> > > to see if it was realistic and it seems relatively straightforward so
> > > far (though maybe the devil is in the details...). I used the
> >
> > Ok, now *that's* interesting! I guess I had better push the latest
> > fuse-iomap code ... but I cannot share a link, because I cannot get
> > through the @!#%%!!! kernel.org anubis bullcrap.
> >
> > So I generated a pull request and I *think* this munged URL will work
> > https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git/log/?h=fuse-service-container_2026-01-29
> >
> > Or I guess you could just git-pull this:
> > https://git.kernel.org/pub/scm/linux/kernel/git/djwong/xfs-linux.git tags/fuse-service-container_2026-01-29
> >
> > > drivers/hid/bpf/hid_bpf_struct_ops.c program as a model for how to set
> > > up the fuse bpf struct ops on the kernel side. calling it from
> > > file_iomap.c looks something like
> > >
> > > static int fuse_iomap_begin(...)
> > > {
> > > ...
> > > struct fuse_bpf_ops *bpf_ops = fuse_get_bpf_ops();
> > > ...
> > > err = -EOPNOTSUPP;
> > > if (bpf_ops && bpf_ops->iomap_begin)
> > > err = bpf_ops->iomap_begin(inode, pos, len, flags, &outarg);
> > > if (err)
> > > err = fuse_simple_request(fm, &args);
> > > ...
> > > }
> >
> > I'm curious what the rest of the bpf integration code looks like.
>
> This is the code I had yesterday (I didn't know how to run the fuse4fs
> stuff, so I used passthrough_hp as the server and had the trigger go
> through statfs):
Yeah, it's nasty ... you have to go build a patched libfuse3, then
grab the modified e2fsprogs, modify your ./configure commandline to
point itself at the built libfuse3, and then it'll build fuse4fs.
>
> diff --git a/fs/fuse/Makefile b/fs/fuse/Makefile
> index 22ad9538dfc4..10c3939f4cf3 100644
> --- a/fs/fuse/Makefile
> +++ b/fs/fuse/Makefile
> @@ -13,6 +13,7 @@ obj-$(CONFIG_VIRTIO_FS) += virtiofs.o
> fuse-y := trace.o # put trace.o first so we see ftrace errors sooner
> fuse-y += dev.o dir.o file.o inode.o control.o xattr.o acl.o readdir.o ioctl.o
> fuse-y += iomode.o
> +fuse-y += fuse_bpf.o
> fuse-$(CONFIG_FUSE_DAX) += dax.o
> fuse-$(CONFIG_FUSE_PASSTHROUGH) += passthrough.o backing.o
> fuse-$(CONFIG_SYSCTL) += sysctl.o
> diff --git a/fs/fuse/fuse_bpf.c b/fs/fuse/fuse_bpf.c
> new file mode 100644
> index 000000000000..637cf152e997
> --- /dev/null
> +++ b/fs/fuse/fuse_bpf.c
> @@ -0,0 +1,123 @@
> +// SPDX-License-Identifier: GPL-2.0
> +
> +#include <linux/bpf.h>
> +
> +#include "fuse_i.h"
> +#include "fuse_dev_i.h"
> +#include "fuse_bpf.h"
> +
> +static struct btf *fuse_bpf_ops_btf;
> +static struct fuse_bpf_ops *active_bpf_ops;
> +
> +static int fuse_bpf_ops_init(struct btf *btf)
> +{
> + fuse_bpf_ops_btf = btf;
> + return 0;
> +}
> +
> +static bool fuse_bpf_ops_is_valid_access(int off, int size,
> + enum bpf_access_type type,
> + const struct bpf_prog *prog,
> + struct bpf_insn_access_aux *info)
> +{
> + return bpf_tracing_btf_ctx_access(off, size, type, prog, info);
> +}
> +
> +static int fuse_bpf_ops_check_member(const struct btf_type *t,
> + const struct btf_member *member,
> + const struct bpf_prog *prog)
> +{
> + return 0;
> +}
> +
> +static int fuse_bpf_ops_btf_struct_access(struct bpf_verifier_log *log,
> + const struct bpf_reg_state *reg,
> + int off, int size)
> +{
> + return 0;
> +}
> +
> +static const struct bpf_verifier_ops fuse_bpf_verifier_ops = {
> + .get_func_proto = bpf_base_func_proto,
> + .is_valid_access = fuse_bpf_ops_is_valid_access,
> + .btf_struct_access = fuse_bpf_ops_btf_struct_access,
> +};
> +
> +static int fuse_bpf_ops_init_member(const struct btf_type *t,
> + const struct btf_member *member,
> + void *kdata, const void *udata)
> +{
> + const struct fuse_bpf_ops *u_ops = udata;
> + struct fuse_bpf_ops *ops = kdata;
> + u32 moff;
> +
> + moff = __btf_member_bit_offset(t, member) / 8;
> + switch (moff) {
> + case offsetof(struct fuse_bpf_ops, name):
> + if (bpf_obj_name_cpy(ops->name, u_ops->name,
> + sizeof(ops->name)) <= 0)
> + return -EINVAL;
> + return 1; /* Handled */
> + }
> +
> + /* Not handled, use default */
> + return 0;
> +}
> +
> +static int fuse_bpf_reg(void *kdata, struct bpf_link *link)
> +{
> + struct fuse_bpf_ops *ops = kdata;
> +
> + active_bpf_ops = ops;
> +
> + printk("fuse_bpf: registered ops '%s'\n", ops->name);
> +
> + return 0;
> +}
> +
> +static void fuse_bpf_unreg(void *kdata, struct bpf_link *link)
> +{
> + struct fuse_bpf_ops *ops = kdata;
> +
> + if (active_bpf_ops == ops)
> + active_bpf_ops = NULL;
> +
> + printk("fuse_bpf: unregistered ops '%s'\n", ops->name);
> +}
> +
> +static int __iomap_begin(struct inode *inode, loff_t pos,
> + loff_t length, unsigned int flags,
> + struct fuse_iomap_io *out_io)
> +{
> + printk("stub __iomap_begin(). should never get called\n");
> + return 0;
> +}
> +
> +static struct fuse_bpf_ops __fuse_bpf_ops = {
> + .iomap_begin = __iomap_begin,
> +};
> +
> +static struct bpf_struct_ops fuse_bpf_struct_ops = {
> + .verifier_ops = &fuse_bpf_verifier_ops,
> + .init = fuse_bpf_ops_init,
> + .check_member = fuse_bpf_ops_check_member,
> + .init_member = fuse_bpf_ops_init_member,
> + .reg = fuse_bpf_reg,
> + .unreg = fuse_bpf_unreg,
> + .name = "fuse_bpf_ops",
> + .cfi_stubs = &__fuse_bpf_ops,
> + .owner = THIS_MODULE,
> +};
> +
> +struct fuse_bpf_ops *fuse_get_bpf_ops(void)
> +{
> + return active_bpf_ops;
> +}
> +
> +int fuse_bpf_init(void)
> +{
> + return register_bpf_struct_ops(&fuse_bpf_struct_ops, fuse_bpf_ops);
> +}
> +
> +BTF_ID_LIST_GLOBAL_SINGLE(btf_fuse_bpf_ops_id, struct, fuse_bpf_ops)
> +BTF_ID_LIST_GLOBAL_SINGLE(btf_fuse_iomap_io_id, struct, fuse_iomap_io)
> diff --git a/fs/fuse/fuse_bpf.h b/fs/fuse/fuse_bpf.h
> new file mode 100644
> index 000000000000..d9482b64642b
> --- /dev/null
> +++ b/fs/fuse/fuse_bpf.h
> @@ -0,0 +1,29 @@
> +#ifndef _FS_FUSE_BPF_H
> +#define _FS_FUSE_BPF_H
> +
> +#include "fuse_i.h"
> +#include <linux/iomap.h>
> +
> +/* copied from darrick's iomap patchset */
> +struct fuse_iomap_io {
> + uint64_t offset; /* file offset of mapping, bytes */
> + uint64_t length; /* length of mapping, bytes */
> + uint64_t addr; /* disk offset of mapping, bytes */
> + uint16_t type; /* FUSE_IOMAP_TYPE_* */
> + uint16_t flags; /* FUSE_IOMAP_F_* */
> + uint32_t dev; /* device cookie */
> +};
> +
> +struct fuse_bpf_ops {
> + int (*iomap_begin)(struct inode *inode, loff_t pos,
> + loff_t length, unsigned int flags,
> + struct fuse_iomap_io *out_io__nullable);
> +
> + /* Required for bpf struct_ops */
> + char name[16];
> +};
> +
> +struct fuse_bpf_ops *fuse_get_bpf_ops(void);
> +int fuse_bpf_init(void);
> +
> +#endif /* _FS_FUSE_BPF_H */
> diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> index 819e50d66622..78ae4425e863 100644
> --- a/fs/fuse/inode.c
> +++ b/fs/fuse/inode.c
> @@ -7,6 +7,7 @@
> */
>
> #include "fuse_i.h"
> +#include "fuse_bpf.h"
> #include "fuse_dev_i.h"
> #include "dev_uring_i.h"
>
> @@ -662,6 +663,21 @@ static int fuse_statfs(struct dentry *dentry,
> struct kstatfs *buf)
> struct fuse_statfs_out outarg;
> int err;
>
> + printk("fuse_statfs() called!\n");
> +
> + struct fuse_bpf_ops *bpf_ops = fuse_get_bpf_ops();
> + struct fuse_iomap_io out_io = {};
> +
> + /* call BPF prog if attached */
> + if (bpf_ops && bpf_ops->iomap_begin) {
> + err = bpf_ops->iomap_begin(d_inode(dentry), 111, 222,
> + 333, &out_io);
> + printk("bpf prog returned: err=%d, out_io->offset=%llu\n",
> + err, out_io.offset);
> + } else {
> + printk("did not find a bpf prog\n");
> + }
> +
> if (!fuse_allow_current_process(fm->fc)) {
> buf->f_type = FUSE_SUPER_MAGIC;
> return 0;
> @@ -2194,6 +2210,12 @@ static int __init fuse_fs_init(void)
> if (!fuse_inode_cachep)
> goto out;
>
> + err = fuse_bpf_init();
> + if (err) {
> + printk("fuse_bpf_init() failed %d\n", err);
> + goto out2;
> + }
> +
> err = register_fuseblk();
> if (err)
> goto out2;
>
>
> These are the changes for the libfuse side:
> https://github.com/joannekoong/libfuse/commit/1a6198f17dd215c93fd82ec020641c079aae1241
/me sees "SEC("struct_ops/iomap_begin")"
ohhhh my.
Well at least now I know that C programs can do bpf stuff via libfuse.
> To run it, run "make clean; make" from libfuse/example, and then sudo
> ninja from libfuse/build, and then
> sudo ~/libfuse/build/example/passthrough_hp ~/liburing ~/mounts/tmp2
> --nopassthrough --foreground
>
> Then from ~/mounts/tmp2, run "stat -f filename" and that will show a few things:
> on the kernel side it'll print a statement like "bpf prog returned:
> err=0, out_io->offset=999" which shows that the prog can return back a
> "struct fuse_iomap_io" with all the requisite metadata filled out
> on the server-side, if you run " sudo cat
> /sys/kernel/debug/tracing/trace_pipe", that should print out "
> bpf_trace_printk: fuse iomap_begin: inode=ffff8a75cbe63800 pos=111
> len=222 flags=333" which shows the prog can take in whatever
> pos/len/flags values you pass it from the fuse kernel
Hehhehe. Will give that a shot.
--D
>
> >
> > > and I was able to verify that iomap_begin() is able to return back
> > > populated outarg fields from the bpf prog. If we were to actually
> > > implement it i'm sure it'd be more complicated (eg we'd need to make
> > > the fuse_bpf_ops registered per-connection, etc) but on the whole it
> >
> > What is a fuse_bpf_ops? I'm assuming that's the attachment point for a
> > bpf program that the fuse server would compile? In which case, yes, I
> > think that ought to be per-connection.
> >
> > So the bpf program can examine the struct inode, and the pos/len/opflags
> > field; and from that information it has to write the appropriate fields
> > in &outarg? That's new, I didn't think bpf was allowed to write to
> > kernel memory. But it's been a few years since I last touched the bpf
> > internals.
>
> It's been a few years since I looked at bpf as well but yes
> fuse_bpf_ops is basically the kernel-side struct_ops interface for
> getting fuse to trigger the attached bpf program's callback
> implementations. When the bpf program is loaded in, its callback
> functions get swapped in and fuse_bpf_ops's function pointers now
> point to the bpf's callback functions, so when you invoke
> fuse_bpf_ops's callbacks, it calls into the bpf prog's callback.
>
> >
> > Some bpf programs might just know how to fill out outarg on their own
> > (e.g. famfs memory interleaving) but other bpf programs might perform a
> > range query on some imaginary bpf-interval-tree wherein you can do a
> > fast lookup based on (inumber, pos, len)?
> >
> > I guess that's an interesting question -- would each fuse connection
> > have one big bpf-interval-tree? Or would you shard things by inode to
> > reduce contention? And if you sharded like that, then would you need a
> > fuse_bpf_ops per inode?
>
> Hmm the cache's tree is per-inode as I understand it, so probably each
> inode would have its own tree / map?
>
> >
> > (I'm imagining that the fuse_bpf_ops might be where you'd stash the root
> > of the bpf data structure, but I know nothing of bpf internals ;))
> >
> > Rolling on: how easy is it for a userspace program to compile and upload
> > bpf programs into the kernel? I've played around with bcc enough to
> > write some fairly stupid latency tracing tools for XFS, but at the end
> > of the day it still python scripts feeding a string full of maybe-C into
> > whatever the BPF does under the hood.
>
> I found it pretty easy with the libbpf library which will generate the
> skeletons and provide the api helpers to load it in and other stuff
> (the libfuse link I pasted above for the userspace side has the code
> for compiling it and loading it).
>
> >
> > I /think/ it calls clang on the provided text, links that against the
> > current kernel's header files, and pushes the compiled bpf binary into
> > the kernel, right? So fuse4fs would have to learn how to do that; and
> > now fuse4fs has a runtime dependency on libllvm.
>
> I think the libbpf library takes care of a lot of that for you. I
> think fuse4fs would just need to do the same thing as in that libfuse
> link above
>
> >
> > And while I'm on the topic of fuse-bpf uapi: It's ok for us to expose
> > primitive-typed variables (pos/len/opflags) and existing fuse uapi
> > directly to a bpf program, but I don't think we should expose struct
> > inode/fuse_inode. Maybe just fuse_inode::nodeid? If we're careful not
> > to allow #include'ing structured types in the fuse bpf code, then
> > perhaps the bpf programs could be compiled at the same time as the fuse
> > server.
>
> I agree, I think if we do decide to go further with this approach,
> we'll need to define exactly what the interfaces should be that would
> be safe to expose.
>
> >
> > > seems doable. My worry is that if we land the iomap cache patchset now
> > > then we can't remove it in the future without breaking backwards
> > > compatibility for being a performance regression (though maybe we can
> > > since the fuse-iomap stuff is experimental?), so imo it'd be great if
> >
> > I don't think it's a huge problem to remove functionality while the
> > EXPERIMENTAL warnings are in place. We'd forever lose the command codes
> > for FUSE_NOTIFY_IOMAP_UPSERT and FUSE_NOTIFY_IOMAP_INVAL, but we've only
> > used 12 out of INT_MAX so that's not likely to be a concern.
> >
> > > we figured out what direction we want to go before landing the cache
> > > stuff. And I think we need to have this conversation too on the main
> > > famfs patchset (eg whether it should go through your general iomap
> > > plumbing with bpf helpers vs. being a separate implementation) since
> > > once that lands, it'd be irrevocable.
> >
> > I've of two minds on that -- John got here first, so I don't want to
> > delay his patchset whilst I slowly work on this thing. OTOH from an
> > architecture standpoint we probably ought to push for three ways for a
> > fuse server to upload mappings:
>
> I think if John/Miklos wanted to go in this direction, all that would
> be needed from your series is the first one or two patches that define
> the basic fuse_iomap_io / fuse_iomap_begin / fuse_iomap_end structs
> and init config plumbing.
>
> Thanks,
> Joanne
>
> >
> > 1. Upserting mappings with arbitrary offset and size into a cache
> > 2. Self contained bpf program that can generate any mapping
> > 3. Sprawling bpf program that can read any other artifacts that another
> > bpf program might have set up for it
> >
> > But yeah, let's involve John.
> >
> > --D
> >
> > >
> > > Thanks,
> > > Joanne
> > > >
> > > > --D
> > > >
> > > > > Thanks,
> > > > > Joanne
> > > > >
> > > > > >
> > > > > > <nod>
> > > > > >
> > > > > > --D
> > > > > >
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Joanne
> > > > > > >
> > > > > > > >
> > > > > > > > OTOH it would be enormously hilarious to me if one could load a file
> > > > > > > > mapping predictive model into the kernel as a bpf program and use that
> > > > > > > > as a first tier before checking the in-memory btree mapping cache from
> > > > > > > > patchset 7. Quite a few years ago now there was a FAST paper
> > > > > > > > establishing that even a stupid linear regression model could in theory
> > > > > > > > beat a disk btree lookup.
> > > > > > > >
> > > > > > > > --D
> > > > > > > >
> > > > > > > > > Thanks,
> > > > > > > > > Joanne
> > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > If you're going to start using this code, I strongly recommend pulling
> > > > > > > > > > from my git trees, which are linked below.
> > > > > > > > > >
> > > > > > > > > > This has been running on the djcloud for months with no problems. Enjoy!
> > > > > > > > > > Comments and questions are, as always, welcome.
> > > > > > > > > >
> > > > > > > > > > --D
> > > > > > > > > >
> > > > > > > > > > kernel git tree:
> > > > > > > > > > https://git.kernel.org/cgit/linux/kernel/git/djwong/xfs-linux.git/log/?h=fuse-iomap-fileio
> > > > > > > > > > ---
> > > > > > > > > > Commits in this patchset:
> > > > > > > > > > * fuse: implement the basic iomap mechanisms
> > > > > > > > > > * fuse_trace: implement the basic iomap mechanisms
> > > > > > > > > > * fuse: make debugging configurable at runtime
> > > > > > > > > > * fuse: adapt FUSE_DEV_IOC_BACKING_{OPEN,CLOSE} to add new iomap devices
> > > > > > > > > > * fuse_trace: adapt FUSE_DEV_IOC_BACKING_{OPEN,CLOSE} to add new iomap devices
> > > > > > > > > > * fuse: flush events and send FUSE_SYNCFS and FUSE_DESTROY on unmount
> > > > > > > > > > * fuse: create a per-inode flag for toggling iomap
> > > > > > > > > > * fuse_trace: create a per-inode flag for toggling iomap
> > > > > > > > > > * fuse: isolate the other regular file IO paths from iomap
> > > > > > > > > > * fuse: implement basic iomap reporting such as FIEMAP and SEEK_{DATA,HOLE}
> > > > > > > > > > * fuse_trace: implement basic iomap reporting such as FIEMAP and SEEK_{DATA,HOLE}
> > > > > > > > > > * fuse: implement direct IO with iomap
> > > > > > > > > > * fuse_trace: implement direct IO with iomap
> > > > > > > > > > * fuse: implement buffered IO with iomap
> > > > > > > > > > * fuse_trace: implement buffered IO with iomap
> > > > > > > > > > * fuse: implement large folios for iomap pagecache files
> > > > > > > > > > * fuse: use an unrestricted backing device with iomap pagecache io
> > > > > > > > > > * fuse: advertise support for iomap
> > > > > > > > > > * fuse: query filesystem geometry when using iomap
> > > > > > > > > > * fuse_trace: query filesystem geometry when using iomap
> > > > > > > > > > * fuse: implement fadvise for iomap files
> > > > > > > > > > * fuse: invalidate ranges of block devices being used for iomap
> > > > > > > > > > * fuse_trace: invalidate ranges of block devices being used for iomap
> > > > > > > > > > * fuse: implement inline data file IO via iomap
> > > > > > > > > > * fuse_trace: implement inline data file IO via iomap
> > > > > > > > > > * fuse: allow more statx fields
> > > > > > > > > > * fuse: support atomic writes with iomap
> > > > > > > > > > * fuse_trace: support atomic writes with iomap
> > > > > > > > > > * fuse: disable direct reclaim for any fuse server that uses iomap
> > > > > > > > > > * fuse: enable swapfile activation on iomap
> > > > > > > > > > * fuse: implement freeze and shutdowns for iomap filesystems
> > > > > > > > > > ---
> > > > > > > > > > fs/fuse/fuse_i.h | 161 +++
> > > > > > > > > > fs/fuse/fuse_trace.h | 939 +++++++++++++++++++
> > > > > > > > > > fs/fuse/iomap_i.h | 52 +
> > > > > > > > > > include/uapi/linux/fuse.h | 219 ++++
> > > > > > > > > > fs/fuse/Kconfig | 48 +
> > > > > > > > > > fs/fuse/Makefile | 1
> > > > > > > > > > fs/fuse/backing.c | 12
> > > > > > > > > > fs/fuse/dev.c | 30 +
> > > > > > > > > > fs/fuse/dir.c | 120 ++
> > > > > > > > > > fs/fuse/file.c | 133 ++-
> > > > > > > > > > fs/fuse/file_iomap.c | 2230 +++++++++++++++++++++++++++++++++++++++++++++
> > > > > > > > > > fs/fuse/inode.c | 162 +++
> > > > > > > > > > fs/fuse/iomode.c | 2
> > > > > > > > > > fs/fuse/trace.c | 2
> > > > > > > > > > 14 files changed, 4056 insertions(+), 55 deletions(-)
> > > > > > > > > > create mode 100644 fs/fuse/iomap_i.h
> > > > > > > > > > create mode 100644 fs/fuse/file_iomap.c
> > > > > > > > > >
> > > > > > > > >
> > > > >
> > >
>
next prev parent reply other threads:[~2026-01-29 23:12 UTC|newest]
Thread overview: 333+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-29 0:27 [PATCHBOMB v6] fuse: containerize ext4 for safer operation Darrick J. Wong
2025-10-29 0:37 ` [PATCHSET v6 1/8] fuse: general bug fixes Darrick J. Wong
2025-10-29 0:43 ` [PATCH 1/5] fuse: flush pending fuse events before aborting the connection Darrick J. Wong
2025-11-03 17:20 ` Joanne Koong
2025-11-03 22:13 ` Darrick J. Wong
2025-11-04 19:22 ` Joanne Koong
2025-11-04 21:47 ` Bernd Schubert
2025-11-06 0:19 ` Darrick J. Wong
2025-11-06 0:17 ` Darrick J. Wong
2025-11-06 18:37 ` Joanne Koong
2025-11-07 4:26 ` Darrick J. Wong
2025-11-07 19:18 ` Joanne Koong
2025-11-08 0:43 ` Darrick J. Wong
2025-11-07 22:03 ` Bernd Schubert
2025-11-08 0:02 ` Darrick J. Wong
2025-11-10 17:56 ` Darrick J. Wong
2025-11-10 18:22 ` Bernd Schubert
2025-11-10 18:54 ` Darrick J. Wong
2025-11-10 22:09 ` Bernd Schubert
2025-11-11 0:33 ` Darrick J. Wong
2025-10-29 0:43 ` [PATCH 2/5] fuse: signal that a fuse inode should exhibit local fs behaviors Darrick J. Wong
2025-11-04 19:59 ` Joanne Koong
2025-10-29 0:43 ` [PATCH 3/5] fuse: implement file attributes mask for statx Darrick J. Wong
2025-11-03 18:30 ` Joanne Koong
2025-11-03 18:43 ` Joanne Koong
2025-11-03 19:28 ` Darrick J. Wong
2025-10-29 0:43 ` [PATCH 4/5] fuse: update file mode when updating acls Darrick J. Wong
2025-11-07 20:29 ` Joanne Koong
2025-11-08 0:17 ` Darrick J. Wong
2025-10-29 0:44 ` [PATCH 5/5] fuse: propagate default and file acls on creation Darrick J. Wong
2026-02-05 19:32 ` Chris Mason
2026-02-05 23:28 ` Darrick J. Wong
2025-10-29 0:38 ` [PATCHSET v6 2/8] iomap: cleanups ahead of adding fuse support Darrick J. Wong
2025-10-29 0:44 ` [PATCH 1/1] iomap: allow NULL swap info bdev when activating swapfile Darrick J. Wong
2025-10-29 8:40 ` Christoph Hellwig
2025-10-29 14:38 ` Darrick J. Wong
2025-10-30 6:00 ` Christoph Hellwig
2025-10-30 14:54 ` Darrick J. Wong
2025-10-30 15:03 ` Christoph Hellwig
2025-11-07 9:23 ` Jan Engelhardt
2025-11-07 18:05 ` Darrick J. Wong
2025-10-29 0:38 ` [PATCHSET v6 3/8] fuse: cleanups ahead of adding fuse support Darrick J. Wong
2025-10-29 0:44 ` [PATCH 1/2] fuse: move the passthrough-specific code back to passthrough.c Darrick J. Wong
2025-11-06 18:36 ` Amir Goldstein
2025-10-29 0:44 ` [PATCH 2/2] fuse_trace: " Darrick J. Wong
2025-11-07 20:55 ` Joanne Koong
2025-11-08 0:24 ` Darrick J. Wong
2025-11-10 17:50 ` Joanne Koong
2025-10-29 0:38 ` [PATCHSET v6 4/8] fuse: allow servers to use iomap for better file IO performance Darrick J. Wong
2025-10-29 0:45 ` [PATCH 01/31] fuse: implement the basic iomap mechanisms Darrick J. Wong
2026-01-21 19:34 ` Joanne Koong
2026-01-21 22:45 ` Darrick J. Wong
2026-01-22 0:06 ` Joanne Koong
2026-01-22 0:34 ` Darrick J. Wong
2026-02-05 19:22 ` Chris Mason
2026-02-05 23:31 ` Darrick J. Wong
2025-10-29 0:45 ` [PATCH 02/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:45 ` [PATCH 03/31] fuse: make debugging configurable at runtime Darrick J. Wong
2026-01-21 23:42 ` Joanne Koong
2026-01-22 0:02 ` Darrick J. Wong
2026-01-22 0:23 ` Joanne Koong
2026-01-22 0:40 ` Darrick J. Wong
2025-10-29 0:46 ` [PATCH 04/31] fuse: adapt FUSE_DEV_IOC_BACKING_{OPEN,CLOSE} to add new iomap devices Darrick J. Wong
2025-11-06 18:50 ` Amir Goldstein
2025-10-29 0:46 ` [PATCH 05/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:46 ` [PATCH 06/31] fuse: flush events and send FUSE_SYNCFS and FUSE_DESTROY on unmount Darrick J. Wong
2025-10-29 0:46 ` [PATCH 07/31] fuse: create a per-inode flag for toggling iomap Darrick J. Wong
2026-01-22 1:13 ` Joanne Koong
2026-01-22 22:22 ` Darrick J. Wong
2026-01-23 18:05 ` Joanne Koong
2026-01-24 16:54 ` Darrick J. Wong
2026-01-27 23:33 ` Darrick J. Wong
2025-10-29 0:47 ` [PATCH 08/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:47 ` [PATCH 09/31] fuse: isolate the other regular file IO paths from iomap Darrick J. Wong
2025-11-06 18:44 ` Amir Goldstein
2025-11-06 23:02 ` Darrick J. Wong
2025-11-06 23:35 ` Darrick J. Wong
2025-10-29 0:47 ` [PATCH 10/31] fuse: implement basic iomap reporting such as FIEMAP and SEEK_{DATA,HOLE} Darrick J. Wong
2026-01-22 2:07 ` Joanne Koong
2026-01-22 22:31 ` Darrick J. Wong
2025-10-29 0:47 ` [PATCH 11/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:48 ` [PATCH 12/31] fuse: implement direct IO with iomap Darrick J. Wong
2026-01-23 18:56 ` Joanne Koong
2026-01-26 23:46 ` Darrick J. Wong
2026-02-05 19:19 ` Chris Mason
2026-02-06 2:08 ` Darrick J. Wong
2026-02-06 2:52 ` Chris Mason
2026-02-06 5:08 ` Darrick J. Wong
2026-02-06 14:27 ` Chris Mason
2025-10-29 0:48 ` [PATCH 13/31] fuse_trace: " Darrick J. Wong
2026-02-05 19:16 ` Chris Mason
2026-02-06 2:12 ` Darrick J. Wong
2025-10-29 0:48 ` [PATCH 14/31] fuse: implement buffered " Darrick J. Wong
2026-02-05 19:12 ` Chris Mason
2026-02-06 2:14 ` Darrick J. Wong
2025-10-29 0:48 ` [PATCH 15/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:49 ` [PATCH 16/31] fuse: implement large folios for iomap pagecache files Darrick J. Wong
2026-01-23 21:50 ` Joanne Koong
2025-10-29 0:49 ` [PATCH 17/31] fuse: use an unrestricted backing device with iomap pagecache io Darrick J. Wong
2026-01-26 22:03 ` Joanne Koong
2026-01-26 23:55 ` Darrick J. Wong
2026-01-27 1:35 ` Joanne Koong
2026-01-27 2:09 ` Darrick J. Wong
2026-01-27 18:04 ` Joanne Koong
2026-01-27 23:37 ` Darrick J. Wong
2025-10-29 0:49 ` [PATCH 18/31] fuse: advertise support for iomap Darrick J. Wong
2025-10-29 0:49 ` [PATCH 19/31] fuse: query filesystem geometry when using iomap Darrick J. Wong
2026-02-05 19:07 ` Chris Mason
2026-02-06 2:17 ` Darrick J. Wong
2025-10-29 0:50 ` [PATCH 20/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:50 ` [PATCH 21/31] fuse: implement fadvise for iomap files Darrick J. Wong
2025-10-29 0:50 ` [PATCH 22/31] fuse: invalidate ranges of block devices being used for iomap Darrick J. Wong
2025-10-29 0:50 ` [PATCH 23/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:51 ` [PATCH 24/31] fuse: implement inline data file IO via iomap Darrick J. Wong
2026-02-05 19:01 ` Chris Mason
2026-02-06 2:27 ` Darrick J. Wong
2025-10-29 0:51 ` [PATCH 25/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:51 ` [PATCH 26/31] fuse: allow more statx fields Darrick J. Wong
2025-10-29 0:51 ` [PATCH 27/31] fuse: support atomic writes with iomap Darrick J. Wong
2025-10-29 0:52 ` [PATCH 28/31] fuse_trace: " Darrick J. Wong
2025-10-29 0:52 ` [PATCH 29/31] fuse: disable direct reclaim for any fuse server that uses iomap Darrick J. Wong
2026-02-05 18:57 ` Chris Mason
2026-02-06 4:25 ` Darrick J. Wong
2025-10-29 0:52 ` [PATCH 30/31] fuse: enable swapfile activation on iomap Darrick J. Wong
2025-10-29 0:53 ` [PATCH 31/31] fuse: implement freeze and shutdowns for iomap filesystems Darrick J. Wong
2025-11-19 9:19 ` [PATCHSET v6 4/8] fuse: allow servers to use iomap for better file IO performance Demi Marie Obenour
2025-11-19 9:41 ` Gao Xiang
2025-11-19 18:04 ` Darrick J. Wong
2025-11-19 21:00 ` Gao Xiang
2025-11-19 21:51 ` Gao Xiang
2025-11-20 1:13 ` Demi Marie Obenour
2025-11-20 1:10 ` Demi Marie Obenour
2025-11-20 1:49 ` Gao Xiang
2025-11-20 1:05 ` Demi Marie Obenour
2026-01-27 0:59 ` Joanne Koong
2026-01-27 2:22 ` Darrick J. Wong
2026-01-27 19:47 ` Joanne Koong
2026-01-27 23:21 ` Darrick J. Wong
2026-01-28 0:10 ` Joanne Koong
2026-01-28 0:34 ` Darrick J. Wong
2026-01-29 1:12 ` Joanne Koong
2026-01-29 20:02 ` Darrick J. Wong
2026-01-29 22:41 ` Darrick J. Wong
2026-01-29 22:50 ` Joanne Koong
2026-01-29 23:12 ` Darrick J. Wong [this message]
2025-10-29 0:38 ` [PATCHSET v6 5/8] fuse: allow servers to specify root node id Darrick J. Wong
2025-10-29 0:53 ` [PATCH 1/3] fuse: make the root nodeid dynamic Darrick J. Wong
2025-10-29 0:53 ` [PATCH 2/3] fuse_trace: " Darrick J. Wong
2025-10-29 0:53 ` [PATCH 3/3] fuse: allow setting of root nodeid Darrick J. Wong
2025-10-29 0:39 ` [PATCHSET v6 6/8] fuse: handle timestamps and ACLs correctly when iomap is enabled Darrick J. Wong
2025-10-29 0:54 ` [PATCH 1/9] fuse: enable caching of timestamps Darrick J. Wong
2025-10-29 0:54 ` [PATCH 2/9] fuse: force a ctime update after a fileattr_set call when in iomap mode Darrick J. Wong
2025-10-29 0:54 ` [PATCH 3/9] fuse: allow local filesystems to set some VFS iflags Darrick J. Wong
2025-10-29 0:54 ` [PATCH 4/9] fuse_trace: " Darrick J. Wong
2025-10-29 0:55 ` [PATCH 5/9] fuse: cache atime when in iomap mode Darrick J. Wong
2025-10-29 0:55 ` [PATCH 6/9] fuse: let the kernel handle KILL_SUID/KILL_SGID for iomap filesystems Darrick J. Wong
2025-10-29 0:55 ` [PATCH 7/9] fuse_trace: " Darrick J. Wong
2025-10-29 0:55 ` [PATCH 8/9] fuse: update ctime when updating acls on an iomap inode Darrick J. Wong
2025-10-29 0:56 ` [PATCH 9/9] fuse: always cache ACLs when using iomap Darrick J. Wong
2025-10-29 0:39 ` [PATCHSET v6 7/8] fuse: cache iomap mappings for even better file IO performance Darrick J. Wong
2025-10-29 0:56 ` [PATCH 01/10] fuse: cache iomaps Darrick J. Wong
2025-10-29 0:56 ` [PATCH 02/10] fuse_trace: " Darrick J. Wong
2025-10-29 0:56 ` [PATCH 03/10] fuse: use the iomap cache for iomap_begin Darrick J. Wong
2026-02-05 18:52 ` Chris Mason
2026-02-06 4:28 ` Darrick J. Wong
2025-10-29 0:57 ` [PATCH 04/10] fuse_trace: " Darrick J. Wong
2025-10-29 0:57 ` [PATCH 05/10] fuse: invalidate iomap cache after file updates Darrick J. Wong
2026-02-05 18:44 ` Chris Mason
2026-02-06 4:38 ` Darrick J. Wong
2025-10-29 0:57 ` [PATCH 06/10] fuse_trace: " Darrick J. Wong
2025-10-29 0:58 ` [PATCH 07/10] fuse: enable iomap cache management Darrick J. Wong
2026-02-05 18:33 ` Chris Mason
2026-02-06 4:42 ` Darrick J. Wong
2025-10-29 0:58 ` [PATCH 08/10] fuse_trace: " Darrick J. Wong
2025-10-29 0:58 ` [PATCH 09/10] fuse: overlay iomap inode info in struct fuse_inode Darrick J. Wong
2025-10-29 0:58 ` [PATCH 10/10] fuse: enable iomap Darrick J. Wong
2025-10-29 0:39 ` [PATCHSET v6 8/8] fuse: run fuse servers as a contained service Darrick J. Wong
2025-10-29 0:59 ` [PATCH 1/2] fuse: allow privileged mount helpers to pre-approve iomap usage Darrick J. Wong
2025-10-29 0:59 ` [PATCH 2/2] fuse: set iomap backing device block size Darrick J. Wong
2025-10-29 0:40 ` [PATCHSET v6 1/5] libfuse: allow servers to use iomap for better file IO performance Darrick J. Wong
2025-10-29 0:59 ` [PATCH 01/22] libfuse: bump kernel and library ABI versions Darrick J. Wong
2025-10-29 0:59 ` [PATCH 02/22] libfuse: add kernel gates for FUSE_IOMAP Darrick J. Wong
2025-10-29 1:00 ` [PATCH 03/22] libfuse: add fuse commands for iomap_begin and end Darrick J. Wong
2025-10-29 1:00 ` [PATCH 04/22] libfuse: add upper level iomap commands Darrick J. Wong
2025-10-29 1:00 ` [PATCH 05/22] libfuse: add a lowlevel notification to add a new device to iomap Darrick J. Wong
2025-10-29 1:00 ` [PATCH 06/22] libfuse: add upper-level iomap add device function Darrick J. Wong
2025-10-29 1:01 ` [PATCH 07/22] libfuse: add iomap ioend low level handler Darrick J. Wong
2025-10-29 1:01 ` [PATCH 08/22] libfuse: add upper level iomap ioend commands Darrick J. Wong
2025-10-29 1:01 ` [PATCH 09/22] libfuse: add a reply function to send FUSE_ATTR_* to the kernel Darrick J. Wong
2025-10-29 1:01 ` [PATCH 10/22] libfuse: connect high level fuse library to fuse_reply_attr_iflags Darrick J. Wong
2025-10-29 1:02 ` [PATCH 11/22] libfuse: support direct I/O through iomap Darrick J. Wong
2025-10-29 1:02 ` [PATCH 12/22] libfuse: don't allow hardlinking of iomap files in the upper level fuse library Darrick J. Wong
2025-10-29 1:02 ` [PATCH 13/22] libfuse: allow discovery of the kernel's iomap capabilities Darrick J. Wong
2025-10-29 1:02 ` [PATCH 14/22] libfuse: add lower level iomap_config implementation Darrick J. Wong
2025-10-29 1:03 ` [PATCH 15/22] libfuse: add upper " Darrick J. Wong
2025-10-29 1:03 ` [PATCH 16/22] libfuse: add low level code to invalidate iomap block device ranges Darrick J. Wong
2025-10-29 1:03 ` [PATCH 17/22] libfuse: add upper-level API to invalidate parts of an iomap block device Darrick J. Wong
2025-10-29 1:03 ` [PATCH 18/22] libfuse: add atomic write support Darrick J. Wong
2025-10-29 1:04 ` [PATCH 19/22] libfuse: create a helper to transform an open regular file into an open loopdev Darrick J. Wong
2025-10-29 1:04 ` [PATCH 20/22] libfuse: add swapfile support for iomap files Darrick J. Wong
2025-10-29 1:04 ` [PATCH 21/22] libfuse: add lower-level filesystem freeze, thaw, and shutdown requests Darrick J. Wong
2025-10-29 1:05 ` [PATCH 22/22] libfuse: add upper-level filesystem freeze, thaw, and shutdown events Darrick J. Wong
2025-10-29 0:40 ` [PATCHSET v6 2/5] libfuse: allow servers to specify root node id Darrick J. Wong
2025-10-29 1:05 ` [PATCH 1/1] libfuse: allow root_nodeid mount option Darrick J. Wong
2025-10-29 0:40 ` [PATCHSET v6 3/5] libfuse: implement syncfs Darrick J. Wong
2025-10-29 1:05 ` [PATCH 1/4] libfuse: add strictatime/lazytime mount options Darrick J. Wong
2025-10-29 1:05 ` [PATCH 2/4] libfuse: set sync, immutable, and append when loading files Darrick J. Wong
2025-10-29 1:06 ` [PATCH 3/4] libfuse: wire up FUSE_SYNCFS to the low level library Darrick J. Wong
2025-10-29 1:06 ` [PATCH 4/4] libfuse: add syncfs support to the upper library Darrick J. Wong
2025-10-29 0:40 ` [PATCHSET v6 4/5] libfuse: cache iomap mappings for even better file IO performance Darrick J. Wong
2025-10-29 1:06 ` [PATCH 1/3] libfuse: enable iomap cache management for lowlevel fuse Darrick J. Wong
2025-10-29 1:06 ` [PATCH 2/3] libfuse: add upper-level iomap cache management Darrick J. Wong
2025-10-29 1:07 ` [PATCH 3/3] libfuse: enable iomap Darrick J. Wong
2025-10-29 0:41 ` [PATCHSET v6 5/5] libfuse: run fuse servers as a contained service Darrick J. Wong
2025-10-29 1:07 ` [PATCH 1/5] libfuse: add systemd/inetd socket service mounting helper Darrick J. Wong
2025-10-29 1:07 ` [PATCH 2/5] libfuse: integrate fuse services into mount.fuse3 Darrick J. Wong
2025-10-29 1:07 ` [PATCH 3/5] libfuse: delegate iomap privilege from mount.service to fuse services Darrick J. Wong
2025-10-29 1:08 ` [PATCH 4/5] libfuse: enable setting iomap block device block size Darrick J. Wong
2025-10-29 1:08 ` [PATCH 5/5] fuservicemount: create loop devices for regular files Darrick J. Wong
2025-10-29 0:41 ` [PATCHSET v6 1/6] fuse2fs: use fuse iomap data paths for better file I/O performance Darrick J. Wong
2025-10-29 1:08 ` [PATCH 01/17] fuse2fs: implement bare minimum iomap for file mapping reporting Darrick J. Wong
2025-10-29 1:08 ` [PATCH 02/17] fuse2fs: add iomap= mount option Darrick J. Wong
2025-10-29 1:09 ` [PATCH 03/17] fuse2fs: implement iomap configuration Darrick J. Wong
2025-10-29 1:09 ` [PATCH 04/17] fuse2fs: register block devices for use with iomap Darrick J. Wong
2025-10-29 1:09 ` [PATCH 05/17] fuse2fs: implement directio file reads Darrick J. Wong
2025-10-29 1:09 ` [PATCH 06/17] fuse2fs: add extent dump function for debugging Darrick J. Wong
2025-10-29 1:10 ` [PATCH 07/17] fuse2fs: implement direct write support Darrick J. Wong
2025-10-29 1:10 ` [PATCH 08/17] fuse2fs: turn on iomap for pagecache IO Darrick J. Wong
2025-10-29 1:10 ` [PATCH 09/17] fuse2fs: don't zero bytes in punch hole Darrick J. Wong
2025-10-29 1:11 ` [PATCH 10/17] fuse2fs: don't do file data block IO when iomap is enabled Darrick J. Wong
2025-10-29 1:11 ` [PATCH 11/17] fuse2fs: try to create loop device when ext4 device is a regular file Darrick J. Wong
2025-10-29 1:11 ` [PATCH 12/17] fuse2fs: enable file IO to inline data files Darrick J. Wong
2025-10-29 1:11 ` [PATCH 13/17] fuse2fs: set iomap-related inode flags Darrick J. Wong
2025-10-29 1:12 ` [PATCH 14/17] fuse2fs: configure block device block size Darrick J. Wong
2025-10-29 1:12 ` [PATCH 15/17] fuse4fs: separate invalidation Darrick J. Wong
2025-10-29 1:12 ` [PATCH 16/17] fuse2fs: implement statx Darrick J. Wong
2025-10-29 1:12 ` [PATCH 17/17] fuse2fs: enable atomic writes Darrick J. Wong
2025-10-29 0:41 ` [PATCHSET v6 2/6] fuse4fs: specify the root node id Darrick J. Wong
2025-10-29 1:13 ` [PATCH 1/2] fuse2fs: implement freeze and shutdown requests Darrick J. Wong
2025-10-29 1:13 ` [PATCH 2/2] fuse4fs: don't use inode number translation when possible Darrick J. Wong
2025-10-29 0:41 ` [PATCHSET v6 3/6] fuse2fs: handle timestamps and ACLs correctly when iomap is enabled Darrick J. Wong
2025-10-29 1:13 ` [PATCH 01/11] fuse2fs: add strictatime/lazytime mount options Darrick J. Wong
2025-10-29 1:13 ` [PATCH 02/11] fuse2fs: skip permission checking on utimens when iomap is enabled Darrick J. Wong
2025-10-29 1:14 ` [PATCH 03/11] fuse2fs: let the kernel tell us about acl/mode updates Darrick J. Wong
2025-10-29 1:14 ` [PATCH 04/11] fuse2fs: better debugging for file mode updates Darrick J. Wong
2025-10-29 1:14 ` [PATCH 05/11] fuse2fs: debug timestamp updates Darrick J. Wong
2025-10-29 1:14 ` [PATCH 06/11] fuse2fs: use coarse timestamps for iomap mode Darrick J. Wong
2025-10-29 1:15 ` [PATCH 07/11] fuse2fs: add tracing for retrieving timestamps Darrick J. Wong
2025-10-29 1:15 ` [PATCH 08/11] fuse2fs: enable syncfs Darrick J. Wong
2025-10-29 1:15 ` [PATCH 09/11] fuse2fs: skip the gdt write in op_destroy if syncfs is working Darrick J. Wong
2025-10-29 1:15 ` [PATCH 10/11] fuse2fs: set sync, immutable, and append at file load time Darrick J. Wong
2025-10-29 1:16 ` [PATCH 11/11] fuse4fs: increase attribute timeout in iomap mode Darrick J. Wong
2025-10-29 0:42 ` [PATCHSET v6 4/6] fuse2fs: cache iomap mappings for even better file IO performance Darrick J. Wong
2025-10-29 1:16 ` [PATCH 1/3] fuse2fs: enable caching of iomaps Darrick J. Wong
2025-10-29 1:16 ` [PATCH 2/3] fuse2fs: be smarter about caching iomaps Darrick J. Wong
2025-10-29 1:17 ` [PATCH 3/3] fuse2fs: enable iomap Darrick J. Wong
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-10-29 1:17 ` [PATCH 2/6] iocache: add the actual buffer cache Darrick J. Wong
2025-10-29 1:17 ` [PATCH 3/6] iocache: bump buffer mru priority every 50 accesses Darrick J. Wong
2025-10-29 1:18 ` [PATCH 4/6] fuse2fs: enable caching IO manager Darrick J. Wong
2025-10-29 1:18 ` [PATCH 5/6] fuse2fs: increase inode cache size Darrick J. Wong
2025-10-29 1:18 ` [PATCH 6/6] libext2fs: improve caching for inodes Darrick J. Wong
2025-10-29 0:42 ` [PATCHSET v6 6/6] fuse4fs: run servers as a contained service Darrick J. Wong
2025-10-29 1:18 ` [PATCH 1/7] libext2fs: fix MMP code to work with unixfd IO manager Darrick J. Wong
2025-10-29 1:19 ` [PATCH 2/7] fuse4fs: enable safe service mode Darrick J. Wong
2025-10-29 1:19 ` [PATCH 3/7] fuse4fs: set proc title when in fuse " Darrick J. Wong
2025-10-29 1:19 ` [PATCH 4/7] fuse4fs: set iomap backing device blocksize Darrick J. Wong
2025-10-29 1:19 ` [PATCH 5/7] fuse4fs: ask for loop devices when opening via fuservicemount Darrick J. Wong
2025-10-29 1:20 ` [PATCH 6/7] fuse4fs: make MMP work correctly in safe service mode Darrick J. Wong
2025-10-29 1:20 ` [PATCH 7/7] debian: update packaging for fuse4fs service Darrick J. Wong
2025-10-29 0:42 ` [PATCHSET v6] fstests: support ext4 fuse testing Darrick J. Wong
2025-10-29 1:20 ` [PATCH 01/33] misc: adapt tests to handle the fuse ext[234] drivers Darrick J. Wong
2025-10-30 9:51 ` Amir Goldstein
2025-11-05 22:53 ` Darrick J. Wong
2025-11-06 8:58 ` Amir Goldstein
2025-11-06 23:12 ` Darrick J. Wong
2025-11-07 7:50 ` Amir Goldstein
2025-11-07 7:08 ` Zorro Lang
2025-10-29 1:20 ` [PATCH 02/33] generic/740: don't run this test for fuse ext* implementations Darrick J. Wong
2025-10-30 9:59 ` Amir Goldstein
2025-11-05 22:56 ` Darrick J. Wong
2025-11-06 9:02 ` Amir Goldstein
2025-10-29 1:21 ` [PATCH 03/33] ext/052: use popdir.pl for much faster directory creation Darrick J. Wong
2025-10-29 1:21 ` [PATCH 04/33] common/rc: skip test if swapon doesn't work Darrick J. Wong
2025-11-12 6:35 ` Baokun Li
2025-11-12 18:26 ` Darrick J. Wong
2025-11-12 20:05 ` Theodore Ts'o
2025-11-12 22:29 ` [PATCH v6.1 " Darrick J. Wong
2025-11-13 1:51 ` Baokun Li
2025-11-13 15:52 ` Theodore Ts'o
2025-10-29 1:21 ` [PATCH 05/33] common/rc: streamline _scratch_remount Darrick J. Wong
2025-10-29 1:21 ` [PATCH 06/33] ext/039: require metadata journalling Darrick J. Wong
2025-10-29 1:22 ` [PATCH 07/33] populate: don't check for htree directories on fuse.ext4 Darrick J. Wong
2025-10-29 1:22 ` [PATCH 08/33] misc: convert _scratch_mount -o remount to _scratch_remount Darrick J. Wong
2025-10-29 1:22 ` [PATCH 09/33] misc: use explicitly $FSTYP'd mount calls Darrick J. Wong
2025-10-29 1:23 ` [PATCH 10/33] common/ext4: explicitly format with $FSTYP Darrick J. Wong
2025-10-29 1:23 ` [PATCH 11/33] tests/ext*: refactor open-coded _scratch_mkfs_sized calls Darrick J. Wong
2025-10-29 1:23 ` [PATCH 12/33] generic/732: disable for fuse.ext4 Darrick J. Wong
2025-10-29 1:23 ` [PATCH 13/33] defrag: fix ext4 defrag ioctl test Darrick J. Wong
2025-10-29 1:24 ` [PATCH 14/33] misc: explicitly require online resize support Darrick J. Wong
2025-10-29 1:24 ` [PATCH 15/33] ext4/004: disable for fuse2fs Darrick J. Wong
2025-10-29 1:24 ` [PATCH 16/33] generic/679: " Darrick J. Wong
2025-10-29 1:24 ` [PATCH 17/33] ext4/045: don't run the long dirent test on fuse2fs Darrick J. Wong
2025-10-29 1:25 ` [PATCH 18/33] generic/338: skip test if we can't mount with strictatime Darrick J. Wong
2025-10-29 1:25 ` [PATCH 19/33] generic/563: fuse doesn't support cgroup-aware writeback accounting Darrick J. Wong
2025-10-29 1:25 ` [PATCH 20/33] misc: use a larger buffer size for pwrites Darrick J. Wong
2025-10-29 1:25 ` [PATCH 21/33] ext4/046: don't run this test if dioread_nolock not supported Darrick J. Wong
2025-10-29 1:26 ` [PATCH 22/33] generic/631: don't run test if we can't mount overlayfs Darrick J. Wong
2025-10-30 11:35 ` Amir Goldstein
2025-11-05 23:12 ` Darrick J. Wong
2025-11-06 9:23 ` Amir Goldstein
2025-11-06 16:02 ` Darrick J. Wong
2025-10-29 1:26 ` [PATCH 23/33] generic/{409,410,411,589}: check for stacking mount support Darrick J. Wong
2025-10-30 10:25 ` Amir Goldstein
2025-11-05 22:58 ` Darrick J. Wong
2025-10-29 1:26 ` [PATCH 24/33] generic: add _require_hardlinks to tests that require hardlinks Darrick J. Wong
2025-10-29 1:26 ` [PATCH 25/33] ext4/001: check for fiemap support Darrick J. Wong
2025-10-29 1:27 ` [PATCH 26/33] generic/622: check that strictatime/lazytime actually work Darrick J. Wong
2025-10-29 1:27 ` [PATCH 27/33] generic/050: skip test because fuse2fs doesn't have stable output Darrick J. Wong
2025-10-30 10:05 ` Amir Goldstein
2025-11-05 23:02 ` Darrick J. Wong
2025-10-29 1:27 ` [PATCH 28/33] generic/405: don't stall on mkfs asking for input Darrick J. Wong
2025-10-29 1:27 ` [PATCH 29/33] ext4/006: fix this test Darrick J. Wong
2025-10-29 1:28 ` [PATCH 30/33] ext4/009: fix ENOSPC errors Darrick J. Wong
2025-10-29 1:28 ` [PATCH 31/33] ext4/022: enabl Darrick J. Wong
2025-10-29 6:03 ` Darrick J. Wong
2025-10-29 1:28 ` [PATCH 32/33] generic/730: adapt test for fuse filesystems Darrick J. Wong
2025-10-29 1:29 ` [PATCH 33/33] fuse2fs: hack around weird corruption problems Darrick J. Wong
2025-10-29 9:35 ` [PATCHSET v6] fstests: support ext4 fuse testing Christoph Hellwig
2025-10-29 23:52 ` Darrick J. Wong
2025-10-30 16:35 ` [PATCHBOMB v6] fuse: containerize ext4 for safer operation Joanne Koong
2025-10-31 17:56 ` 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=20260129231217.GA7693@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=bernd@bsbernd.com \
--cc=joannelkoong@gmail.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=neal@gompa.dev \
/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