aboutsummaryrefslogtreecommitdiffstats
path: root/io_uring
diff options
context:
space:
mode:
authorJens Axboe <axboe@kernel.dk>2023-11-06 07:41:17 -0700
committerJens Axboe <axboe@kernel.dk>2023-11-06 07:41:17 -0700
commit0e984ec88da9747549227900e5215c5e6a1b65ae (patch)
tree73150143deffae7fe41655baee54d5f9d03b7a96 /io_uring
parentf8f9ab2d98116e79d220f1d089df7464ad4e026d (diff)
downloadlinux-0e984ec88da9747549227900e5215c5e6a1b65ae.tar.gz
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: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'io_uring')
-rw-r--r--io_uring/opdef.c4
-rw-r--r--io_uring/rw.c22
-rw-r--r--io_uring/rw.h1
3 files changed, 18 insertions, 9 deletions
diff --git a/io_uring/opdef.c b/io_uring/opdef.c
index 25a3515a177c7a..0521a26bc6cd17 100644
--- a/io_uring/opdef.c
+++ b/io_uring/opdef.c
@@ -66,7 +66,7 @@ const struct io_issue_def io_issue_defs[] = {
.iopoll = 1,
.iopoll_queue = 1,
.vectored = 1,
- .prep = io_prep_rw,
+ .prep = io_prep_rwv,
.issue = io_read,
},
[IORING_OP_WRITEV] = {
@@ -80,7 +80,7 @@ const struct io_issue_def io_issue_defs[] = {
.iopoll = 1,
.iopoll_queue = 1,
.vectored = 1,
- .prep = io_prep_rw,
+ .prep = io_prep_rwv,
.issue = io_write,
},
[IORING_OP_FSYNC] = {
diff --git a/io_uring/rw.c b/io_uring/rw.c
index 1c76de483ef634..63d343bae76229 100644
--- a/io_uring/rw.c
+++ b/io_uring/rw.c
@@ -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->len = READ_ONCE(sqe->len);
rw->flags = READ_ONCE(sqe->rw_flags);
+ return 0;
+}
- /* Have to do this validation here, as this is in io_read() rw->len might
- * have chanaged due to buffer selection
+int io_prep_rwv(struct io_kiocb *req, const struct io_uring_sqe *sqe)
+{
+ 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) {
- ret = io_iov_buffer_select_prep(req);
- if (ret)
- return ret;
- }
+ if (req->flags & REQ_F_BUFFER_SELECT)
+ return io_iov_buffer_select_prep(req);
return 0;
}
diff --git a/io_uring/rw.h b/io_uring/rw.h
index c5aed03d42a4d1..32aa7937513a58 100644
--- a/io_uring/rw.h
+++ b/io_uring/rw.h
@@ -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_rwv(struct io_kiocb *req, const struct io_uring_sqe *sqe);
int io_read(struct io_kiocb *req, unsigned int issue_flags);
int io_readv_prep_async(struct io_kiocb *req);
int io_write(struct io_kiocb *req, unsigned int issue_flags);