Commit 8acf1b50 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi: libfc: Return LS_RJT_BUSY for PRLI in status PLOGI

Occasionally it might happen that we receive a PRLI while we're still
waiting for our PLOGI response. In that case we should return
'busy' LS status instead of 'plogi required' LS status.
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 386b97b4
...@@ -1705,6 +1705,15 @@ static void fc_rport_recv_els_req(struct fc_lport *lport, struct fc_frame *fp) ...@@ -1705,6 +1705,15 @@ static void fc_rport_recv_els_req(struct fc_lport *lport, struct fc_frame *fp)
case RPORT_ST_READY: case RPORT_ST_READY:
case RPORT_ST_ADISC: case RPORT_ST_ADISC:
break; break;
case RPORT_ST_PLOGI:
if (fc_frame_payload_op(fp) == ELS_PRLI) {
FC_RPORT_DBG(rdata, "Reject ELS PRLI "
"while in state %s\n",
fc_rport_state(rdata));
mutex_unlock(&rdata->rp_mutex);
kref_put(&rdata->kref, lport->tt.rport_destroy);
goto busy;
}
default: default:
FC_RPORT_DBG(rdata, FC_RPORT_DBG(rdata,
"Reject ELS 0x%02x while in state %s\n", "Reject ELS 0x%02x while in state %s\n",
...@@ -1752,6 +1761,14 @@ static void fc_rport_recv_els_req(struct fc_lport *lport, struct fc_frame *fp) ...@@ -1752,6 +1761,14 @@ static void fc_rport_recv_els_req(struct fc_lport *lport, struct fc_frame *fp)
els_data.explan = ELS_EXPL_PLOGI_REQD; els_data.explan = ELS_EXPL_PLOGI_REQD;
lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &els_data); lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &els_data);
fc_frame_free(fp); fc_frame_free(fp);
return;
busy:
els_data.reason = ELS_RJT_BUSY;
els_data.explan = ELS_EXPL_NONE;
lport->tt.seq_els_rsp_send(fp, ELS_LS_RJT, &els_data);
fc_frame_free(fp);
return;
} }
/** /**
......
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