]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
io_uring/cmd: add per-op data to struct io_uring_cmd_data
authorJens Axboe <axboe@kernel.dk>
Fri, 3 Jan 2025 15:02:24 +0000 (15:02 +0000)
committerDavid Sterba <dsterba@suse.com>
Mon, 6 Jan 2025 12:51:06 +0000 (13:51 +0100)
In case an op handler for ->uring_cmd() needs stable storage for user
data, it can allocate io_uring_cmd_data->op_data and use it for the
duration of the request. When the request gets cleaned up, uring_cmd
will free it automatically.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: David Sterba <dsterba@suse.com>
include/linux/io_uring/cmd.h
io_uring/uring_cmd.c

index 24cff2b9b9d4d98ae571dd0c523808c49bae7e8f..3df6636ec3a32e752acac810285be4b9612470c4 100644 (file)
@@ -20,6 +20,7 @@ struct io_uring_cmd {
 
 struct io_uring_cmd_data {
        struct io_uring_sqe     sqes[2];
+       void                    *op_data;
 };
 
 static inline const void *io_uring_sqe_cmd(const struct io_uring_sqe *sqe)
index eefc203a1214468248b496072af5663eb7fe3063..019d6f49ff20fa7b39c467fd9d74635523e835b7 100644 (file)
@@ -23,12 +23,16 @@ static struct io_uring_cmd_data *io_uring_async_get(struct io_kiocb *req)
 
        cache = io_alloc_cache_get(&ctx->uring_cache);
        if (cache) {
+               cache->op_data = NULL;
                req->flags |= REQ_F_ASYNC_DATA;
                req->async_data = cache;
                return cache;
        }
-       if (!io_alloc_async_data(req))
-               return req->async_data;
+       if (!io_alloc_async_data(req)) {
+               cache = req->async_data;
+               cache->op_data = NULL;
+               return cache;
+       }
        return NULL;
 }
 
@@ -37,6 +41,11 @@ static void io_req_uring_cleanup(struct io_kiocb *req, unsigned int issue_flags)
        struct io_uring_cmd *ioucmd = io_kiocb_to_cmd(req, struct io_uring_cmd);
        struct io_uring_cmd_data *cache = req->async_data;
 
+       if (cache->op_data) {
+               kfree(cache->op_data);
+               cache->op_data = NULL;
+       }
+
        if (issue_flags & IO_URING_F_UNLOCKED)
                return;
        if (io_alloc_cache_put(&req->ctx->uring_cache, cache)) {