From: John Groves <John@Groves.net>
To: John Groves <John@Groves.net>, Miklos Szeredi <miklos@szeredi.hu>,
Dan Williams <dan.j.williams@intel.com>,
Bernd Schubert <bschubert@ddn.com>,
Alison Schofield <alison.schofield@intel.com>
Cc: John Groves <jgroves@micron.com>,
Jonathan Corbet <corbet@lwn.net>,
Vishal Verma <vishal.l.verma@intel.com>,
Dave Jiang <dave.jiang@intel.com>,
Matthew Wilcox <willy@infradead.org>, Jan Kara <jack@suse.cz>,
Alexander Viro <viro@zeniv.linux.org.uk>,
David Hildenbrand <david@kernel.org>,
Christian Brauner <brauner@kernel.org>,
"Darrick J . Wong" <djwong@kernel.org>,
Randy Dunlap <rdunlap@infradead.org>,
Jeff Layton <jlayton@kernel.org>,
Amir Goldstein <amir73il@gmail.com>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
Stefan Hajnoczi <shajnocz@redhat.com>,
Joanne Koong <joannelkoong@gmail.com>,
Josef Bacik <josef@toxicpanda.com>,
Bagas Sanjaya <bagasdotme@gmail.com>,
Chen Linxuan <chenlinxuan@uniontech.com>,
James Morse <james.morse@arm.com>, Fuad Tabba <tabba@google.com>,
Sean Christopherson <seanjc@google.com>,
Shivank Garg <shivankg@amd.com>,
Ackerley Tng <ackerleytng@google.com>,
Gregory Price <gourry@gourry.net>,
Aravind Ramesh <arramesh@micron.com>,
Ajay Joshi <ajayjoshi@micron.com>,
venkataravis@micron.com, linux-doc@vger.kernel.org,
linux-kernel@vger.kernel.org, nvdimm@lists.linux.dev,
linux-cxl@vger.kernel.org, linux-fsdevel@vger.kernel.org,
John Groves <john@groves.net>
Subject: [PATCH V3 4/4] fuse: add famfs DAX fmap support
Date: Wed, 7 Jan 2026 09:34:43 -0600 [thread overview]
Message-ID: <20260107153443.64794-5-john@groves.net> (raw)
In-Reply-To: <20260107153443.64794-1-john@groves.net>
Add new FUSE operations and capability for famfs DAX file mapping:
- FUSE_CAP_DAX_FMAP: New capability flag at bit 32 (using want_ext/capable_ext
fields) to indicate kernel and userspace support for DAX fmaps
- GET_FMAP: New operation to retrieve a file map for DAX-mapped files.
Returns a fuse_famfs_fmap_header followed by simple or interleaved
extent descriptors. The kernel passes the file size as an argument.
- GET_DAXDEV: New operation to retrieve DAX device info by index.
Called when GET_FMAP returns an fmap referencing a previously
unknown DAX device.
These operations enable FUSE filesystems to provide direct access
mappings to persistent memory, allowing the kernel to map files
directly to DAX devices without page cache intermediation.
Signed-off-by: John Groves <john@groves.net>
---
include/fuse_common.h | 5 +++++
include/fuse_lowlevel.h | 37 +++++++++++++++++++++++++++++++++++++
lib/fuse_lowlevel.c | 31 ++++++++++++++++++++++++++++++-
3 files changed, 72 insertions(+), 1 deletion(-)
diff --git a/include/fuse_common.h b/include/fuse_common.h
index 041188e..e428ddb 100644
--- a/include/fuse_common.h
+++ b/include/fuse_common.h
@@ -512,6 +512,11 @@ struct fuse_loop_config_v1 {
*/
#define FUSE_CAP_OVER_IO_URING (1UL << 31)
+/**
+ * handle files that use famfs dax fmaps
+ */
+#define FUSE_CAP_DAX_FMAP (1UL<<32)
+
/**
* Ioctl flags
*
diff --git a/include/fuse_lowlevel.h b/include/fuse_lowlevel.h
index d2bbcca..55fcfd7 100644
--- a/include/fuse_lowlevel.h
+++ b/include/fuse_lowlevel.h
@@ -1341,6 +1341,43 @@ struct fuse_lowlevel_ops {
*/
void (*statx)(fuse_req_t req, fuse_ino_t ino, int flags, int mask,
struct fuse_file_info *fi);
+
+ /**
+ * Get a famfs/devdax/fsdax fmap
+ *
+ * Retrieve a file map (aka fmap) for a previously looked-up file.
+ * The fmap is serialized into the buffer, anchored by
+ * struct fuse_famfs_fmap_header, followed by one or more
+ * structs fuse_famfs_simple_ext, or fuse_famfs_iext (which itself
+ * is followed by one or more fuse_famfs_simple_ext...
+ *
+ * Valid replies:
+ * fuse_reply_buf (TODO: variable-size reply)
+ * fuse_reply_err
+ *
+ * @param req request handle
+ * @param ino the inode number
+ */
+ void (*get_fmap) (fuse_req_t req, fuse_ino_t ino, size_t size);
+
+ /**
+ * Get a daxdev by index
+ *
+ * Retrieve info on a daxdev by index. This will be called any time
+ * GET_FMAP has returned a file map that references a previously
+ * unused daxdev. struct famfs_simple_ext, which is used for all
+ * resolutions to daxdev offsets, references daxdevs by index.
+ * In user space we maintain a master list of all referenced daxdevs
+ * by index, which is queried by get_daxdev.
+ *
+ * Valid replies:
+ * fuse_reply_buf
+ * fuse_reply_err
+ *
+ * @param req request handle
+ * @param ino the index of the daxdev
+ */
+ void (*get_daxdev) (fuse_req_t req, int daxdev_index);
};
/**
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index 413e7c3..c3adfa2 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -2769,7 +2769,8 @@ _do_init(fuse_req_t req, const fuse_ino_t nodeid, const void *op_in,
se->conn.capable_ext |= FUSE_CAP_NO_EXPORT_SUPPORT;
if (inargflags & FUSE_OVER_IO_URING)
se->conn.capable_ext |= FUSE_CAP_OVER_IO_URING;
-
+ if (inargflags & FUSE_DAX_FMAP)
+ se->conn.capable_ext |= FUSE_CAP_DAX_FMAP;
} else {
se->conn.max_readahead = 0;
}
@@ -2932,6 +2933,8 @@ _do_init(fuse_req_t req, const fuse_ino_t nodeid, const void *op_in,
outargflags |= FUSE_REQUEST_TIMEOUT;
outarg.request_timeout = se->conn.request_timeout;
}
+ if (se->conn.want_ext & FUSE_CAP_DAX_FMAP)
+ outargflags |= FUSE_DAX_FMAP;
outarg.max_readahead = se->conn.max_readahead;
outarg.max_write = se->conn.max_write;
@@ -3035,6 +3038,30 @@ static void do_destroy(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
_do_destroy(req, nodeid, inarg, NULL);
}
+static void
+do_get_fmap(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+{
+ struct fuse_session *se = req->se;
+ struct fuse_getxattr_in *arg = (struct fuse_getxattr_in *) inarg;
+
+ if (se->op.get_fmap)
+ se->op.get_fmap(req, nodeid, arg->size);
+ else
+ fuse_reply_err(req, -EOPNOTSUPP);
+}
+
+static void
+do_get_daxdev(fuse_req_t req, fuse_ino_t nodeid, const void *inarg)
+{
+ struct fuse_session *se = req->se;
+ (void)inarg;
+
+ if (se->op.get_daxdev)
+ se->op.get_daxdev(req, nodeid); /* Use nodeid as daxdev_index */
+ else
+ fuse_reply_err(req, -EOPNOTSUPP);
+}
+
static void list_del_nreq(struct fuse_notify_req *nreq)
{
struct fuse_notify_req *prev = nreq->prev;
@@ -3470,6 +3497,8 @@ static struct {
[FUSE_LSEEK] = { do_lseek, "LSEEK" },
[FUSE_STATX] = { do_statx, "STATX" },
[CUSE_INIT] = { cuse_lowlevel_init, "CUSE_INIT" },
+ [FUSE_GET_FMAP] = { do_get_fmap, "GET_FMAP" },
+ [FUSE_GET_DAXDEV] = { do_get_daxdev, "GET_DAXDEV" },
};
static struct {
--
2.49.0
next prev parent reply other threads:[~2026-01-07 15:35 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-07 15:32 [PATCH BUNDLE] famfs: Fabric-Attached Memory File System John Groves
2026-01-07 15:33 ` [PATCH V3 00/21] famfs: port into fuse John Groves
2026-01-07 15:33 ` [PATCH V3 01/21] dax: move dax_pgoff_to_phys from [drivers/dax/] device.c to bus.c John Groves
2026-01-08 10:43 ` Jonathan Cameron
2026-01-08 13:25 ` John Groves
2026-01-08 15:20 ` Jonathan Cameron
2026-01-07 15:33 ` [PATCH V3 02/21] dax: add fsdev.c driver for fs-dax on character dax John Groves
2026-01-08 11:31 ` Jonathan Cameron
2026-01-08 14:32 ` John Groves
2026-01-08 15:12 ` John Groves
2026-01-08 21:15 ` John Groves
2026-01-08 23:25 ` Gregory Price
2026-01-07 15:33 ` [PATCH V3 03/21] dax: Save the kva from memremap John Groves
2026-01-08 11:32 ` Jonathan Cameron
2026-01-08 15:15 ` John Groves
2026-01-07 15:33 ` [PATCH V3 04/21] dax: Add dax_operations for use by fs-dax on fsdev dax John Groves
2026-01-08 11:50 ` Jonathan Cameron
2026-01-08 15:59 ` John Groves
2026-01-08 16:10 ` Jonathan Cameron
2026-01-07 15:33 ` [PATCH V3 05/21] dax: Add dax_set_ops() for setting dax_operations at bind time John Groves
2026-01-08 12:06 ` Jonathan Cameron
2026-01-08 16:20 ` John Groves
2026-01-07 15:33 ` [PATCH V3 06/21] dax: Add fs_dax_get() func to prepare dax for fs-dax usage John Groves
2026-01-08 12:27 ` Jonathan Cameron
2026-01-08 16:45 ` John Groves
2026-01-07 15:33 ` [PATCH V3 07/21] dax: prevent driver unbind while filesystem holds device John Groves
2026-01-08 12:34 ` Jonathan Cameron
2026-01-08 18:08 ` John Groves
2026-01-12 18:55 ` John Groves
2026-01-07 15:33 ` [PATCH V3 08/21] dax: export dax_dev_get() John Groves
2026-01-07 15:33 ` [PATCH V3 09/21] famfs_fuse: magic.h: Add famfs magic numbers John Groves
2026-01-07 15:33 ` [PATCH V3 10/21] famfs_fuse: Kconfig John Groves
2026-01-08 12:36 ` Jonathan Cameron
2026-01-12 16:46 ` John Groves
2026-01-07 15:33 ` [PATCH V3 11/21] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX/ John Groves
2026-01-09 18:16 ` Joanne Koong
2026-01-09 22:15 ` [PATCH V3 11/21] famfs_fuse: Update macro s/FUSE_IS_DAX/FUSE_IS_VIRTIO_DAX John Groves
2026-01-07 15:33 ` [PATCH V3 12/21] famfs_fuse: Basic fuse kernel ABI enablement for famfs John Groves
2026-01-09 18:29 ` Joanne Koong
2026-01-09 22:58 ` John Groves
2026-01-07 15:33 ` [PATCH V3 13/21] famfs_fuse: Famfs mount opt: -o shadow=<shadowpath> John Groves
2026-01-09 19:22 ` Joanne Koong
2026-01-10 0:38 ` John Groves
2026-01-11 18:20 ` John Groves
2026-01-07 15:33 ` [PATCH V3 14/21] famfs_fuse: Plumb the GET_FMAP message/response John Groves
2026-01-08 12:49 ` Jonathan Cameron
2026-01-09 2:12 ` John Groves
2026-01-07 15:33 ` [PATCH V3 15/21] famfs_fuse: Create files with famfs fmaps John Groves
2026-01-07 21:30 ` John Groves
2026-01-08 13:14 ` Jonathan Cameron
2026-01-09 14:30 ` John Groves
2026-01-07 15:33 ` [PATCH V3 16/21] famfs_fuse: GET_DAXDEV message and daxdev_table John Groves
2026-01-08 14:45 ` Jonathan Cameron
2026-01-07 15:33 ` [PATCH V3 17/21] famfs_fuse: Plumb dax iomap and fuse read/write/mmap John Groves
2026-01-08 15:13 ` Jonathan Cameron
2026-01-09 17:44 ` John Groves
2026-01-07 15:33 ` [PATCH V3 18/21] famfs_fuse: Add holder_operations for dax notify_failure() John Groves
2026-01-08 15:17 ` Jonathan Cameron
2026-01-09 21:00 ` John Groves
2026-01-07 15:33 ` [PATCH V3 19/21] famfs_fuse: Add DAX address_space_operations with noop_dirty_folio John Groves
2026-01-07 15:33 ` [PATCH V3 20/21] famfs_fuse: Add famfs fmap metadata documentation John Groves
2026-01-07 15:33 ` [PATCH V3 21/21] famfs_fuse: Add documentation John Groves
2026-01-08 15:27 ` Jonathan Cameron
2026-01-11 18:53 ` John Groves
2026-01-07 15:34 ` [PATCH V3 0/4] libfuse: add basic famfs support to libfuse John Groves
2026-01-07 15:34 ` [PATCH V3 1/4] fuse_kernel.h: bring up to baseline 6.19 John Groves
2026-01-07 15:34 ` [PATCH V3 2/4] fuse_kernel.h: add famfs DAX fmap protocol definitions John Groves
2026-01-07 15:34 ` [PATCH V3 3/4] fuse: add API to set kernel mount options John Groves
2026-01-07 15:34 ` John Groves [this message]
2026-01-08 15:31 ` [PATCH V3 4/4] fuse: add famfs DAX fmap support Jonathan Cameron
2026-01-11 18:24 ` John Groves
2026-01-07 15:34 ` [PATCH 0/2] ndctl: Add daxctl support for the new "famfs" mode of devdax John Groves
2026-01-07 15:34 ` [PATCH 1/2] daxctl: Add support for famfs mode John Groves
2026-01-07 15:34 ` [PATCH 2/2] Add test/daxctl-famfs.sh to test famfs mode transitions: John Groves
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=20260107153443.64794-5-john@groves.net \
--to=john@groves.net \
--cc=Jonathan.Cameron@huawei.com \
--cc=ackerleytng@google.com \
--cc=ajayjoshi@micron.com \
--cc=alison.schofield@intel.com \
--cc=amir73il@gmail.com \
--cc=arramesh@micron.com \
--cc=bagasdotme@gmail.com \
--cc=brauner@kernel.org \
--cc=bschubert@ddn.com \
--cc=chenlinxuan@uniontech.com \
--cc=corbet@lwn.net \
--cc=dan.j.williams@intel.com \
--cc=dave.jiang@intel.com \
--cc=david@kernel.org \
--cc=djwong@kernel.org \
--cc=gourry@gourry.net \
--cc=jack@suse.cz \
--cc=james.morse@arm.com \
--cc=jgroves@micron.com \
--cc=jlayton@kernel.org \
--cc=joannelkoong@gmail.com \
--cc=josef@toxicpanda.com \
--cc=linux-cxl@vger.kernel.org \
--cc=linux-doc@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=nvdimm@lists.linux.dev \
--cc=rdunlap@infradead.org \
--cc=seanjc@google.com \
--cc=shajnocz@redhat.com \
--cc=shivankg@amd.com \
--cc=tabba@google.com \
--cc=venkataravis@micron.com \
--cc=viro@zeniv.linux.org.uk \
--cc=vishal.l.verma@intel.com \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox