io_uring/waitid: setup async data in the prep handler
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: f31ecf671d
("io_uring: add IORING_OP_WAITID support")
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
0edf1283a9
commit
2b4fc4cd43
1 changed files with 7 additions and 7 deletions
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue