io_uring/rw: add separate prep handler for readv/writev
authorJens Axboe <axboe@kernel.dk>
Mon, 6 Nov 2023 14:41:17 +0000 (07:41 -0700)
committerJens Axboe <axboe@kernel.dk>
Mon, 6 Nov 2023 14:41:17 +0000 (07:41 -0700)
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>
io_uring/opdef.c
io_uring/rw.c
io_uring/rw.h

index 25a3515..0521a26 100644 (file)
@@ -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] = {
index 1c76de4..63d343b 100644 (file)
@@ -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;
 }
index c5aed03..32aa793 100644 (file)
@@ -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);