]> git.itanic.dy.fi Git - linux-stable/commitdiff
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 25a3515a177c7a03410ed2fe72f5e3291f6d4afb..0521a26bc6cd1742d1396513b08a16f0fdd05813 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 1c76de483ef63466dde1227a12f3dffa0b822e08..63d343bae76229edf92a424a2691134ffc9a12be 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 c5aed03d42a4d14182a57318ad9fc7cd8cc0e829..32aa7937513a589b1640f03d63cf9451d9a24a29 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);