Commit f034260d authored by Joe Eykholt's avatar Joe Eykholt Committed by James Bottomley

[SCSI] libfc: fix indefinite rport restart

Remote ports were restarting indefinitely after getting
rejects in PRLI.

Fix by adding a counter of restarts and limiting that with
the port login retry limit as well.
Signed-off-by: default avatarJoe Eykholt <jeykholt@cisco.com>
Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 4b2164d4
...@@ -257,6 +257,7 @@ static void fc_rport_work(struct work_struct *work) ...@@ -257,6 +257,7 @@ static void fc_rport_work(struct work_struct *work)
case RPORT_EV_READY: case RPORT_EV_READY:
ids = rdata->ids; ids = rdata->ids;
rdata->event = RPORT_EV_NONE; rdata->event = RPORT_EV_NONE;
rdata->major_retries = 0;
kref_get(&rdata->kref); kref_get(&rdata->kref);
mutex_unlock(&rdata->rp_mutex); mutex_unlock(&rdata->rp_mutex);
...@@ -323,7 +324,10 @@ static void fc_rport_work(struct work_struct *work) ...@@ -323,7 +324,10 @@ static void fc_rport_work(struct work_struct *work)
if (port_id == FC_FID_DIR_SERV) { if (port_id == FC_FID_DIR_SERV) {
rdata->event = RPORT_EV_NONE; rdata->event = RPORT_EV_NONE;
mutex_unlock(&rdata->rp_mutex); mutex_unlock(&rdata->rp_mutex);
} else if (rdata->flags & FC_RP_STARTED) { } else if ((rdata->flags & FC_RP_STARTED) &&
rdata->major_retries <
lport->max_rport_retry_count) {
rdata->major_retries++;
rdata->event = RPORT_EV_NONE; rdata->event = RPORT_EV_NONE;
FC_RPORT_DBG(rdata, "work restart\n"); FC_RPORT_DBG(rdata, "work restart\n");
fc_rport_enter_plogi(rdata); fc_rport_enter_plogi(rdata);
......
...@@ -189,6 +189,7 @@ struct fc_rport_libfc_priv { ...@@ -189,6 +189,7 @@ struct fc_rport_libfc_priv {
* @disc_id: The discovery identifier * @disc_id: The discovery identifier
* @maxframe_size: The maximum frame size * @maxframe_size: The maximum frame size
* @retries: The retry count for the current state * @retries: The retry count for the current state
* @major_retries: The retry count for the entire PLOGI/PRLI state machine
* @e_d_tov: Error detect timeout value (in msec) * @e_d_tov: Error detect timeout value (in msec)
* @r_a_tov: Resource allocation timeout value (in msec) * @r_a_tov: Resource allocation timeout value (in msec)
* @rp_mutex: The mutex that protects the remote port * @rp_mutex: The mutex that protects the remote port
...@@ -206,6 +207,7 @@ struct fc_rport_priv { ...@@ -206,6 +207,7 @@ struct fc_rport_priv {
u16 disc_id; u16 disc_id;
u16 maxframe_size; u16 maxframe_size;
unsigned int retries; unsigned int retries;
unsigned int major_retries;
unsigned int e_d_tov; unsigned int e_d_tov;
unsigned int r_a_tov; unsigned int r_a_tov;
struct mutex rp_mutex; struct mutex rp_mutex;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment