From: John Groves <[email protected]>

Add the minimal fuse plumbing that later famfs commits build on:

- Kconfig: add FUSE_FAMFS_DAX to control compilation of famfs support
  within fuse.
- uapi: add the FUSE_DAX_FMAP flag for the INIT request/reply, by which
  the server and kernel negotiate famfs (in-kernel fs-dax map) support.
- fuse_conn->famfs_iomap to mark a famfs-enabled connection.

Reviewed-by: Joanne Koong <[email protected]>
Reviewed-by: Dave Jiang <[email protected]>
Signed-off-by: John Groves <[email protected]>
---
 fs/fuse/Kconfig           | 13 +++++++++++++
 fs/fuse/fuse_i.h          |  3 +++
 fs/fuse/inode.c           |  6 ++++++
 include/uapi/linux/fuse.h |  5 +++++
 4 files changed, 27 insertions(+)

diff --git a/fs/fuse/Kconfig b/fs/fuse/Kconfig
index 3a4ae632c94a..17fe1f490cbd 100644
--- a/fs/fuse/Kconfig
+++ b/fs/fuse/Kconfig
@@ -76,3 +76,16 @@ config FUSE_IO_URING
 
          If you want to allow fuse server/client communication through 
io-uring,
          answer Y
+
+config FUSE_FAMFS_DAX
+       bool "FUSE support for fs-dax filesystems backed by devdax"
+       depends on FUSE_FS
+       depends on DEV_DAX_FSDEV
+       default FUSE_FS
+       help
+         This enables the fabric-attached memory file system (famfs),
+         which enables formatting devdax memory as a file system. Famfs
+         is primarily intended for scale-out shared access to
+         disaggregated memory.
+
+         To enable famfs or other fuse/fs-dax file systems, answer Y
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index f450194e877f..9c354118c931 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -711,6 +711,9 @@ struct fuse_conn {
        /** @sync_init: Is synchronous FUSE_INIT allowed? */
        unsigned int sync_init:1;
 
+       /** @famfs_iomap: dev_dax_iomap support for famfs */
+       unsigned int famfs_iomap:1;
+
        /** @max_stack_depth: Maximum stack depth for passthrough backing files 
*/
        int max_stack_depth;
 
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 77c21b28b6fa..c347471d04b6 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -1406,6 +1406,10 @@ static void process_init_reply(struct fuse_args *args, 
int error)
 
                        if (flags & FUSE_REQUEST_TIMEOUT)
                                timeout = arg->request_timeout;
+
+                       if (IS_ENABLED(CONFIG_FUSE_FAMFS_DAX) &&
+                           flags & FUSE_DAX_FMAP)
+                               fc->famfs_iomap = 1;
                } else {
                        ra_pages = fc->max_read / PAGE_SIZE;
                        fc->no_lock = 1;
@@ -1473,6 +1477,8 @@ static struct fuse_init_args *fuse_new_init(struct 
fuse_mount *fm)
                flags |= FUSE_SUBMOUNTS;
        if (IS_ENABLED(CONFIG_FUSE_PASSTHROUGH))
                flags |= FUSE_PASSTHROUGH;
+       if (IS_ENABLED(CONFIG_FUSE_FAMFS_DAX))
+               flags |= FUSE_DAX_FMAP;
 
        /*
         * This is just an information flag for fuse server. No need to check
diff --git a/include/uapi/linux/fuse.h b/include/uapi/linux/fuse.h
index c13e1f9a2f12..25686f088e6a 100644
--- a/include/uapi/linux/fuse.h
+++ b/include/uapi/linux/fuse.h
@@ -240,6 +240,9 @@
  *  - add FUSE_COPY_FILE_RANGE_64
  *  - add struct fuse_copy_file_range_out
  *  - add FUSE_NOTIFY_PRUNE
+ *
+ *  7.46
+ *  - Add FUSE_DAX_FMAP capability - ability to handle in-kernel fsdax maps
  */
 
 #ifndef _LINUX_FUSE_H
@@ -448,6 +451,7 @@ struct fuse_file_lock {
  * FUSE_OVER_IO_URING: Indicate that client supports io-uring
  * FUSE_REQUEST_TIMEOUT: kernel supports timing out requests.
  *                      init_out.request_timeout contains the timeout (in secs)
+ * FUSE_DAX_FMAP: kernel supports dev_dax_iomap (aka famfs) fmaps
  */
 #define FUSE_ASYNC_READ                (1 << 0)
 #define FUSE_POSIX_LOCKS       (1 << 1)
@@ -495,6 +499,7 @@ struct fuse_file_lock {
 #define FUSE_ALLOW_IDMAP       (1ULL << 40)
 #define FUSE_OVER_IO_URING     (1ULL << 41)
 #define FUSE_REQUEST_TIMEOUT   (1ULL << 42)
+#define FUSE_DAX_FMAP          (1ULL << 43)
 
 /**
  * CUSE INIT request/reply flags
-- 
2.53.0



Reply via email to