]> git.ipfire.org Git - thirdparty/kernel/stable.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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 8 Apr 2022 12:06:45 +0000 (14:06 +0200)
commit 6a45c8e137d4e2c72eecf1ac7cf64f2fdfcead99 upstream.

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: aecf043443d3 ("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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_nvme.c

index ae796254efe18dae7b9e233aa783cd4b4f485421..b47b71f0425bfb40a7f5ee57ba9f1111e62c4501 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 |
@@ -5865,6 +5867,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);
@@ -5879,8 +5882,6 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
                break;
        }
 
-       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 138ffdb5c92cdc3530749d6f2e940af4ebdf65ab..074ed6fd514ec0024e847f7c88bbdef95b52a5a3 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));