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

Reply via email to