Commit 0b4aafc3 authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen
Browse files

scsi: libfc: retry PRLI if we cannot analyse the payload



When we fail to analyse the payload of a PRLI response we should reset
the state machine to retry the PRLI; eventually we will be getting a
proper frame.  Not doing so will result in a stuck state machine and the
port never to be presented to the systsm.

Suggested-by: default avatarChad Dupuis <chad.dupuis@cavium.com>
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarArun Easi <arun.easi@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent aad1271a
Loading
Loading
Loading
Loading
+6 −2
Original line number Original line Diff line number Diff line
@@ -1161,8 +1161,10 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,
	op = fc_frame_payload_op(fp);
	op = fc_frame_payload_op(fp);
	if (op == ELS_LS_ACC) {
	if (op == ELS_LS_ACC) {
		pp = fc_frame_payload_get(fp, sizeof(*pp));
		pp = fc_frame_payload_get(fp, sizeof(*pp));
		if (!pp)
		if (!pp) {
			fc_rport_error_retry(rdata, -FC_EX_SEQ_ERR);
			goto out;
			goto out;
		}


		resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
		resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
		FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x spp_type 0x%x\n",
		FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x spp_type 0x%x\n",
@@ -1175,8 +1177,10 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct fc_frame *fp,
				fc_rport_error_retry(rdata, -FC_EX_SEQ_ERR);
				fc_rport_error_retry(rdata, -FC_EX_SEQ_ERR);
			goto out;
			goto out;
		}
		}
		if (pp->prli.prli_spp_len < sizeof(pp->spp))
		if (pp->prli.prli_spp_len < sizeof(pp->spp)) {
			fc_rport_error_retry(rdata, -FC_EX_SEQ_ERR);
			goto out;
			goto out;
		}


		fcp_parm = ntohl(pp->spp.spp_params);
		fcp_parm = ntohl(pp->spp.spp_params);
		if (fcp_parm & FCP_SPPF_RETRY)
		if (fcp_parm & FCP_SPPF_RETRY)