Commit 2b4fc4cd authored by Jens Axboe's avatar Jens Axboe
Browse files

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: f31ecf67 ("io_uring: add IORING_OP_WAITID support")
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 0edf1283
Loading
Loading
Loading
Loading
+7 −7
Original line number Diff line number Diff line
@@ -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)