diff options
Diffstat (limited to 'drivers/nvme/host/tcp.c')
| -rw-r--r-- | drivers/nvme/host/tcp.c | 11 | 
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 4ceb28675fdf..891a36d02e7c 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -913,7 +913,15 @@ static inline void nvme_tcp_done_send_req(struct nvme_tcp_queue *queue)  static void nvme_tcp_fail_request(struct nvme_tcp_request *req)  { -	nvme_tcp_end_request(blk_mq_rq_from_pdu(req), NVME_SC_HOST_PATH_ERROR); +	if (nvme_tcp_async_req(req)) { +		union nvme_result res = {}; + +		nvme_complete_async_event(&req->queue->ctrl->ctrl, +				cpu_to_le16(NVME_SC_HOST_PATH_ERROR), &res); +	} else { +		nvme_tcp_end_request(blk_mq_rq_from_pdu(req), +				NVME_SC_HOST_PATH_ERROR); +	}  }  static int nvme_tcp_try_send_data(struct nvme_tcp_request *req) @@ -2096,6 +2104,7 @@ static void nvme_tcp_error_recovery_work(struct work_struct *work)  	struct nvme_ctrl *ctrl = &tcp_ctrl->ctrl;  	nvme_stop_keep_alive(ctrl); +	flush_work(&ctrl->async_event_work);  	nvme_tcp_teardown_io_queues(ctrl, false);  	/* unquiesce to fail fast pending requests */  	nvme_start_queues(ctrl);  |