return false;
 }
 
-static int io_prep_rw(struct io_kiocb *req, const struct sqe_submit *s,
-                     bool force_nonblock)
+static int io_prep_rw(struct io_kiocb *req, bool force_nonblock)
 {
-       const struct io_uring_sqe *sqe = s->sqe;
+       const struct io_uring_sqe *sqe = req->submit.sqe;
        struct io_ring_ctx *ctx = req->ctx;
        struct kiocb *kiocb = &req->rw;
        unsigned ioprio;
        return ret;
 }
 
-static int io_read(struct io_kiocb *req, const struct sqe_submit *s,
-                  struct io_kiocb **nxt, bool force_nonblock)
+static int io_read(struct io_kiocb *req, struct io_kiocb **nxt,
+                  bool force_nonblock)
 {
        struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
        struct kiocb *kiocb = &req->rw;
        size_t iov_count;
        ssize_t read_size, ret;
 
-       ret = io_prep_rw(req, s, force_nonblock);
+       ret = io_prep_rw(req, force_nonblock);
        if (ret)
                return ret;
        file = kiocb->ki_filp;
        if (unlikely(!(file->f_mode & FMODE_READ)))
                return -EBADF;
 
-       ret = io_import_iovec(req->ctx, READ, s, &iovec, &iter);
+       ret = io_import_iovec(req->ctx, READ, &req->submit, &iovec, &iter);
        if (ret < 0)
                return ret;
 
                        ret2 = -EAGAIN;
                /* Catch -EAGAIN return for forced non-blocking submission */
                if (!force_nonblock || ret2 != -EAGAIN)
-                       kiocb_done(kiocb, ret2, nxt, s->in_async);
+                       kiocb_done(kiocb, ret2, nxt, req->submit.in_async);
                else
                        ret = -EAGAIN;
        }
        return ret;
 }
 
-static int io_write(struct io_kiocb *req, const struct sqe_submit *s,
-                   struct io_kiocb **nxt, bool force_nonblock)
+static int io_write(struct io_kiocb *req, struct io_kiocb **nxt,
+                   bool force_nonblock)
 {
        struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
        struct kiocb *kiocb = &req->rw;
        size_t iov_count;
        ssize_t ret;
 
-       ret = io_prep_rw(req, s, force_nonblock);
+       ret = io_prep_rw(req, force_nonblock);
        if (ret)
                return ret;
 
        if (unlikely(!(file->f_mode & FMODE_WRITE)))
                return -EBADF;
 
-       ret = io_import_iovec(req->ctx, WRITE, s, &iovec, &iter);
+       ret = io_import_iovec(req->ctx, WRITE, &req->submit, &iovec, &iter);
        if (ret < 0)
                return ret;
 
                else
                        ret2 = loop_rw_iter(WRITE, file, kiocb, &iter);
                if (!force_nonblock || ret2 != -EAGAIN)
-                       kiocb_done(kiocb, ret2, nxt, s->in_async);
+                       kiocb_done(kiocb, ret2, nxt, req->submit.in_async);
                else
                        ret = -EAGAIN;
        }
        return 0;
 }
 
-static int io_req_defer(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                       const struct io_uring_sqe *sqe)
+static int io_req_defer(struct io_ring_ctx *ctx, struct io_kiocb *req)
 {
+       const struct io_uring_sqe *sqe = req->submit.sqe;
        struct io_uring_sqe *sqe_copy;
 
        if (!io_sequence_defer(ctx, req) && list_empty(&ctx->defer_list))
 }
 
 static int __io_submit_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                          const struct sqe_submit *s, struct io_kiocb **nxt,
