scsi: qla2xxx: edif: Fix slow session teardown
User experience slow recovery when target device went through a stop/start of the authentication application (app_stop/app_start). Between the period of app_stop and app_start on the target device, target device choose to send ELS Reject for any receive AUTH ELS command. At this time, authentication application does not do ELS reject if it encounters error. Therefore, AUTH ELS reject signify authentication application is not running. If driver passes up the AUTH ELS Reject to the authentication application, then it would result in authentication application retrying/resending the same AUTH ELS command again + delay. As a work around, driver should trigger a session tear down where it tells the local authentication application to also tear down. At the next relogin, both sides are then synchronized. Link: https://lore.kernel.org/r/20220608115849.16693-10-njavali@marvell.com Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Quinn Tran <qutran@marvell.com> Signed-off-by: Nilesh Javali <njavali@marvell.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
37be3f9d69
commit
bcf536072f
@ -2245,9 +2245,9 @@ qla24xx_els_ct_entry(scsi_qla_host_t *v, struct req_que *req,
|
||||
res = DID_ERROR << 16;
|
||||
}
|
||||
|
||||
if (logit) {
|
||||
if (sp->remap.remapped &&
|
||||
((u8 *)sp->remap.rsp.buf)[0] == ELS_LS_RJT) {
|
||||
if (sp->remap.remapped &&
|
||||
((u8 *)sp->remap.rsp.buf)[0] == ELS_LS_RJT) {
|
||||
if (logit) {
|
||||
ql_dbg(ql_dbg_user, vha, 0x503f,
|
||||
"%s IOCB Done LS_RJT hdl=%x comp_status=0x%x\n",
|
||||
type, sp->handle, comp_status);
|
||||
@ -2259,18 +2259,24 @@ qla24xx_els_ct_entry(scsi_qla_host_t *v, struct req_que *req,
|
||||
pkt)->total_byte_count),
|
||||
e->s_id[0], e->s_id[2], e->s_id[1],
|
||||
e->d_id[2], e->d_id[1], e->d_id[0]);
|
||||
} else {
|
||||
ql_log(ql_log_info, vha, 0x503f,
|
||||
"%s IOCB Done hdl=%x comp_status=0x%x\n",
|
||||
type, sp->handle, comp_status);
|
||||
ql_log(ql_log_info, vha, 0x503f,
|
||||
"subcode 1=0x%x subcode 2=0x%x bytes=0x%x %02x%02x%02x -> %02x%02x%02x\n",
|
||||
fw_status[1], fw_status[2],
|
||||
le32_to_cpu(((struct els_sts_entry_24xx *)
|
||||
pkt)->total_byte_count),
|
||||
e->s_id[0], e->s_id[2], e->s_id[1],
|
||||
e->d_id[2], e->d_id[1], e->d_id[0]);
|
||||
}
|
||||
if (sp->fcport && sp->fcport->flags & FCF_FCSP_DEVICE &&
|
||||
sp->type == SRB_ELS_CMD_HST_NOLOGIN) {
|
||||
ql_dbg(ql_dbg_edif, vha, 0x911e,
|
||||
"%s rcv reject. Sched delete\n", __func__);
|
||||
qlt_schedule_sess_for_deletion(sp->fcport);
|
||||
}
|
||||
} else if (logit) {
|
||||
ql_log(ql_log_info, vha, 0x503f,
|
||||
"%s IOCB Done hdl=%x comp_status=0x%x\n",
|
||||
type, sp->handle, comp_status);
|
||||
ql_log(ql_log_info, vha, 0x503f,
|
||||
"subcode 1=0x%x subcode 2=0x%x bytes=0x%x %02x%02x%02x -> %02x%02x%02x\n",
|
||||
fw_status[1], fw_status[2],
|
||||
le32_to_cpu(((struct els_sts_entry_24xx *)
|
||||
pkt)->total_byte_count),
|
||||
e->s_id[0], e->s_id[2], e->s_id[1],
|
||||
e->d_id[2], e->d_id[1], e->d_id[0]);
|
||||
}
|
||||
}
|
||||
goto els_ct_done;
|
||||
|
Loading…
x
Reference in New Issue
Block a user