scsi: qla2xxx: edif: Fix slow session teardown
authorQuinn Tran <qutran@marvell.com>
Wed, 8 Jun 2022 11:58:48 +0000 (04:58 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 10 Jun 2022 17:04:05 +0000 (13:04 -0400)
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>
drivers/scsi/qla2xxx/qla_isr.c

index 8e6831953e7c65c787a4f912f60c16961da7b435..d87c53bc014bbc1201d391bd93116c03e14b91af 100644 (file)
@@ -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;