]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: qla2xxx: Fix disk failure to rediscover
authorQuinn Tran <qutran@marvell.com>
Thu, 10 Mar 2022 09:25:53 +0000 (01:25 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 15 Mar 2022 04:29:13 +0000 (00:29 -0400)
User experienced some of the LUN failed to get rediscovered after long
cable pull test. The issue is triggered by a race condition between driver
setting session online state vs starting the LUN scan process at the same
time. Current code set the online state after notifying the session is
available. In this case, trigger to start the LUN scan process happened
before driver could set the session in online state.  LUN scan ends up with
failure due to the session online check was failing.

Set the online state before reporting of the availability of the session.

Link: https://lore.kernel.org/r/20220310092604.22950-3-njavali@marvell.com
Fixes: 5911f2d97b07 ("scsi: qla2xxx: Fix Remote port registration")
Cc: stable@vger.kernel.org
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_init.c
drivers/scsi/qla2xxx/qla_nvme.c

index 2f3a3cd31bd62a608b068fd4a99b1e604e0539f9..e468b05f90c08342e3c1236d0f7f7153e1b15f03 100644 (file)
@@ -5758,6 +5758,8 @@ qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
        if (atomic_read(&fcport->state) == FCS_ONLINE)
                return;
 
+       qla2x00_set_fcport_state(fcport, FCS_ONLINE);
+
        rport_ids.node_name = wwn_to_u64(fcport->node_name);
        rport_ids.port_name = wwn_to_u64(fcport->port_name);
        rport_ids.port_id = fcport->d_id.b.domain << 16 |
@@ -5858,6 +5860,7 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
                qla2x00_reg_remote_port(vha, fcport);
                break;
        case MODE_TARGET:
+               qla2x00_set_fcport_state(fcport, FCS_ONLINE);
                if (!vha->vha_tgt.qla_tgt->tgt_stop &&
                        !vha->vha_tgt.qla_tgt->tgt_stopped)
                        qlt_fc_port_added(vha, fcport);
@@ -5875,8 +5878,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
        if (NVME_TARGET(vha->hw, fcport))
                qla_nvme_register_remote(vha, fcport);
 
-       qla2x00_set_fcport_state(fcport, FCS_ONLINE);
-
        if (IS_IIDMA_CAPABLE(vha->hw) && vha->hw->flags.gpsc_supported) {
                if (fcport->id_changed) {
                        fcport->id_changed = 0;
index 718c761ff5f81387c736df9d32419e83baab9b26..5723082d94d6ea386aacbfdd4ce74c49a1bd2b53 100644 (file)
@@ -37,6 +37,11 @@ int qla_nvme_register_remote(struct scsi_qla_host *vha, struct fc_port *fcport)
                (fcport->nvme_flag & NVME_FLAG_REGISTERED))
                return 0;
 
+       if (atomic_read(&fcport->state) == FCS_ONLINE)
+               return 0;
+
+       qla2x00_set_fcport_state(fcport, FCS_ONLINE);
+
        fcport->nvme_flag &= ~NVME_FLAG_RESETTING;
 
        memset(&req, 0, sizeof(struct nvme_fc_port_info));