-                          bool force_nonblock)
+                          struct io_kiocb **nxt, bool force_nonblock)
 {
        int ret, opcode;
+       struct sqe_submit *s = &req->submit;
 
        req->user_data = READ_ONCE(s->sqe->user_data);
 
        case IORING_OP_READV:
                if (unlikely(s->sqe->buf_index))
                        return -EINVAL;
-               ret = io_read(req, s, nxt, force_nonblock);
+               ret = io_read(req, nxt, force_nonblock);
                break;
        case IORING_OP_WRITEV:
                if (unlikely(s->sqe->buf_index))
                        return -EINVAL;
-               ret = io_write(req, s, nxt, force_nonblock);
+               ret = io_write(req, nxt, force_nonblock);
                break;
        case IORING_OP_READ_FIXED:
-               ret = io_read(req, s, nxt, force_nonblock);
+               ret = io_read(req, nxt, force_nonblock);
                break;
        case IORING_OP_WRITE_FIXED:
-               ret = io_write(req, s, nxt, force_nonblock);
+               ret = io_write(req, nxt, force_nonblock);
                break;
        case IORING_OP_FSYNC:
                ret = io_fsync(req, s->sqe, nxt, force_nonblock);
                s->has_user = (work->flags & IO_WQ_WORK_HAS_MM) != 0;
                s->in_async = true;
                do {
-                       ret = __io_submit_sqe(ctx, req, s, &nxt, false);
+                       ret = __io_submit_sqe(ctx, req, &nxt, false);
                        /*
                         * We can get EAGAIN for polled IO even though we're
                         * forcing a sync submission from here, since we can't
        return table->files[index & IORING_FILE_TABLE_MASK];
 }
 
-static int io_req_set_file(struct io_ring_ctx *ctx, const struct sqe_submit *s,
+static int io_req_set_file(struct io_ring_ctx *ctx,
                           struct io_submit_state *state, struct io_kiocb *req)
 {
+       struct sqe_submit *s = &req->submit;
        unsigned flags;
        int fd;
 
        return ret;
 }
 
-static int __io_queue_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                       struct sqe_submit *s)
+static int __io_queue_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req)
 {
        int ret;
 
-       ret = __io_submit_sqe(ctx, req, s, NULL, true);
+       ret = __io_submit_sqe(ctx, req, NULL, true);
 
        /*
         * We async punt it if the file wasn't marked NOWAIT, or if the file
         */
        if (ret == -EAGAIN && (!(req->flags & REQ_F_NOWAIT) ||
            (req->flags & REQ_F_MUST_PUNT))) {
+               struct sqe_submit *s = &req->submit;
                struct io_uring_sqe *sqe_copy;
 
                sqe_copy = kmemdup(s->sqe, sizeof(*sqe_copy), GFP_KERNEL);
        return ret;
 }
 
-static int io_queue_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                       struct sqe_submit *s)
+static int io_queue_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req)
 {
        int ret;
 
-       ret = io_req_defer(ctx, req, s->sqe);
+       ret = io_req_defer(ctx, req);
        if (ret) {
                if (ret != -EIOCBQUEUED) {
+                       io_cqring_add_event(ctx, req->submit.sqe->user_data, ret);
                        io_free_req(req, NULL);
-                       io_cqring_add_event(ctx, s->sqe->user_data, ret);
                }
                return 0;
        }
 
-       return __io_queue_sqe(ctx, req, s);
+       return __io_queue_sqe(ctx, req);
 }
 
 static int io_queue_link_head(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                             struct sqe_submit *s, struct io_kiocb *shadow)
+                             struct io_kiocb *shadow)
 {
        int ret;
        int need_submit = false;
 
        if (!shadow)
-               return io_queue_sqe(ctx, req, s);
+               return io_queue_sqe(ctx, req);
 
        /*
         * Mark the first IO in link list as DRAIN, let all the following
         * list.
         */
        req->flags |= REQ_F_IO_DRAIN;
-       ret = io_req_defer(ctx, req, s->sqe);
+       ret = io_req_defer(ctx, req);
        if (ret) {
                if (ret != -EIOCBQUEUED) {
+                       io_cqring_add_event(ctx, req->submit.sqe->user_data, ret);
                        io_free_req(req, NULL);
                        __io_free_req(shadow);
-                       io_cqring_add_event(ctx, s->sqe->user_data, ret);
                        return 0;
                }
        } else {
        spin_unlock_irq(&ctx->completion_lock);
 
        if (need_submit)
-               return __io_queue_sqe(ctx, req, s);
+               return __io_queue_sqe(ctx, req);
 
        return 0;
 }
 #define SQE_VALID_FLAGS        (IOSQE_FIXED_FILE|IOSQE_IO_DRAIN|IOSQE_IO_LINK)
 
 static void io_submit_sqe(struct io_ring_ctx *ctx, struct io_kiocb *req,
-                         struct sqe_submit *s, struct io_submit_state *state,
-                         struct io_kiocb **link)
+                         struct io_submit_state *state, struct io_kiocb **link)
 {
        struct io_uring_sqe *sqe_copy;
+       struct sqe_submit *s = &req->submit;
        int ret;
 
        /* enforce forwards compatibility on users */
                goto err_req;
        }
 
-       ret = io_req_set_file(ctx, s, state, req);
+       ret = io_req_set_file(ctx, state, req);
        if (unlikely(ret)) {
 err_req:
-               io_free_req(req, NULL);
                io_cqring_add_event(ctx, s->sqe->user_data, ret);
+               io_free_req(req, NULL);
                return;
        }
 
                INIT_LIST_HEAD(&req->link_list);
                *link = req;
        } else {
-               io_queue_sqe(ctx, req, s);
+               io_queue_sqe(ctx, req);
        }
 }
 
                req->submit.needs_fixed_file = async;
                trace_io_uring_submit_sqe(ctx, req->submit.sqe->user_data,
                                          true, async);
-               io_submit_sqe(ctx, req, &req->submit, statep, &link);
+               io_submit_sqe(ctx, req, statep, &link);
                submitted++;
 
                /*
                 * that's the end of the chain. Submit the previous link.
                 */
                if (!(sqe_flags & IOSQE_IO_LINK) && link) {
-                       io_queue_link_head(ctx, link, &link->submit, shadow_req);
+                       io_queue_link_head(ctx, link, shadow_req);
                        link = NULL;
                        shadow_req = NULL;
                }
        }
 
        if (link)
-               io_queue_link_head(ctx, link, &link->submit, shadow_req);
+               io_queue_link_head(ctx, link, shadow_req);
        if (statep)
                io_submit_state_end(&state);