On 7/12/10 6:27 PM, Bhanu Gollapudi wrote:
> Call fc_lport_error to retry upto max retry count when
> FLOGI/SCR/NS gets rejected.
>
> Signed-off-by: Bhanu Prakash Gollapudi<[email protected]>
> ---
> drivers/scsi/libfc/fc_lport.c | 70
> ++++++++++++++++++++++------------------
> 1 files changed, 38 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
> index 6ef7b94..ba081ca 100644
> --- a/drivers/scsi/libfc/fc_lport.c
> +++ b/drivers/scsi/libfc/fc_lport.c
> @@ -1032,36 +1032,37 @@ static void fc_lport_error(struct fc_lport *lport,
> struct fc_frame *fp)
> PTR_ERR(fp), fc_lport_state(lport),
> lport->retry_count);
>
> - if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
> - /*
> - * Memory allocation failure, or the exchange timed out.
> - * Retry after delay
> - */
> - if (lport->retry_count< lport->max_retry_count) {
> - lport->retry_count++;
> - if (!fp)
> - delay = msecs_to_jiffies(500);
> - else
> - delay = msecs_to_jiffies(lport->e_d_tov);
> -
> - schedule_delayed_work(&lport->retry_work, delay);
> - } else {
> - switch (lport->state) {
> - case LPORT_ST_DISABLED:
> - case LPORT_ST_READY:
> - case LPORT_ST_RESET:
> - case LPORT_ST_RNN_ID:
> - case LPORT_ST_RSNN_NN:
> - case LPORT_ST_RSPN_ID:
> - case LPORT_ST_RFT_ID:
> - case LPORT_ST_RFF_ID:
> - case LPORT_ST_SCR:
> - case LPORT_ST_DNS:
> - case LPORT_ST_FLOGI:
> - case LPORT_ST_LOGO:
> - fc_lport_enter_reset(lport);
> - break;
> - }
> + if (PTR_ERR(fp) == -FC_EX_CLOSED)
> + return;
> +
> + /*
> + * Memory allocation failure, or the exchange timed out.
Comment should also mention we may have been rejected.
Or just delete the comment.
> + * Retry after delay
> + */
> + if (lport->retry_count< lport->max_retry_count) {
> + lport->retry_count++;
> + if (!fp)
> + delay = msecs_to_jiffies(500);
> + else
> + delay = msecs_to_jiffies(lport->e_d_tov);
> +
> + schedule_delayed_work(&lport->retry_work, delay);
> + } else {
> + switch (lport->state) {
> + case LPORT_ST_DISABLED:
> + case LPORT_ST_READY:
> + case LPORT_ST_RESET:
> + case LPORT_ST_RNN_ID:
> + case LPORT_ST_RSNN_NN:
> + case LPORT_ST_RSPN_ID:
> + case LPORT_ST_RFT_ID:
> + case LPORT_ST_RFF_ID:
> + case LPORT_ST_SCR:
> + case LPORT_ST_DNS:
> + case LPORT_ST_FLOGI:
> + case LPORT_ST_LOGO:
> + fc_lport_enter_reset(lport);
Since we do this in every case, we could just delete the switch
statement.
> + break;
> }
> }
> }
> @@ -1478,7 +1479,12 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct
> fc_frame *fp,
>
> fh = fc_frame_header_get(fp);
> did = ntoh24(fh->fh_d_id);
> - if (fc_frame_payload_op(fp) == ELS_LS_ACC&& did != 0) {
> + if (!did) {
> + FC_LPORT_DBG(lport, "Bad FLOGI response\n");
> + goto out;
> + }
> +
> + if (fc_frame_payload_op(fp) == ELS_LS_ACC) {
> flp = fc_frame_payload_get(fp, sizeof(*flp));
> if (flp) {
> mfs = ntohs(flp->fl_csp.sp_bb_data)&
> @@ -1518,7 +1524,7 @@ void fc_lport_flogi_resp(struct fc_seq *sp, struct
> fc_frame *fp,
> }
> }
> } else {
> - FC_LPORT_DBG(lport, "Bad FLOGI response\n");
> + fc_lport_error(lport, fp);
> }
>
> out:
_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel