scsi: qla2xxx: Check if port is online before sending ELS
authorShreyas Deodhar <sdeodhar@marvell.com>
Mon, 19 Dec 2022 11:07:38 +0000 (03:07 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 12 Jan 2023 02:28:37 +0000 (21:28 -0500)
CT Ping and ELS cmds fail for NVMe targets.  Check if port is online before
sending ELS instead of sending login.

Cc: stable@vger.kernel.org
Signed-off-by: Shreyas Deodhar <sdeodhar@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/qla2xxx/qla_bsg.c

index cd75b17..dba7bba 100644 (file)
@@ -278,8 +278,8 @@ qla2x00_process_els(struct bsg_job *bsg_job)
        const char *type;
        int req_sg_cnt, rsp_sg_cnt;
        int rval =  (DID_ERROR << 16);
-       uint16_t nextlid = 0;
        uint32_t els_cmd = 0;
+       int qla_port_allocated = 0;
 
        if (bsg_request->msgcode == FC_BSG_RPT_ELS) {
                rport = fc_bsg_to_rport(bsg_job);
@@ -329,9 +329,9 @@ qla2x00_process_els(struct bsg_job *bsg_job)
                /* make sure the rport is logged in,
                 * if not perform fabric login
                 */
-               if (qla2x00_fabric_login(vha, fcport, &nextlid)) {
+               if (atomic_read(&fcport->state) != FCS_ONLINE) {
                        ql_dbg(ql_dbg_user, vha, 0x7003,
-                           "Failed to login port %06X for ELS passthru.\n",
+                           "Port %06X is not online for ELS passthru.\n",
                            fcport->d_id.b24);
                        rval = -EIO;
                        goto done;
@@ -348,6 +348,7 @@ qla2x00_process_els(struct bsg_job *bsg_job)
                        goto done;
                }
 
+               qla_port_allocated = 1;
                /* Initialize all required  fields of fcport */
                fcport->vha = vha;
                fcport->d_id.b.al_pa =
@@ -432,7 +433,7 @@ done_unmap_sg:
        goto done_free_fcport;
 
 done_free_fcport:
-       if (bsg_request->msgcode != FC_BSG_RPT_ELS)
+       if (qla_port_allocated)
                qla2x00_free_fcport(fcport);
 done:
        return rval;