Looks ok too. Thanks.

Vasu Dev wrote:
> @@ -406,16 +445,15 @@ static void fc_exch_timeout(unsigned long ep_arg)
>               if (e_stat & ESB_ST_REC_QUAL)
>                       fc_exch_rrq(ep);
>               goto done;
> -     } else if (!(e_stat & ESB_ST_ABNORMAL)) {
> +     } else {
>               resp = ep->resp;
>               arg = ep->resp_arg;
> -             /*
> -              * For FCP commands fc_fcp.c will manage the completion.
> -              * For all others fc_exch.c will handle.
> -              */
> -             if (ep->fh_type != FC_TYPE_FCP)
> -                     ep->resp = NULL;
> +             ep->resp = NULL;
> +             if (e_stat & ESB_ST_ABNORMAL)
> +                     rc = fc_exch_done_locked(ep);
>               spin_unlock_bh(&ep->ex_lock);
> +             if (!rc)
> +                     fc_exch_mgr_delete_ep(ep);
>               if (resp)
>                       resp(sp, ERR_PTR(-FC_EX_TIMEOUT), arg);
>               fc_seq_exch_abort(sp, 2 * ep->r_a_tov);
> @@ -556,44 +594,6 @@ static struct fc_exch *fc_exch_find(struct fc_exch_mgr 
> *mp, u16 xid)
>       return ep;
>  }
>  
> -static void fc_exch_mgr_delete_ep(struct fc_exch *ep)
> -{
> -     struct fc_exch_mgr *mp;
> -
> -     mp = ep->em;
> -     spin_lock_bh(&mp->em_lock);
> -     WARN_ON(mp->total_exches <= 0);
> -     mp->total_exches--;
> -     mp->exches[ep->xid - mp->min_xid] = NULL;
> -     list_del(&ep->ex_list);
> -     spin_unlock_bh(&mp->em_lock);
> -}
> -
> -static int fc_exch_done_locked(struct fc_exch *ep)
> -{
> -     int rc = 1;
> -
> -     /*
> -      * We must check for completion in case there are two threads
> -      * tyring to complete this. But the rrq code will reuse the
> -      * ep, and in that case we only clear the resp and set it as
> -      * complete, so it can be reused by the timer to send the rrq.
> -      */
> -     ep->resp = NULL;
> -     if (ep->state & FC_EX_DONE)
> -             return rc;
> -     ep->esb_stat |= ESB_ST_COMPLETE;
> -
> -     if (!(ep->esb_stat & ESB_ST_REC_QUAL)) {
> -             ep->state |= FC_EX_DONE;
> -             if (del_timer(&ep->ex_timer))
> -                     atomic_dec(&ep->ex_refcnt); /* drop hold for timer */
> -             atomic_dec(&ep->ex_refcnt); /* drop hold from alloc */
> -             rc = 0;
> -     }
> -     return rc;
> -}
> -
>  void fc_exch_done(struct fc_seq *sp)
>  {
>       struct fc_exch *ep = fc_seq_exch(sp);
> 
> _______________________________________________
> devel mailing list
> [email protected]
> http://www.open-fcoe.org/mailman/listinfo/devel

_______________________________________________
devel mailing list
[email protected]
http://www.open-fcoe.org/mailman/listinfo/devel

Reply via email to