Skip to content

Commit

Permalink
io_uring/waitid: setup async data in the prep handler
Browse files Browse the repository at this point in the history
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: f31ecf6 ("io_uring: add IORING_OP_WAITID support")
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
axboe committed Feb 12, 2025
1 parent 0edf128 commit 2b4fc4c
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions io_uring/waitid.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down

0 comments on commit 2b4fc4c

Please sign in to comment.