From 84a27de6a644163eda97b7052e064774ec73f925 Mon Sep 17 00:00:00 2001 From: Joanne Koong Date: Wed, 17 Jul 2024 13:42:14 -0700 Subject: Support request timeouts This adds the libfuse changes needed to support request timeouts. A timeout may be set by the server in its init call. If a request is not completed by the timeout, the connection will be aborted by the kernel. Signed-off-by: Joanne Koong --- include/fuse_common.h | 8 +++++++- lib/fuse_lowlevel.c | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/include/fuse_common.h b/include/fuse_common.h index 249e0c9..0b0ea4c 100644 --- a/include/fuse_common.h +++ b/include/fuse_common.h @@ -708,10 +708,16 @@ struct fuse_conn_info { */ uint64_t want_ext; + /** + * Request timeout (in seconds). If the request is not answered by + * this timeout, the connection will be aborted by the kernel. + */ + uint16_t request_timeout; + /** * For future use. */ - uint32_t reserved[16]; + uint16_t reserved[31]; }; fuse_static_assert(sizeof(struct fuse_conn_info) == 128, "Size of struct fuse_conn_info must be 128 bytes"); diff --git a/lib/fuse_lowlevel.c b/lib/fuse_lowlevel.c index e10b937..619edfc 100644 --- a/lib/fuse_lowlevel.c +++ b/lib/fuse_lowlevel.c @@ -2720,6 +2720,11 @@ _do_init(fuse_req_t req, const fuse_ino_t nodeid, const void *op_in, enable_io_uring = true; } + if ((inargflags & FUSE_REQUEST_TIMEOUT) && se->conn.request_timeout) { + outargflags |= FUSE_REQUEST_TIMEOUT; + outarg.request_timeout = se->conn.request_timeout; + } + if (inargflags & FUSE_INIT_EXT) { outargflags |= FUSE_INIT_EXT; outarg.flags2 = outargflags >> 32; -- cgit v1.2.3