[PATCH V11 2/9] famfs_fuse: Basic fuse kernel ABI enablement for famfs

John Groves <[email protected]> Mon, 20 Jul 2026 03:45:39 +0000
Newsgroups dev.linux.lists.fuse-devel,dev.linux.lists.nvdimm,org.kernel.vger.linux-cxl,org.kernel.vger.linux-doc,org.kernel.vger.linux-fsdevel,org.kernel.vger.linux-kernel
Message-ID <0100019f7da11f42-c1026097-89e3-4a44-93d0-ef0938544d6b-000000@email.amazonses.com>
From: John Groves <[email protected]>=0D=0A=0D=0AAdd the minimal fuse plumb=
ing that later famfs commits build on:=0D=0A=0D=0A- Kconfig: add FUSE_FAM=
FS_DAX to control compilation of famfs support=0D=0A  within fuse.=0D=0A-=
 uapi: add the FUSE_DAX_FMAP flag for the INIT request/reply, by which=0D=
=0A  the server and kernel negotiate famfs (in-kernel fs-dax map) support=
=2E=0D=0A- fuse_conn->famfs_iomap to mark a famfs-enabled connection.=0D=0A=
=0D=0AReviewed-by: Joanne Koong <[email protected]>=0D=0AReviewed-by=
: Dave Jiang <[email protected]>=0D=0ASigned-off-by: John Groves <john=
@groves.net>=0D=0A---=0D=0A fs/fuse/Kconfig           | 13 +++++++++++++=0D=
=0A fs/fuse/fuse_i.h          |  3 +++=0D=0A fs/fuse/inode.c           | =
 6 ++++++=0D=0A include/uapi/linux/fuse.h |  5 +++++=0D=0A 4 files change=
d, 27 insertions(+)=0D=0A=0D=0Adiff --git a/fs/fuse/Kconfig b/fs/fuse/Kco=
nfig=0D=0Aindex 3a4ae632c94a..17fe1f490cbd 100644=0D=0A--- a/fs/fuse/Kcon=
fig=0D=0A+++ b/fs/fuse/Kconfig=0D=0A@@ -76,3 +76,16 @@ config FUSE_IO_URI=
NG=0D=0A=20=0D=0A =09  If you want to allow fuse server/client communicat=
ion through io-uring,=0D=0A =09  answer Y=0D=0A+=0D=0A+config FUSE_FAMFS_=
DAX=0D=0A+=09bool "FUSE support for fs-dax filesystems backed by devdax"=0D=
=0A+=09depends on FUSE_FS=0D=0A+=09depends on DEV_DAX_FSDEV=0D=0A+=09defa=
ult FUSE_FS=0D=0A+=09help=0D=0A+=09  This enables the fabric-attached mem=
ory file system (famfs),=0D=0A+=09  which enables formatting devdax memor=
y as a file system. Famfs=0D=0A+=09  is primarily intended for scale-out =
shared access to=0D=0A+=09  disaggregated memory.=0D=0A+=0D=0A+=09  To en=
able famfs or other fuse/fs-dax file systems, answer Y=0D=0Adiff --git a/=
fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h=0D=0Aindex f450194e877f..9c354118c931=
 100644=0D=0A--- a/fs/fuse/fuse_i.h=0D=0A+++ b/fs/fuse/fuse_i.h=0D=0A@@ -=
711,6 +711,9 @@ struct fuse_conn {=0D=0A =09/** @sync_init: Is synchronou=
s FUSE_INIT allowed=3F */=0D=0A =09unsigned int sync_init:1;=0D=0A=20=0D=0A=
+=09/** @famfs_iomap: dev_dax_iomap support for famfs */=0D=0A+=09unsigne=
d int famfs_iomap:1;=0D=0A+=0D=0A =09/** @max_stack_depth: Maximum stack =
depth for passthrough backing files */=0D=0A =09int max_stack_depth;=0D=0A=
=20=0D=0Adiff --git a/fs/fuse/inode.c b/fs/fuse/inode.c=0D=0Aindex 77c21b=
28b6fa..c347471d04b6 100644=0D=0A--- a/fs/fuse/inode.c=0D=0A+++ b/fs/fuse=
/inode.c=0D=0A@@ -1406,6 +1406,10 @@ static void process_init_reply(struc=
t fuse_args *args, int error)=0D=0A=20=0D=0A =09=09=09if (flags & FUSE_RE=
QUEST_TIMEOUT)=0D=0A =09=09=09=09timeout =3D arg->request_timeout;=0D=0A+=
=0D=0A+=09=09=09if (IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) &&=0D=0A+=09=09=09 =
   flags & FUSE_DAX_FMAP)=0D=0A+=09=09=09=09fc->famfs_iomap =3D 1;=0D=0A =
=09=09} else {=0D=0A =09=09=09ra_pages =3D fc->max_read / PAGE_SIZE;=0D=0A=
 =09=09=09fc->no_lock =3D 1;=0D=0A@@ -1473,6 +1477,8 @@ static struct fus=
e_init_args *fuse_new_init(struct fuse_mount *fm)=0D=0A =09=09flags |=3D =
FUSE_SUBMOUNTS;=0D=0A =09if (IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))=0D=0A =09=
=09flags |=3D FUSE_PASSTHROUGH;=0D=0A+=09if (IS_ENABLED(CONFIG_FUSE_FAMFS=
_DAX))=0D=0A+=09=09flags |=3D FUSE_DAX_FMAP;=0D=0A=20=0D=0A =09/*=0D=0A =09=
 * This is just an information flag for fuse server. No need to check=0D=0A=
diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h=0D=0Ai=
ndex c13e1f9a2f12..25686f088e6a 100644=0D=0A--- a/include/uapi/linux/fuse=
=2Eh=0D=0A+++ b/include/uapi/linux/fuse.h=0D=0A@@ -240,6 +240,9 @@=0D=0A =
 *  - add FUSE_COPY_FILE_RANGE_64=0D=0A  *  - add struct fuse_copy_file_r=
ange_out=0D=0A  *  - add FUSE_NOTIFY_PRUNE=0D=0A+ *=0D=0A+ *  7.46=0D=0A+=
 *  - Add FUSE_DAX_FMAP capability - ability to handle in-kernel fsdax ma=
ps=0D=0A  */=0D=0A=20=0D=0A #ifndef _LINUX_FUSE_H=0D=0A@@ -448,6 +451,7 @=
@ struct fuse_file_lock {=0D=0A  * FUSE_OVER_IO_URING: Indicate that clie=
nt supports io-uring=0D=0A  * FUSE_REQUEST_TIMEOUT: kernel supports timin=
g out requests.=0D=0A  *=09=09=09 init_out.request_timeout contains the t=
imeout (in secs)=0D=0A+ * FUSE_DAX_FMAP: kernel supports dev_dax_iomap (a=
ka famfs) fmaps=0D=0A  */=0D=0A #define FUSE_ASYNC_READ=09=09(1 << 0)=0D=0A=
 #define FUSE_POSIX_LOCKS=09(1 << 1)=0D=0A@@ -495,6 +499,7 @@ struct fuse=
_file_lock {=0D=0A #define FUSE_ALLOW_IDMAP=09(1ULL << 40)=0D=0A #define =
FUSE_OVER_IO_URING=09(1ULL << 41)=0D=0A #define FUSE_REQUEST_TIMEOUT=09(1=
ULL << 42)=0D=0A+#define FUSE_DAX_FMAP=09=09(1ULL << 43)=0D=0A=20=0D=0A /=
**=0D=0A  * CUSE INIT request/reply flags=0D=0A--=20=0D=0A2.53.0=0D=0A=0D=
=0A