]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: qla2xxx: Fix re-using LoopID when handle is in use
authorQuinn Tran <quinn.tran@cavium.com>
Thu, 27 Sep 2018 05:05:14 +0000 (22:05 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 21 Nov 2018 08:19:13 +0000 (09:19 +0100)
commit 5c6400536481d9ef44ef94e7bf2c7b8e81534db7 upstream.

This patch fixes issue where driver clears NPort ID map instead of marking
handle in use. Once driver clears NPort ID from the database, it can reuse
the same NPort ID resulting in a PLOGI failure.

[mkp: fixed Himanshu's SoB]

Fixes: a084fd68e1d2 ("scsi: qla2xxx: Fix re-login for Nport Handle in use")
Cc: <stable@vger.kernel.org>
Signed-of-by: Quinn Tran <quinn.tran@cavium.com>
Reviewed-by: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Himanshu Madhani <hmadhani@cavium.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_target.c

index 286c6a0cdbaf32239efdade810dba0a9e09045ca..76ca44efa5e289f3dcd145b1bd98ef56e45bdfa5 100644 (file)
@@ -1954,25 +1954,15 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
                cid.b.rsvd_1 = 0;
 
                ql_dbg(ql_dbg_disc, vha, 0x20ec,
-                   "%s %d %8phC LoopID 0x%x in use post gnl\n",
+                   "%s %d %8phC lid %#x in use with pid %06x post gnl\n",
                    __func__, __LINE__, ea->fcport->port_name,
-                   ea->fcport->loop_id);
+                   ea->fcport->loop_id, cid.b24);
 
-               if (IS_SW_RESV_ADDR(cid)) {
-                       set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
-                       ea->fcport->loop_id = FC_NO_LOOP_ID;
-               } else {
-                       qla2x00_clear_loop_id(ea->fcport);
-               }
+               set_bit(ea->fcport->loop_id, vha->hw->loop_id_map);
+               ea->fcport->loop_id = FC_NO_LOOP_ID;
                qla24xx_post_gnl_work(vha, ea->fcport);
                break;
        case MBS_PORT_ID_USED:
-               ql_dbg(ql_dbg_disc, vha, 0x20ed,
-                   "%s %d %8phC NPortId %02x%02x%02x inuse post gidpn\n",
-                   __func__, __LINE__, ea->fcport->port_name,
-                   ea->fcport->d_id.b.domain, ea->fcport->d_id.b.area,
-                   ea->fcport->d_id.b.al_pa);
-
                lid = ea->iop[1] & 0xffff;
                qlt_find_sess_invalidate_other(vha,
                    wwn_to_u64(ea->fcport->port_name),
index 8c811b251d4289c73bc4d2691f1a154e3187b7a8..d2888b30a8a3b965a4e1ae0ab9f18f134a43ade7 100644 (file)
@@ -1261,7 +1261,8 @@ void qlt_schedule_sess_for_deletion(struct fc_port *sess)
        qla24xx_chk_fcp_state(sess);
 
        ql_dbg(ql_dbg_tgt, sess->vha, 0xe001,
-           "Scheduling sess %p for deletion\n", sess);
+           "Scheduling sess %p for deletion %8phC\n",
+           sess, sess->port_name);
 
        INIT_WORK(&sess->del_work, qla24xx_delete_sess_fn);
        WARN_ON(!queue_work(sess->vha->hw->wq, &sess->del_work));