]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/nvme/host/tcp.c
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux.git] / drivers / nvme / host / tcp.c
index 7544be84ab3582e27ded19298b45960ce3460d96..49d4373b84eb392531d7ce6f60099a41c042907d 100644 (file)
@@ -422,7 +422,7 @@ static void nvme_tcp_error_recovery(struct nvme_ctrl *ctrl)
        if (!nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
                return;
 
-       queue_work(nvme_wq, &to_tcp_ctrl(ctrl)->err_work);
+       queue_work(nvme_reset_wq, &to_tcp_ctrl(ctrl)->err_work);
 }
 
 static int nvme_tcp_process_nvme_cqe(struct nvme_tcp_queue *queue,
@@ -491,8 +491,8 @@ static int nvme_tcp_handle_comp(struct nvme_tcp_queue *queue,
         * aborts.  We don't even bother to allocate a struct request
         * for them but rather special case them here.
         */
-       if (unlikely(nvme_tcp_queue_id(queue) == 0 &&
-           cqe->command_id >= NVME_AQ_BLK_MQ_DEPTH))
+       if (unlikely(nvme_is_aen_req(nvme_tcp_queue_id(queue),
+                                    cqe->command_id)))
                nvme_complete_async_event(&queue->ctrl->ctrl, cqe->status,
                                &cqe->result);
        else
@@ -1054,7 +1054,12 @@ static void nvme_tcp_io_work(struct work_struct *w)
                } else if (unlikely(result < 0)) {
                        dev_err(queue->ctrl->ctrl.device,
                                "failed to send request %d\n", result);
-                       if (result != -EPIPE)
+
+                       /*
+                        * Fail the request unless peer closed the connection,
+                        * in which case error recovery flow will complete all.
+                        */
+                       if ((result != -EPIPE) && (result != -ECONNRESET))
                                nvme_tcp_fail_request(queue->request);
                        nvme_tcp_done_send_req(queue);
                        return;