io_queue_sqe(req, NULL, cs);
 }
 
+struct io_submit_link {
+       struct io_kiocb *head;
+       struct io_kiocb *last;
+};
+
 static int io_submit_sqe(struct io_kiocb *req, const struct io_uring_sqe *sqe,
-                        struct io_kiocb **link, struct io_comp_state *cs)
+                        struct io_submit_link *link, struct io_comp_state *cs)
 {
        struct io_ring_ctx *ctx = req->ctx;
        int ret;
         * submitted sync once the chain is complete. If none of those
         * conditions are true (normal request), then just queue it.
         */
-       if (*link) {
-               struct io_kiocb *head = *link;
+       if (link->head) {
+               struct io_kiocb *head = link->head;
 
                /*
                 * Taking sequential execution of a link, draining both sides
                }
                trace_io_uring_link(ctx, req, head);
                list_add_tail(&req->link_list, &head->link_list);
+               link->last = req;
 
                /* last request of a link, enqueue the link */
                if (!(req->flags & (REQ_F_LINK | REQ_F_HARDLINK))) {
                        io_queue_link_head(head, cs);
-                       *link = NULL;
+                       link->head = NULL;
                }
        } else {
                if (unlikely(ctx->drain_next)) {
                        ret = io_req_defer_prep(req, sqe);
                        if (unlikely(ret))
                                req->flags |= REQ_F_FAIL_LINK;
-                       *link = req;
+                       link->head = req;
+                       link->last = req;
                } else {
                        io_queue_sqe(req, sqe, cs);
                }
 static int io_submit_sqes(struct io_ring_ctx *ctx, unsigned int nr)
 {
        struct io_submit_state state;
-       struct io_kiocb *link = NULL;
+       struct io_submit_link link;
        int i, submitted = 0;
 
        /* if we have a backlog and couldn't flush it all, return BUSY */
        refcount_add(nr, ¤t->usage);
 
        io_submit_state_start(&state, ctx, nr);
+       link.head = NULL;
 
        for (i = 0; i < nr; i++) {
                const struct io_uring_sqe *sqe;
                percpu_counter_sub(&tctx->inflight, unused);
                put_task_struct_many(current, unused);
        }
-       if (link)
-               io_queue_link_head(link, &state.comp);
+       if (link.head)
+               io_queue_link_head(link.head, &state.comp);
        io_submit_state_end(&state);
 
         /* Commit SQ ring head once we've consumed and submitted all SQEs */