[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <176169813569.1427432.5266892141831578605.stgit@frogsfrogsfrogs>
Date: Tue, 28 Oct 2025 17:59:49 -0700
From: "Darrick J. Wong" <djwong@...nel.org>
To: djwong@...nel.org, bschubert@....com
Cc: linux-ext4@...r.kernel.org, linux-fsdevel@...r.kernel.org,
bernd@...ernd.com, miklos@...redi.hu, joannelkoong@...il.com, neal@...pa.dev
Subject: [PATCH 02/22] libfuse: add kernel gates for FUSE_IOMAP
From: Darrick J. Wong <djwong@...nel.org>
Add some flags to query and request kernel support for filesystem iomap
for regular files.
Signed-off-by: "Darrick J. Wong" <djwong@...nel.org>
---
include/fuse_common.h | 5 +++++
include/fuse_kernel.h | 3 +++
lib/fuse_lowlevel.c | 12 +++++++++++-
3 files changed, 19 insertions(+), 1 deletion(-)
diff --git a/include/fuse_common.h b/include/fuse_common.h
index 041188ec7fa732..9d53354de78868 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)
+/**
+ * Client supports using iomap for regular file operations
+ */
+#define FUSE_CAP_IOMAP (1ULL << 32)
+
/**
* Ioctl flags
*
diff --git a/include/fuse_kernel.h b/include/fuse_kernel.h
index cf4a5f1a35c98b..80ac8c09d2dd64 100644
--- a/include/fuse_kernel.h
+++ b/include/fuse_kernel.h
@@ -241,6 +241,7 @@
* - add struct fuse_copy_file_range_out
*
* 7.99
+ * - add FUSE_IOMAP and iomap_{begin,end,ioend} for regular file operations
*/
#ifndef _LINUX_FUSE_H
@@ -449,6 +450,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_IOMAP: Client supports iomap for regular file operations
*/
#define FUSE_ASYNC_READ (1 << 0)
#define FUSE_POSIX_LOCKS (1 << 1)
@@ -496,6 +498,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_IOMAP (1ULL << 43)
/**
* CUSE INIT request/reply flags
diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c
index d420b257b9dd78..913a2d910504e1 100644
--- a/lib/fuse_lowlevel.c
+++ b/lib/fuse_lowlevel.c
@@ -2746,7 +2746,10 @@ _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_IOMAP)
+ se->conn.capable_ext |= FUSE_CAP_IOMAP;
+ /* Don't let anyone touch iomap until the end of the patchset. */
+ se->conn.capable_ext &= ~FUSE_CAP_IOMAP;
} else {
se->conn.max_readahead = 0;
}
@@ -2792,6 +2795,9 @@ _do_init(fuse_req_t req, const fuse_ino_t nodeid, const void *op_in,
FUSE_CAP_READDIRPLUS_AUTO);
LL_SET_DEFAULT(1, FUSE_CAP_OVER_IO_URING);
+ /* servers need to opt-in to iomap explicitly */
+ LL_SET_DEFAULT(0, FUSE_CAP_IOMAP);
+
/* This could safely become default, but libfuse needs an API extension
* to support it
* LL_SET_DEFAULT(1, FUSE_CAP_SETXATTR_EXT);
@@ -2909,6 +2915,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_IOMAP)
+ outargflags |= FUSE_IOMAP;
outarg.max_readahead = se->conn.max_readahead;
outarg.max_write = se->conn.max_write;
@@ -2943,6 +2951,8 @@ _do_init(fuse_req_t req, const fuse_ino_t nodeid, const void *op_in,
if (se->conn.want_ext & FUSE_CAP_PASSTHROUGH)
fuse_log(FUSE_LOG_DEBUG, " max_stack_depth=%u\n",
outarg.max_stack_depth);
+ if (se->conn.want_ext & FUSE_CAP_IOMAP)
+ fuse_log(FUSE_LOG_DEBUG, " iomap=1\n");
}
if (arg->minor < 5)
outargsize = FUSE_COMPAT_INIT_OUT_SIZE;
Powered by blists - more mailing lists