|
@@ -831,6 +831,8 @@ static int nvme_submit_user_cmd(struct request_queue *q,
|
|
|
static void nvme_keep_alive_end_io(struct request *rq, blk_status_t status)
|
|
|
{
|
|
|
struct nvme_ctrl *ctrl = rq->end_io_data;
|
|
|
+ unsigned long flags;
|
|
|
+ bool startka = false;
|
|
|
|
|
|
blk_mq_free_request(rq);
|
|
|
|
|
@@ -841,7 +843,13 @@ static void nvme_keep_alive_end_io(struct request *rq, blk_status_t status)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ);
|
|
|
+ spin_lock_irqsave(&ctrl->lock, flags);
|
|
|
+ if (ctrl->state == NVME_CTRL_LIVE ||
|
|
|
+ ctrl->state == NVME_CTRL_CONNECTING)
|
|
|
+ startka = true;
|
|
|
+ spin_unlock_irqrestore(&ctrl->lock, flags);
|
|
|
+ if (startka)
|
|
|
+ schedule_delayed_work(&ctrl->ka_work, ctrl->kato * HZ);
|
|
|
}
|
|
|
|
|
|
static int nvme_keep_alive(struct nvme_ctrl *ctrl)
|