struct request *requeue_list = NULL;
        struct request **requeue_lastp = &requeue_list;
        unsigned int depth = 0;
+       bool is_passthrough = false;
        LIST_HEAD(list);
 
        do {
                if (!this_hctx) {
                        this_hctx = rq->mq_hctx;
                        this_ctx = rq->mq_ctx;
-               } else if (this_hctx != rq->mq_hctx || this_ctx != rq->mq_ctx) {
+                       is_passthrough = blk_rq_is_passthrough(rq);
+               } else if (this_hctx != rq->mq_hctx || this_ctx != rq->mq_ctx ||
+                          is_passthrough != blk_rq_is_passthrough(rq)) {
                        rq_list_add_tail(&requeue_lastp, rq);
                        continue;
                }
        trace_block_unplug(this_hctx->queue, depth, !from_sched);
 
        percpu_ref_get(&this_hctx->queue->q_usage_counter);
-       if (this_hctx->queue->elevator) {
+       /* passthrough requests should never be issued to the I/O scheduler */
+       if (this_hctx->queue->elevator && !is_passthrough) {
                this_hctx->queue->elevator->type->ops.insert_requests(this_hctx,
                                &list, 0);
                blk_mq_run_hw_queue(this_hctx, from_sched);