diff options
| author | Darren Trapp <darren.trapp@cavium.com> | 2018-03-21 02:09:38 -0400 |
|---|---|---|
| committer | Martin K. Petersen <martin.petersen@oracle.com> | 2018-03-21 18:38:54 -0400 |
| commit | 623ee824e579d234b9f68c7b28ff5ab43f7c78e5 (patch) | |
| tree | 638b7d1e206294c5292cdd9c170d10bca7148642 /drivers/scsi | |
| parent | 1cbc0efcd9bee74670d0b637f53e67c47373f544 (diff) | |
scsi: qla2xxx: Fix FC-NVMe IO abort during driver reset
Signed-off-by: Darren Trapp <darren.trapp@cavium.com>
Signed-off-by: Himanshu Madhani <himanshu.madhani@cavium.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_nvme.c | 17 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_nvme.h | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 2 |
3 files changed, 14 insertions, 7 deletions
diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c index 8c05df30c083..57275bc9fe14 100644 --- a/drivers/scsi/qla2xxx/qla_nvme.c +++ b/drivers/scsi/qla2xxx/qla_nvme.c | |||
| @@ -489,6 +489,9 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, | |||
| 489 | 489 | ||
| 490 | vha = fcport->vha; | 490 | vha = fcport->vha; |
| 491 | 491 | ||
| 492 | if (test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) | ||
| 493 | return rval; | ||
| 494 | |||
| 492 | /* | 495 | /* |
| 493 | * If we know the dev is going away while the transport is still sending | 496 | * If we know the dev is going away while the transport is still sending |
| 494 | * IO's return busy back to stall the IO Q. This happens when the | 497 | * IO's return busy back to stall the IO Q. This happens when the |
| @@ -597,14 +600,18 @@ static int qla_nvme_wait_on_command(srb_t *sp) | |||
| 597 | return ret; | 600 | return ret; |
| 598 | } | 601 | } |
| 599 | 602 | ||
| 600 | void qla_nvme_abort(struct qla_hw_data *ha, struct srb *sp) | 603 | void qla_nvme_abort(struct qla_hw_data *ha, struct srb *sp, int res) |
| 601 | { | 604 | { |
| 602 | int rval; | 605 | int rval; |
| 603 | 606 | ||
| 604 | rval = ha->isp_ops->abort_command(sp); | 607 | if (!test_bit(ABORT_ISP_ACTIVE, &sp->vha->dpc_flags)) { |
| 605 | if (!rval && !qla_nvme_wait_on_command(sp)) | 608 | rval = ha->isp_ops->abort_command(sp); |
| 606 | ql_log(ql_log_warn, NULL, 0x2112, | 609 | if (!rval && !qla_nvme_wait_on_command(sp)) |
| 607 | "nvme_wait_on_comand timed out waiting on sp=%p\n", sp); | 610 | ql_log(ql_log_warn, NULL, 0x2112, |
| 611 | "timed out waiting on sp=%p\n", sp); | ||
| 612 | } else { | ||
| 613 | sp->done(sp, res); | ||
| 614 | } | ||
| 608 | } | 615 | } |
| 609 | 616 | ||
| 610 | static void qla_nvme_unregister_remote_port(struct work_struct *work) | 617 | static void qla_nvme_unregister_remote_port(struct work_struct *work) |
diff --git a/drivers/scsi/qla2xxx/qla_nvme.h b/drivers/scsi/qla2xxx/qla_nvme.h index 8df379478269..816854ada654 100644 --- a/drivers/scsi/qla2xxx/qla_nvme.h +++ b/drivers/scsi/qla2xxx/qla_nvme.h | |||
| @@ -145,7 +145,7 @@ struct pt_ls4_rx_unsol { | |||
| 145 | void qla_nvme_register_hba(struct scsi_qla_host *); | 145 | void qla_nvme_register_hba(struct scsi_qla_host *); |
| 146 | int qla_nvme_register_remote(struct scsi_qla_host *, struct fc_port *); | 146 | int qla_nvme_register_remote(struct scsi_qla_host *, struct fc_port *); |
| 147 | void qla_nvme_delete(struct scsi_qla_host *); | 147 | void qla_nvme_delete(struct scsi_qla_host *); |
| 148 | void qla_nvme_abort(struct qla_hw_data *, struct srb *sp); | 148 | void qla_nvme_abort(struct qla_hw_data *, struct srb *sp, int res); |
| 149 | void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *, struct pt_ls4_request *, | 149 | void qla24xx_nvme_ls4_iocb(struct scsi_qla_host *, struct pt_ls4_request *, |
| 150 | struct req_que *); | 150 | struct req_que *); |
| 151 | void qla24xx_async_gffid_sp_done(void *, int); | 151 | void qla24xx_async_gffid_sp_done(void *, int); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index bd37a243c0bd..54f93f9cba48 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
| @@ -1734,7 +1734,7 @@ __qla2x00_abort_all_cmds(struct qla_qpair *qp, int res) | |||
| 1734 | sp_get(sp); | 1734 | sp_get(sp); |
| 1735 | spin_unlock_irqrestore(qp->qp_lock_ptr, | 1735 | spin_unlock_irqrestore(qp->qp_lock_ptr, |
| 1736 | flags); | 1736 | flags); |
| 1737 | qla_nvme_abort(ha, sp); | 1737 | qla_nvme_abort(ha, sp, res); |
| 1738 | spin_lock_irqsave(qp->qp_lock_ptr, | 1738 | spin_lock_irqsave(qp->qp_lock_ptr, |
| 1739 | flags); | 1739 | flags); |
| 1740 | } else if (GET_CMD_SP(sp) && | 1740 | } else if (GET_CMD_SP(sp) && |
