aboutsummaryrefslogtreecommitdiffstats
path: root/lib/fuse_uring.c
diff options
context:
space:
mode:
authorBernd Schubert <bschubert@ddn.com>2025-05-28 15:13:47 +0200
committerBernd Schubert <bernd@bsbernd.com>2025-08-22 23:07:24 +0200
commitd52ae4f9d44d7e08375bfacac0bc7cc02ad1b54b (patch)
tree4a0e084061d7e5305c4eee54ce062118eeda3854 /lib/fuse_uring.c
parent253ea916fd5122e1c182cb3ffbff1ac2eeea3991 (diff)
downloadlibfuse-d52ae4f9d44d7e08375bfacac0bc7cc02ad1b54b.tar.gz
Allow applications to retrieve the req payload (io-uring only)
With io-uring the req owns the payload buffer, the application can directly access it and copy data into it. fuse_buf_copy_one() already has a check for dstmem == srcmem and skips data copies. fuse_reply_data fuse_reply_data_uring fuse_buf_copy fuse_buf_copy_one Signed-off-by: Bernd Schubert <bschubert@ddn.com>
Diffstat (limited to 'lib/fuse_uring.c')
-rw-r--r--lib/fuse_uring.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/lib/fuse_uring.c b/lib/fuse_uring.c
index 104be14..ee68fab 100644
--- a/lib/fuse_uring.c
+++ b/lib/fuse_uring.c
@@ -190,6 +190,30 @@ static int fuse_uring_commit_sqe(struct fuse_ring_pool *ring_pool,
return 0;
}
+int fuse_req_get_payload(fuse_req_t req, char **payload, size_t *payload_sz,
+ void **mr)
+{
+ struct fuse_ring_ent *ring_ent;
+
+ /* Not possible without io-uring interface */
+ if (!req->is_uring)
+ return -EINVAL;
+
+ ring_ent = container_of(req, struct fuse_ring_ent, req);
+
+ *payload = ring_ent->op_payload;
+ *payload_sz = ring_ent->req_payload_sz;
+
+ /*
+ * For now unused, but will be used later when the application can
+ * allocate the buffers itself and register them for rdma.
+ */
+ if (mr)
+ *mr = NULL;
+
+ return 0;
+}
+
int send_reply_uring(fuse_req_t req, int error, const void *arg, size_t argsize)
{
int res;