Commit 0e984ec8 authored by Jens Axboe's avatar Jens Axboe

io_uring/rw: add separate prep handler for readv/writev

Rather than sprinkle opcode checks in the generic read/write prep handler,
have a separate prep handler for the vectored readv/writev operation.
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent f8f9ab2d
...@@ -66,7 +66,7 @@ const struct io_issue_def io_issue_defs[] = { ...@@ -66,7 +66,7 @@ const struct io_issue_def io_issue_defs[] = {
.iopoll = 1, .iopoll = 1,
.iopoll_queue = 1, .iopoll_queue = 1,
.vectored = 1, .vectored = 1,
.prep = io_prep_rw, .prep = io_prep_rwv,
.issue = io_read, .issue = io_read,
}, },
[IORING_OP_WRITEV] = { [IORING_OP_WRITEV] = {
...@@ -80,7 +80,7 @@ const struct io_issue_def io_issue_defs[] = { ...@@ -80,7 +80,7 @@ const struct io_issue_def io_issue_defs[] = {
.iopoll = 1, .iopoll = 1,
.iopoll_queue = 1, .iopoll_queue = 1,
.vectored = 1, .vectored = 1,
.prep = io_prep_rw, .prep = io_prep_rwv,
.issue = io_write, .issue = io_write,
}, },
[IORING_OP_FSYNC] = { [IORING_OP_FSYNC] = {
......
...@@ -110,15 +110,23 @@ int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe) ...@@ -110,15 +110,23 @@ int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe)
rw->addr = READ_ONCE(sqe->addr); rw->addr = READ_ONCE(sqe->addr);
rw->len = READ_ONCE(sqe->len); rw->len = READ_ONCE(sqe->len);
rw->flags = READ_ONCE(sqe->rw_flags); rw->flags = READ_ONCE(sqe->rw_flags);
return 0;
}
/* Have to do this validation here, as this is in io_read() rw->len might int io_prep_rwv(struct io_kiocb *req, const struct io_uring_sqe *sqe)
* have chanaged due to buffer selection {
int ret;
ret = io_prep_rw(req, sqe);
if (unlikely(ret))
return ret;
/*
* Have to do this validation here, as this is in io_read() rw->len
* might have chanaged due to buffer selection
*/ */
if (req->opcode == IORING_OP_READV && req->flags & REQ_F_BUFFER_SELECT) { if (req->flags & REQ_F_BUFFER_SELECT)
ret = io_iov_buffer_select_prep(req); return io_iov_buffer_select_prep(req);
if (ret)
return ret;
}
return 0; return 0;
} }
......
...@@ -16,6 +16,7 @@ struct io_async_rw { ...@@ -16,6 +16,7 @@ struct io_async_rw {
}; };
int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe); int io_prep_rw(struct io_kiocb *req, const struct io_uring_sqe *sqe);
int io_prep_rwv(struct io_kiocb *req, const struct io_uring_sqe *sqe);
int io_read(struct io_kiocb *req, unsigned int issue_flags); int io_read(struct io_kiocb *req, unsigned int issue_flags);
int io_readv_prep_async(struct io_kiocb *req); int io_readv_prep_async(struct io_kiocb *req);
int io_write(struct io_kiocb *req, unsigned int issue_flags); int io_write(struct io_kiocb *req, unsigned int issue_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment