]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
scsi: libfc: don't advance state machine for incoming FLOGI
authorHannes Reinecke <hare@suse.de>
Fri, 30 Sep 2016 09:01:19 +0000 (11:01 +0200)
committerBrian Maly <brian.maly@oracle.com>
Sun, 12 May 2019 01:53:03 +0000 (21:53 -0400)
When we receive an FLOGI but have already sent our own we should
not advance the state machine but rather wait for our FLOGI to
return before continuing with PLOGI.

Orabug: 25933179

Reviewed-by: John Sobecki <john.sobecki@oracle.com>
Signed-off-by: Hannes Reinecke <hare@suse.com>
Acked-by: Johannes Thumshirn <jth@kernel.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Rajan Shanmugavelu <rajan.shanmugavelu@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
drivers/scsi/libfc/fc_rport.c

index 72a7183fdd06d8243b8f42ca824461aba74a34b2..4b9bb6dd4004433bf5adf80880fe38cfc25f5af3 100644 (file)
@@ -765,8 +765,10 @@ static void fc_rport_flogi_resp(struct fc_seq *sp, struct fc_frame *fp,
                goto bad;
 
        flogi = fc_frame_payload_get(fp, sizeof(*flogi));
-       if (!flogi)
+       if (!flogi) {
+               FC_RPORT_DBG(rdata, "Bad FLOGI response\n");
                goto bad;
+       }
        r_a_tov = ntohl(flogi->fl_csp.sp_r_a_tov);
        if (r_a_tov > rdata->r_a_tov)
                rdata->r_a_tov = r_a_tov;
@@ -783,7 +785,6 @@ put:
        kref_put(&rdata->kref, lport->tt.rport_destroy);
        return;
 bad:
-       FC_RPORT_DBG(rdata, "Bad FLOGI response\n");
        fc_rport_error_retry(rdata, fp);
        goto out;
 }
@@ -925,10 +926,17 @@ static void fc_rport_recv_flogi_req(struct fc_lport *lport,
        fc_fill_reply_hdr(fp, rx_fp, FC_RCTL_ELS_REP, 0);
        lport->tt.frame_send(lport, fp);
 
-       if (rdata->ids.port_name < lport->wwpn)
-               fc_rport_enter_plogi(rdata);
-       else
-               fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT);
+       /*
+        * Do not proceed with the state machine if our
+        * FLOGI has crossed with an FLOGI from the
+        * remote port; wait for the FLOGI response instead.
+        */
+       if (rdata->rp_state != RPORT_ST_FLOGI) {
+               if (rdata->ids.port_name < lport->wwpn)
+                       fc_rport_enter_plogi(rdata);
+               else
+                       fc_rport_state_enter(rdata, RPORT_ST_PLOGI_WAIT);
+       }
 out:
        mutex_unlock(&rdata->rp_mutex);
        kref_put(&rdata->kref, lport->tt.rport_destroy);