queue_delayed_work(nvme_wq, &ctrl->ka_work, delay);
 }
 
-static enum rq_end_io_ret nvme_keep_alive_end_io(struct request *rq,
-                                                blk_status_t status)
+static void nvme_keep_alive_finish(struct request *rq,
+               blk_status_t status, struct nvme_ctrl *ctrl)
 {
-       struct nvme_ctrl *ctrl = rq->end_io_data;
        unsigned long flags;
        bool startka = false;
        unsigned long rtt = jiffies - (rq->deadline - rq->timeout);
                delay = 0;
        }
 
-       blk_mq_free_request(rq);
-
        if (status) {
                dev_err(ctrl->device,
                        "failed nvme_keep_alive_end_io error=%d\n",
                                status);
-               return RQ_END_IO_NONE;
+               return;
        }
 
        ctrl->ka_last_check_time = jiffies;
        spin_unlock_irqrestore(&ctrl->lock, flags);
        if (startka)
                queue_delayed_work(nvme_wq, &ctrl->ka_work, delay);
-       return RQ_END_IO_NONE;
 }
 
 static void nvme_keep_alive_work(struct work_struct *work)
                        struct nvme_ctrl, ka_work);
        bool comp_seen = ctrl->comp_seen;
        struct request *rq;
+       blk_status_t status;
 
        ctrl->ka_last_check_time = jiffies;
 
        nvme_init_request(rq, &ctrl->ka_cmd);
 
        rq->timeout = ctrl->kato * HZ;
-       rq->end_io = nvme_keep_alive_end_io;
-       rq->end_io_data = ctrl;
-       blk_execute_rq_nowait(rq, false);
+       status = blk_execute_rq(rq, false);
+       nvme_keep_alive_finish(rq, status, ctrl);
+       blk_mq_free_request(rq);
 }
 
 static void nvme_start_keep_alive(struct nvme_ctrl *ctrl)