io_uring/waitid: setup async data in the prep handler
authorJens Axboe <axboe@kernel.dk>
Wed, 12 Feb 2025 22:52:54 +0000 (15:52 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 12 Feb 2025 22:53:52 +0000 (15:53 -0700)
This is the idiomatic way that opcodes should setup their async data,
so that it's always valid inside ->issue() without issue needing to
do that.

Fixes: f31ecf671ddc4 ("io_uring: add IORING_OP_WAITID support")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
io_uring/waitid.c

index c4096d93a28708db88a7191210e401962ab44e67..15a7daf3ff4f36331045b59544684c4aa66502ee 100644 (file)
@@ -285,10 +285,16 @@ static int io_waitid_wait(struct wait_queue_entry *wait, unsigned mode,
 int io_waitid_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 {
        struct io_waitid *iw = io_kiocb_to_cmd(req, struct io_waitid);
+       struct io_waitid_async *iwa;
 
        if (sqe->addr || sqe->buf_index || sqe->addr3 || sqe->waitid_flags)
                return -EINVAL;
 
+       iwa = io_uring_alloc_async_data(NULL, req);
+       if (!unlikely(iwa))
+               return -ENOMEM;
+       iwa->req = req;
+
        iw->which = READ_ONCE(sqe->len);
        iw->upid = READ_ONCE(sqe->fd);
        iw->options = READ_ONCE(sqe->file_index);
@@ -299,16 +305,10 @@ int io_waitid_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
 int io_waitid(struct io_kiocb *req, unsigned int issue_flags)
 {
        struct io_waitid *iw = io_kiocb_to_cmd(req, struct io_waitid);
+       struct io_waitid_async *iwa = req->async_data;
        struct io_ring_ctx *ctx = req->ctx;
-       struct io_waitid_async *iwa;
        int ret;
 
-       iwa = io_uring_alloc_async_data(NULL, req);
-       if (!iwa)
-               return -ENOMEM;
-
-       iwa->req = req;
-
        ret = kernel_waitid_prepare(&iwa->wo, iw->which, iw->upid, &iw->info,
                                        iw->options, NULL);
        if (ret)