[Open-FCoE] [PATCH 1/2] libfc: modified fc_seq_exch_abort() to accept timeout value for abort.

Mike Christie michaelc at cs.wisc.edu
Tue Sep 2 14:54:58 UTC 2008


Vasu Dev wrote:
> This will give flexibility to callers to set timeout value for abort.
> The caller may have its own recovery mechanism, in that case this will
> allow caller to set no timeout for abort, in turn no -FC_EX_TIMEOUT error
> to caller in that case if no response to abort.
> 
> The fc_fcp_error() doesn't need this timeout error and neither
> current fc_exch.c code posts timeout error to fc_fcp_error() using
> additional checks in fc_exch_timeout(). The fc_exch_timeout() will be
> fixed in next patch.
> 
> Changed timeout value for abort recovery to 2 times of R_A_TOV as per
> FCP-4 sec 12.3.2.

Sorry for the late reply. I did not work for once :)

This looks ok to me. Thanks.


> 
> Signed-off-by: Vasu Dev <vasu.dev at intel.com>
> ---
> 
>  drivers/scsi/libfc/fc_exch.c |   12 ++++--------
>  drivers/scsi/libfc/fc_fcp.c  |    2 +-
>  include/scsi/libfc/libfc.h   |   16 +++++++++++-----
>  3 files changed, 16 insertions(+), 14 deletions(-)
> 
> 
> diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
> index b7f44c2..270cbac 100644
> --- a/drivers/scsi/libfc/fc_exch.c
> +++ b/drivers/scsi/libfc/fc_exch.c
> @@ -332,12 +332,7 @@ static void fc_exch_timer_set(struct fc_exch *ep, unsigned int timer_msec)
>  	spin_unlock_bh(&ep->ex_lock);
>  }
>  
> -/*
> - * Abort the exchange for a sequence due to timeout or an upper-level abort.
> - * Called without the exchange manager em_lock held.
> - * Returns non-zero if a sequence could not be allocated.
> - */
> -int fc_seq_exch_abort(const struct fc_seq *req_sp)
> +int fc_seq_exch_abort(const struct fc_seq *req_sp, unsigned int timer_msec)
>  {
>  	struct fc_seq *sp;
>  	struct fc_exch *ep;
> @@ -364,7 +359,8 @@ int fc_seq_exch_abort(const struct fc_seq *req_sp)
>  
>  	sp->f_ctl |= FC_FC_SEQ_INIT;
>  	ep->esb_stat |= ESB_ST_SEQ_INIT | ESB_ST_ABNORMAL;
> -	fc_exch_timer_set_locked(ep, ep->r_a_tov);
> +	if (timer_msec)
> +		fc_exch_timer_set_locked(ep, timer_msec);
>  	spin_unlock_bh(&ep->ex_lock);
>  
>  	/*
> @@ -422,7 +418,7 @@ static void fc_exch_timeout(unsigned long ep_arg)
>  		spin_unlock_bh(&ep->ex_lock);
>  		if (resp)
>  			resp(sp, ERR_PTR(-FC_EX_TIMEOUT), arg);
> -		fc_seq_exch_abort(sp);
> +		fc_seq_exch_abort(sp, 2 * ep->r_a_tov);
>  		goto done;
>  	}
>  unlock:
> diff --git a/drivers/scsi/libfc/fc_fcp.c b/drivers/scsi/libfc/fc_fcp.c
> index e974ce1..9402eba 100644
> --- a/drivers/scsi/libfc/fc_fcp.c
> +++ b/drivers/scsi/libfc/fc_fcp.c
> @@ -279,7 +279,7 @@ static int fc_fcp_send_abort(struct fc_fcp_pkt *fsp)
>  		return -EINVAL;
>  
>  	fsp->state |= FC_SRB_ABORT_PENDING;
> -	return fsp->lp->tt.seq_exch_abort(fsp->seq_ptr);
> +	return fsp->lp->tt.seq_exch_abort(fsp->seq_ptr, 0);
>  }
>  
>  /*
> diff --git a/include/scsi/libfc/libfc.h b/include/scsi/libfc/libfc.h
> index de68c44..104e2a6 100644
> --- a/include/scsi/libfc/libfc.h
> +++ b/include/scsi/libfc/libfc.h
> @@ -253,9 +253,14 @@ struct libfc_function_template {
>  
>  	/*
>  	 * Abort an exchange and sequence. Generally called because of a
> -	 * timeout or an abort from the upper layer.
> +	 * exchange timeout or an abort from the upper layer.
> +	 *
> +	 * A timer_msec can be specified for abort timeout, if non-zero
> +	 * timer_msec value is specified then exchange resp handler
> +	 * will be called with timeout error if no response to abort.
>  	 */
> -	int (*seq_exch_abort)(const struct fc_seq *req_sp);
> +	int (*seq_exch_abort)(const struct fc_seq *req_sp,
> +			      unsigned int timer_msec);
>  
>  	/*
>  	 * Indicate that an exchange/sequence tuple is complete and the memory
> @@ -683,11 +688,12 @@ int fc_seq_send(struct fc_lport *lp, struct fc_seq *sp,
>  void fc_seq_els_rsp_send(struct fc_seq *sp, enum fc_els_cmd els_cmd,
>  			 struct fc_seq_els_data *els_data);
>  
> -
>  /*
> - * Abort the exchange used by the given sequence.
> + * This function is for seq_exch_abort function pointer in
> + * struct libfc_function_template, see comment block on
> + * seq_exch_abort for description of this function.
>   */
> -int fc_seq_exch_abort(const struct fc_seq *req_sp);
> +int fc_seq_exch_abort(const struct fc_seq *req_sp, unsigned int timer_msec);
>  
>  /*
>   * Indicate that an exchange/sequence tuple is complete and the memory
> 
> _______________________________________________
> devel mailing list
> devel at open-fcoe.org
> http://www.open-fcoe.org/mailman/listinfo/devel




More information about the devel mailing list