| From 4897ed66380560a6888becbc594a0d7e6632ab83 Mon Sep 17 00:00:00 2001 |
| From: Quinn Tran <qutran@marvell.com> |
| Date: Mon, 25 Nov 2019 19:56:51 +0300 |
| Subject: [PATCH] scsi: qla2xxx: Use explicit LOGO in target mode |
| |
| commit 86196a8fa8a84af1395a28ea0548f2ce6ae9bc22 upstream. |
| |
| Target makes implicit LOGO on session teardown. LOGO ELS is not send on the |
| wire and initiator is not aware that target no longer wants talking to |
| it. Initiator keeps sending I/O requests, target responds with BA_RJT, they |
| time out and then initiator sends ABORT TASK (ABTS-LS). |
| |
| Current behaviour incurs unneeded I/O timeout and can be fixed for some |
| initiators by making explicit LOGO on session deletion. |
| |
| Link: https://lore.kernel.org/r/20191125165702.1013-3-r.bolshakov@yadro.com |
| Reviewed-by: Hannes Reinecke <hare@suse.de> |
| Tested-by: Hannes Reinecke <hare@suse.de> |
| Signed-off-by: Quinn Tran <qutran@marvell.com> |
| Signed-off-by: Himanshu Madhani <hmadhani@marvell.com> |
| Signed-off-by: Roman Bolshakov <r.bolshakov@yadro.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h |
| index 1a4095c56eee..b3dd0e980156 100644 |
| --- a/drivers/scsi/qla2xxx/qla_def.h |
| +++ b/drivers/scsi/qla2xxx/qla_def.h |
| @@ -2335,6 +2335,7 @@ typedef struct fc_port { |
| unsigned int query:1; |
| unsigned int id_changed:1; |
| unsigned int scan_needed:1; |
| + unsigned int explicit_logout:1; |
| |
| struct work_struct nvme_del_work; |
| struct completion nvme_del_done; |
| diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c |
| index 9312b19ed708..6906bbcf5492 100644 |
| --- a/drivers/scsi/qla2xxx/qla_iocb.c |
| +++ b/drivers/scsi/qla2xxx/qla_iocb.c |
| @@ -2441,11 +2441,19 @@ qla2x00_login_iocb(srb_t *sp, struct mbx_entry *mbx) |
| static void |
| qla24xx_logout_iocb(srb_t *sp, struct logio_entry_24xx *logio) |
| { |
| + u16 control_flags = LCF_COMMAND_LOGO; |
| logio->entry_type = LOGINOUT_PORT_IOCB_TYPE; |
| - logio->control_flags = |
| - cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); |
| - if (!sp->fcport->keep_nport_handle) |
| - logio->control_flags |= cpu_to_le16(LCF_FREE_NPORT); |
| + |
| + if (sp->fcport->explicit_logout) { |
| + control_flags |= LCF_EXPL_LOGO|LCF_FREE_NPORT; |
| + } else { |
| + control_flags |= LCF_IMPL_LOGO; |
| + |
| + if (!sp->fcport->keep_nport_handle) |
| + control_flags |= LCF_FREE_NPORT; |
| + } |
| + |
| + logio->control_flags = cpu_to_le16(control_flags); |
| logio->nport_handle = cpu_to_le16(sp->fcport->loop_id); |
| logio->port_id[0] = sp->fcport->d_id.b.al_pa; |
| logio->port_id[1] = sp->fcport->d_id.b.area; |
| diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c |
| index bb4f3d51a305..1d410444f4e7 100644 |
| --- a/drivers/scsi/qla2xxx/qla_target.c |
| +++ b/drivers/scsi/qla2xxx/qla_target.c |
| @@ -1099,6 +1099,7 @@ void qlt_free_session_done(struct work_struct *work) |
| } |
| } |
| |
| + sess->explicit_logout = 0; |
| spin_unlock_irqrestore(&ha->tgt.sess_lock, flags); |
| |
| ql_dbg(ql_dbg_tgt_mgt, vha, 0xf001, |
| diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c |
| index 8c6354037686..91b65fc17f19 100644 |
| --- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c |
| +++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c |
| @@ -350,6 +350,7 @@ static void tcm_qla2xxx_close_session(struct se_session *se_sess) |
| target_sess_cmd_list_set_waiting(se_sess); |
| spin_unlock_irqrestore(&vha->hw->tgt.sess_lock, flags); |
| |
| + sess->explicit_logout = 1; |
| tcm_qla2xxx_put_sess(sess); |
| } |
| |
| -- |
| 2.7.4 |
| |