aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/libfc/fc_rport.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
index 04e9846ad1b5..dc97c603744f 100644
--- a/drivers/scsi/libfc/fc_rport.c
+++ b/drivers/scsi/libfc/fc_rport.c
@@ -1340,6 +1340,8 @@ static void fc_rport_recv_logo_req(struct fc_lport *lport,
1340 struct fc_rport_priv *rdata; 1340 struct fc_rport_priv *rdata;
1341 u32 sid; 1341 u32 sid;
1342 1342
1343 lport->tt.seq_els_rsp_send(sp, ELS_LS_ACC, NULL);
1344
1343 fh = fc_frame_header_get(fp); 1345 fh = fc_frame_header_get(fp);
1344 sid = ntoh24(fh->fh_s_id); 1346 sid = ntoh24(fh->fh_s_id);
1345 1347
@@ -1349,13 +1351,20 @@ static void fc_rport_recv_logo_req(struct fc_lport *lport,
1349 mutex_lock(&rdata->rp_mutex); 1351 mutex_lock(&rdata->rp_mutex);
1350 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n", 1352 FC_RPORT_DBG(rdata, "Received LOGO request while in state %s\n",
1351 fc_rport_state(rdata)); 1353 fc_rport_state(rdata));
1352 fc_rport_enter_delete(rdata, RPORT_EV_LOGO); 1354
1355 /*
1356 * If the remote port was created due to discovery,
1357 * log back in. It may have seen a stale RSCN about us.
1358 */
1359 if (rdata->rp_state != RPORT_ST_DELETE && rdata->disc_id)
1360 fc_rport_enter_plogi(rdata);
1361 else
1362 fc_rport_enter_delete(rdata, RPORT_EV_LOGO);
1353 mutex_unlock(&rdata->rp_mutex); 1363 mutex_unlock(&rdata->rp_mutex);
1354 } else 1364 } else
1355 FC_RPORT_ID_DBG(lport, sid, 1365 FC_RPORT_ID_DBG(lport, sid,
1356 "Received LOGO from non-logged-in port\n"); 1366 "Received LOGO from non-logged-in port\n");
1357 mutex_unlock(&lport->disc.disc_mutex); 1367 mutex_unlock(&lport->disc.disc_mutex);
1358 lport->tt.seq_els_rsp_send(sp, ELS_LS_ACC, NULL);
1359 fc_frame_free(fp); 1368 fc_frame_free(fp);
1360} 1369}
1361 1370