From: "Darrick J. Wong" <djwong@kernel.org>
To: Joanne Koong <joannelkoong@gmail.com>
Cc: miklos@szeredi.hu, bernd@bsbernd.com, linux-xfs@vger.kernel.org,
John@groves.net, linux-fsdevel@vger.kernel.org, neal@gompa.dev
Subject: Re: [PATCH 01/28] fuse: implement the basic iomap mechanisms
Date: Tue, 23 Sep 2025 13:32:46 -0700 [thread overview]
Message-ID: <20250923203246.GG1587915@frogsfrogsfrogs> (raw)
In-Reply-To: <CAJnrk1YtGcWj_0MOxS6atL_vrUjk09MzQhFt40yf32Rq12k0qw@mail.gmail.com>
On Fri, Sep 19, 2025 at 03:36:52PM -0700, Joanne Koong wrote:
> On Mon, Sep 15, 2025 at 5:28 PM Darrick J. Wong <djwong@kernel.org> wrote:
> >
> > From: Darrick J. Wong <djwong@kernel.org>
> >
> > Implement functions to enable upcalling of iomap_begin and iomap_end to
> > userspace fuse servers.
> >
> > Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
> > ---
> > fs/fuse/fuse_i.h | 35 ++++
> > fs/fuse/iomap_priv.h | 36 ++++
> > include/uapi/linux/fuse.h | 90 +++++++++
> > fs/fuse/Kconfig | 32 +++
> > fs/fuse/Makefile | 1
> > fs/fuse/file_iomap.c | 434 +++++++++++++++++++++++++++++++++++++++++++++
> > fs/fuse/inode.c | 9 +
> > 7 files changed, 636 insertions(+), 1 deletion(-)
> > create mode 100644 fs/fuse/iomap_priv.h
> > create mode 100644 fs/fuse/file_iomap.c
> >
> >
> > diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
> > index 4560687d619d76..f0d408a6e12c32 100644
> > --- a/fs/fuse/fuse_i.h
> > +++ b/fs/fuse/fuse_i.h
> > @@ -923,6 +923,9 @@ struct fuse_conn {
> > /* Is synchronous FUSE_INIT allowed? */
> > unsigned int sync_init:1;
> >
> > + /* Enable fs/iomap for file operations */
> > + unsigned int iomap:1;
> > +
> > /* Use io_uring for communication */
> > unsigned int io_uring;
> >
> > @@ -1047,6 +1050,11 @@ static inline struct fuse_mount *get_fuse_mount_super(struct super_block *sb)
> > return sb->s_fs_info;
> > }
> >
> > +static inline const struct fuse_mount *get_fuse_mount_super_c(const struct super_block *sb)
> > +{
> > + return sb->s_fs_info;
> > +}
> > +
> > static inline struct fuse_conn *get_fuse_conn_super(struct super_block *sb)
> > {
> > return get_fuse_mount_super(sb)->fc;
> > @@ -1057,16 +1065,31 @@ static inline struct fuse_mount *get_fuse_mount(struct inode *inode)
> > return get_fuse_mount_super(inode->i_sb);
> > }
> >
> > +static inline const struct fuse_mount *get_fuse_mount_c(const struct inode *inode)
> > +{
> > + return get_fuse_mount_super_c(inode->i_sb);
> > +}
> > +
> > static inline struct fuse_conn *get_fuse_conn(struct inode *inode)
> > {
> > return get_fuse_mount_super(inode->i_sb)->fc;
> > }
> >
> > +static inline const struct fuse_conn *get_fuse_conn_c(const struct inode *inode)
> > +{
> > + return get_fuse_mount_super_c(inode->i_sb)->fc;
> > +}
> > +
> > static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
> > {
> > return container_of(inode, struct fuse_inode, inode);
> > }
> >
> > +static inline const struct fuse_inode *get_fuse_inode_c(const struct inode *inode)
> > +{
> > + return container_of(inode, struct fuse_inode, inode);
> > +}
>
> Do we need these new set of helpers? AFAICT it does two things: a)
> guarantee constness of the arg passed in b) guarantee constness of the
> pointer returned
>
> But it seems like for a) we could get that by modifying the existing
> functions to take in a const arg, eg
>
> -static inline struct fuse_inode *get_fuse_inode(struct inode *inode)
> +static inline struct fuse_inode *get_fuse_inode(const struct inode *inode)
> {
> return container_of(inode, struct fuse_inode, inode);
> }
>
> and for b) it seems to me like the caller enforces the constness of
> the pointer returned whether the actual function returns a const
> pointer or not,
>
> eg
> const struct fuse_inode *fi = get_fuse_inode{_c}(inode);
>
> Maybe I'm missing something here but it seems to me like we don't need
> these new helpers?
Heh. I had mistakenly thought that one cannot cast a const struct
pointer to a mutable const struct pointer, but I just tried your
suggestion and it seemed to work fine. So I guess we don't need
get_fuse_mount_c either.
Yay C, all it's doing is taking a number pointing to something that
can't be changed, subtracting from it, and thus returning a different
number. Perhaps Rust has polluted my brain.
> > +
> > diff --git a/fs/fuse/iomap_priv.h b/fs/fuse/iomap_priv.h
>
> btw, i think the general convention is to use "_i.h" suffixing for
> private internal files, eg fuse_i.h, fuse_dev_i.h, dev_uring_i.h
Noted, thank you.
> > new file mode 100644
> > index 00000000000000..243d92cb625095
> > --- /dev/null
> > +++ b/fs/fuse/iomap_priv.h
> > @@ -0,0 +1,36 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Copyright (C) 2025 Oracle. All Rights Reserved.
> > + * Author: Darrick J. Wong <djwong@kernel.org>
> > + */
> > +#ifndef _FS_FUSE_IOMAP_PRIV_H
> > +#define _FS_FUSE_IOMAP_PRIV_H
> > +
> ...
> > diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h
> > index 31b80f93211b81..3634cbe602cd9c 100644
> > --- a/include/uapi/linux/fuse.h
> > +++ b/include/uapi/linux/fuse.h
> > @@ -235,6 +235,9 @@
> > *
> > * 7.44
> > * - add FUSE_NOTIFY_INC_EPOCH
> > + *
> > + * 7.99
>
> Just curious, where did you get the .99 from?
Any time I go adding to a versioned ABI, I try to use high numbers (and
high bits for flags) so that it's really obvious that the new flags are
in use when I poke through crash/gdb/etc.
For permanent artifacts like an ondisk format, it's convenient to cache
fs images for fuzz testing, etc. Using a high bit/number reduces the
chance that someone else's new feature will get merged and cause
conflicts, which force me to regenerate all cached images.
Obviously at merge time I change these values to use lower bit positions
or version numbers to fit the merge target so it doesn't completely
eliminate the caching problems.
> > + * - add FUSE_IOMAP and iomap_{begin,end,ioend} for regular file operations
> > */
> >
> > #ifndef _LINUX_FUSE_H
> > @@ -270,7 +273,7 @@
> > #define FUSE_KERNEL_VERSION 7
> > diff --git a/fs/fuse/Kconfig b/fs/fuse/Kconfig
> > index 9563fa5387a241..67dfe300bf2e07 100644
> > --- a/fs/fuse/Kconfig
> > +++ b/fs/fuse/Kconfig
> > @@ -69,6 +69,38 @@ config FUSE_PASSTHROUGH
> > +config FUSE_IOMAP_DEBUG
> > + bool "Debug FUSE file IO over iomap"
> > + default n
> > + depends on FUSE_IOMAP
> > + help
> > + Enable debugging assertions for the fuse iomap code paths and logging
> > + of bad iomap file mapping data being sent to the kernel.
> > +
>
> I wonder if we should have a general FUSE_DEBUG that this would fall
> under instead of creating one that's iomap_debug specific
Probably, but I was also trying to keep this as localized to iomap as
possible. If Miklos would rather I extend it to all of fuse (which is
probably a good idea!) then I'm happy to do so.
> > config FUSE_IO_URING
> > bool "FUSE communication over io-uring"
> > default y
> > diff --git a/fs/fuse/Makefile b/fs/fuse/Makefile
> > index 46041228e5be2c..27be39317701d6 100644
> > --- a/fs/fuse/Makefile
> > +++ b/fs/fuse/Makefile
> > @@ -18,5 +18,6 @@ fuse-$(CONFIG_FUSE_PASSTHROUGH) += passthrough.o
> > fuse-$(CONFIG_FUSE_BACKING) += backing.o
> > fuse-$(CONFIG_SYSCTL) += sysctl.o
> > fuse-$(CONFIG_FUSE_IO_URING) += dev_uring.o
> > +fuse-$(CONFIG_FUSE_IOMAP) += file_iomap.o
> >
> > virtiofs-y := virtio_fs.o
> > diff --git a/fs/fuse/file_iomap.c b/fs/fuse/file_iomap.c
> > new file mode 100644
> > index 00000000000000..dda757768d3ea6
> > --- /dev/null
> > +++ b/fs/fuse/file_iomap.c
> > @@ -0,0 +1,434 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/*
> > + * Copyright (C) 2025 Oracle. All Rights Reserved.
> > + * Author: Darrick J. Wong <djwong@kernel.org>
> > + */
> > +#include <linux/iomap.h>
> > +#include "fuse_i.h"
> > +#include "fuse_trace.h"
> > +#include "iomap_priv.h"
> > +
> > +/* Validate FUSE_IOMAP_TYPE_* */
> > +static inline bool fuse_iomap_check_type(uint16_t fuse_type)
> > +{
> > + switch (fuse_type) {
> > + case FUSE_IOMAP_TYPE_HOLE:
> > + case FUSE_IOMAP_TYPE_DELALLOC:
> > + case FUSE_IOMAP_TYPE_MAPPED:
> > + case FUSE_IOMAP_TYPE_UNWRITTEN:
> > + case FUSE_IOMAP_TYPE_INLINE:
> > + case FUSE_IOMAP_TYPE_PURE_OVERWRITE:
> > + return true;
> > + }
> > +
> > + return false;
> > +}
>
> Maybe faster to check by using a bitmask instead?
They're consecutive; one could #define a FUSE_IOMAP_TYPE_MAX to alias
PURE_OVERWRITE and collapse the whole check to:
return fuse_type <= FUSE_IOMAP_TYPE_MAX;
> > +
> > diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
> > index 1e7298b2b89b58..32f4b7c9a20a8a 100644
> > --- a/fs/fuse/inode.c
> > +++ b/fs/fuse/inode.c
> > @@ -1448,6 +1448,13 @@ static void process_init_reply(struct fuse_mount *fm, struct fuse_args *args,
> >
> > if (flags & FUSE_REQUEST_TIMEOUT)
> > timeout = arg->request_timeout;
> > +
> > + if ((flags & FUSE_IOMAP) && fuse_iomap_enabled()) {
> > + fc->local_fs = 1;
> > + fc->iomap = 1;
> > + printk(KERN_WARNING
> > + "fuse: EXPERIMENTAL iomap feature enabled. Use at your own risk!");
> > + }
>
> pr_warn() seems to be the convention elsewhere in the fuse code
Ah, thanks. Do you know why fuse calls pr_warn("fuse: XXX") instead of
the usual sequence of
#define pr_fmt(fmt) "fuse: " fmt
so that "fuse: " gets included automatically?
--D
>
> Thanks,
> Joanne
> > } else {
> > ra_pages = fc->max_read / PAGE_SIZE;
> > fc->no_lock = 1;
> > @@ -1516,6 +1523,8 @@ static struct fuse_init_args *fuse_new_init(struct fuse_mount *fm)
> > */
> > if (fuse_uring_enabled())
> > flags |= FUSE_OVER_IO_URING;
> > + if (fuse_iomap_enabled())
> > + flags |= FUSE_IOMAP;
> >
> > ia->in.flags = flags;
> > ia->in.flags2 = flags >> 32;
> >
>
next prev parent reply other threads:[~2025-09-23 20:32 UTC|newest]
Thread overview: 126+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20250916000759.GA8080@frogsfrogsfrogs>
2025-09-16 0:18 ` [PATCHSET RFC v5 1/8] fuse: general bug fixes Darrick J. Wong
2025-09-16 0:24 ` [PATCH 1/8] fuse: fix livelock in synchronous file put from fuseblk workers Darrick J. Wong
2025-09-23 10:57 ` Miklos Szeredi
2025-09-16 0:24 ` [PATCH 2/8] fuse: flush pending fuse events before aborting the connection Darrick J. Wong
2025-09-23 11:11 ` Miklos Szeredi
2025-09-23 14:54 ` Darrick J. Wong
2025-09-23 18:56 ` Miklos Szeredi
2025-09-23 20:59 ` Darrick J. Wong
2025-09-23 22:34 ` Darrick J. Wong
2025-09-24 12:04 ` Miklos Szeredi
2025-09-24 17:50 ` Darrick J. Wong
2025-09-24 18:19 ` Miklos Szeredi
2025-09-24 20:54 ` Darrick J. Wong
2025-09-30 10:29 ` Miklos Szeredi
2025-09-30 17:56 ` Darrick J. Wong
2025-09-16 0:24 ` [PATCH 3/8] fuse: capture the unique id of fuse commands being sent Darrick J. Wong
2025-09-23 10:58 ` Miklos Szeredi
2025-09-16 0:25 ` [PATCH 4/8] fuse: signal that a fuse filesystem should exhibit local fs behaviors Darrick J. Wong
2025-09-17 17:18 ` Joanne Koong
2025-09-18 16:52 ` Darrick J. Wong
2025-09-19 9:24 ` Miklos Szeredi
2025-09-19 17:50 ` Darrick J. Wong
2025-09-23 14:57 ` Miklos Szeredi
2025-09-23 20:51 ` Darrick J. Wong
2025-09-24 13:55 ` Miklos Szeredi
2025-09-24 17:31 ` Darrick J. Wong
2025-09-25 19:17 ` Darrick J. Wong
2025-09-16 0:25 ` [PATCH 5/8] fuse: implement file attributes mask for statx Darrick J. Wong
2025-09-16 0:25 ` [PATCH 6/8] fuse: update file mode when updating acls Darrick J. Wong
2025-09-16 0:25 ` [PATCH 7/8] fuse: propagate default and file acls on creation Darrick J. Wong
2025-09-16 6:41 ` Chen Linxuan
2025-09-16 14:48 ` Darrick J. Wong
2025-09-16 0:26 ` [PATCH 8/8] fuse: enable FUSE_SYNCFS for all fuseblk servers Darrick J. Wong
2025-09-23 10:58 ` Miklos Szeredi
2025-09-16 0:18 ` [PATCHSET RFC v5 2/8] iomap: cleanups ahead of adding fuse support Darrick J. Wong
2025-09-16 0:26 ` [PATCH 1/2] iomap: trace iomap_zero_iter zeroing activities Darrick J. Wong
2025-09-16 13:49 ` Christoph Hellwig
2025-09-16 14:49 ` Darrick J. Wong
2025-09-16 0:26 ` [PATCH 2/2] iomap: error out on file IO when there is no inline_data buffer Darrick J. Wong
2025-09-16 13:50 ` Christoph Hellwig
2025-09-16 14:50 ` Darrick J. Wong
2025-09-16 0:18 ` [PATCHSET RFC v5 3/8] fuse: cleanups ahead of adding fuse support Darrick J. Wong
2025-09-16 0:26 ` [PATCH 1/5] fuse: allow synchronous FUSE_INIT Darrick J. Wong
2025-09-17 17:22 ` Joanne Koong
2025-09-18 18:04 ` Darrick J. Wong
2025-09-16 0:27 ` [PATCH 2/5] fuse: move the backing file idr and code into a new source file Darrick J. Wong
2025-09-25 14:11 ` Miklos Szeredi
2025-09-16 0:27 ` [PATCH 3/5] fuse: move the passthrough-specific code back to passthrough.c Darrick J. Wong
2025-09-17 2:47 ` Amir Goldstein
2025-09-18 18:02 ` Darrick J. Wong
2025-09-19 7:34 ` Miklos Szeredi
2025-09-19 9:36 ` Amir Goldstein
2025-09-19 17:43 ` Darrick J. Wong
2025-09-16 0:27 ` [PATCH 4/5] fuse_trace: " Darrick J. Wong
2025-09-16 0:27 ` [PATCH 5/5] fuse: move CREATE_TRACE_POINTS to a separate file Darrick J. Wong
2025-09-25 14:25 ` Miklos Szeredi
2025-09-16 0:19 ` [PATCHSET RFC v5 4/8] fuse: allow servers to use iomap for better file IO performance Darrick J. Wong
2025-09-16 0:28 ` [PATCH 01/28] fuse: implement the basic iomap mechanisms Darrick J. Wong
2025-09-19 22:36 ` Joanne Koong
2025-09-23 20:32 ` Darrick J. Wong [this message]
2025-09-23 21:24 ` Joanne Koong
2025-09-23 22:10 ` Darrick J. Wong
2025-09-23 23:08 ` Darrick J. Wong
2025-09-16 0:28 ` [PATCH 02/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:28 ` [PATCH 03/28] fuse: make debugging configurable at runtime Darrick J. Wong
2025-09-16 0:29 ` [PATCH 04/28] fuse: adapt FUSE_DEV_IOC_BACKING_{OPEN,CLOSE} to add new iomap devices Darrick J. Wong
2025-09-17 3:09 ` Amir Goldstein
2025-09-18 18:17 ` Darrick J. Wong
2025-09-18 18:42 ` Amir Goldstein
2025-09-18 19:03 ` Darrick J. Wong
2025-09-19 7:13 ` Miklos Szeredi
2025-09-19 9:54 ` Amir Goldstein
2025-09-19 17:42 ` Darrick J. Wong
2025-09-23 7:10 ` Miklos Szeredi
2025-09-16 0:29 ` [PATCH 05/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:29 ` [PATCH 06/28] fuse: flush events and send FUSE_SYNCFS and FUSE_DESTROY on unmount Darrick J. Wong
2025-09-16 0:29 ` [PATCH 07/28] fuse: create a per-inode flag for toggling iomap Darrick J. Wong
2025-09-16 0:30 ` [PATCH 08/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:30 ` [PATCH 09/28] fuse: isolate the other regular file IO paths from iomap Darrick J. Wong
2025-09-16 0:30 ` [PATCH 10/28] fuse: implement basic iomap reporting such as FIEMAP and SEEK_{DATA,HOLE} Darrick J. Wong
2025-09-16 0:30 ` [PATCH 11/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:31 ` [PATCH 12/28] fuse: implement direct IO with iomap Darrick J. Wong
2025-09-16 0:31 ` [PATCH 13/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:31 ` [PATCH 14/28] fuse: implement buffered " Darrick J. Wong
2025-09-16 0:31 ` [PATCH 15/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:32 ` [PATCH 16/28] fuse: implement large folios for iomap pagecache files Darrick J. Wong
2025-09-16 0:32 ` [PATCH 17/28] fuse: use an unrestricted backing device with iomap pagecache io Darrick J. Wong
2025-09-16 0:32 ` [PATCH 18/28] fuse: advertise support for iomap Darrick J. Wong
2025-09-16 0:32 ` [PATCH 19/28] fuse: query filesystem geometry when using iomap Darrick J. Wong
2025-09-16 0:33 ` [PATCH 20/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:33 ` [PATCH 21/28] fuse: implement fadvise for iomap files Darrick J. Wong
2025-09-16 0:33 ` [PATCH 22/28] fuse: invalidate ranges of block devices being used for iomap Darrick J. Wong
2025-09-16 0:33 ` [PATCH 23/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:34 ` [PATCH 24/28] fuse: implement inline data file IO via iomap Darrick J. Wong
2025-09-16 0:34 ` [PATCH 25/28] fuse_trace: " Darrick J. Wong
2025-09-16 0:34 ` [PATCH 26/28] fuse: allow more statx fields Darrick J. Wong
2025-09-16 0:35 ` [PATCH 27/28] fuse: support atomic writes with iomap Darrick J. Wong
2025-09-16 0:35 ` [PATCH 28/28] fuse: disable direct reclaim for any fuse server that uses iomap Darrick J. Wong
2025-09-16 0:19 ` [PATCHSET RFC v5 5/8] fuse: allow servers to specify root node id Darrick J. Wong
2025-09-16 0:35 ` [PATCH 1/3] fuse: make the root nodeid dynamic Darrick J. Wong
2025-09-16 0:35 ` [PATCH 2/3] fuse_trace: " Darrick J. Wong
2025-09-16 0:36 ` [PATCH 3/3] fuse: allow setting of root nodeid Darrick J. Wong
2025-09-16 0:19 ` [PATCHSET RFC v5 6/8] fuse: handle timestamps and ACLs correctly when iomap is enabled Darrick J. Wong
2025-09-16 0:36 ` [PATCH 1/9] fuse: enable caching of timestamps Darrick J. Wong
2025-09-16 0:36 ` [PATCH 2/9] fuse: force a ctime update after a fileattr_set call when in iomap mode Darrick J. Wong
2025-09-16 0:36 ` [PATCH 3/9] fuse: allow local filesystems to set some VFS iflags Darrick J. Wong
2025-09-16 0:37 ` [PATCH 4/9] fuse_trace: " Darrick J. Wong
2025-09-16 0:37 ` [PATCH 5/9] fuse: cache atime when in iomap mode Darrick J. Wong
2025-09-16 0:37 ` [PATCH 6/9] fuse: let the kernel handle KILL_SUID/KILL_SGID for iomap filesystems Darrick J. Wong
2025-09-16 0:37 ` [PATCH 7/9] fuse_trace: " Darrick J. Wong
2025-09-16 0:38 ` [PATCH 8/9] fuse: update ctime when updating acls on an iomap inode Darrick J. Wong
2025-09-16 0:38 ` [PATCH 9/9] fuse: always cache ACLs when using iomap Darrick J. Wong
2025-09-16 0:19 ` [PATCHSET RFC v5 7/8] fuse: cache iomap mappings for even better file IO performance Darrick J. Wong
2025-09-16 0:38 ` [PATCH 01/10] fuse: cache iomaps Darrick J. Wong
2025-09-16 0:38 ` [PATCH 02/10] fuse_trace: " Darrick J. Wong
2025-09-16 0:39 ` [PATCH 03/10] fuse: use the iomap cache for iomap_begin Darrick J. Wong
2025-09-16 0:39 ` [PATCH 04/10] fuse_trace: " Darrick J. Wong
2025-09-16 0:39 ` [PATCH 05/10] fuse: invalidate iomap cache after file updates Darrick J. Wong
2025-09-16 0:39 ` [PATCH 06/10] fuse_trace: " Darrick J. Wong
2025-09-16 0:40 ` [PATCH 07/10] fuse: enable iomap cache management Darrick J. Wong
2025-09-16 0:40 ` [PATCH 08/10] fuse_trace: " Darrick J. Wong
2025-09-16 0:40 ` [PATCH 09/10] fuse: overlay iomap inode info in struct fuse_inode Darrick J. Wong
2025-09-16 0:41 ` [PATCH 10/10] fuse: enable iomap Darrick J. Wong
2025-09-16 0:20 ` [PATCHSET RFC v5 8/8] fuse: run fuse servers as a contained service Darrick J. Wong
2025-09-16 0:41 ` [PATCH 1/2] fuse: allow privileged mount helpers to pre-approve iomap usage Darrick J. Wong
2025-09-16 0:41 ` [PATCH 2/2] fuse: set iomap backing device block size 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=20250923203246.GG1587915@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=John@groves.net \
--cc=bernd@bsbernd.com \
--cc=joannelkoong@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@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