Hi Joe,

Thanks a lot for reviewing the patches and providing valuable feedback.
I'll incorporate required changes and resend the patches soon.

Please read inline...

Thanks,
Bhanu


On Thu, 2010-05-13 at 16:30 -0700, Joe Eykholt wrote:
> Joe Eykholt wrote:
> > Joe Eykholt wrote:
> >> Bhanu Gollapudi wrote:
> >>> Unsolicited PRLO is now handled by sending LS_ACC and then
> >>> re-login to the target port.
> >>>
> >>> Signed-off-by: Bhanu Prakash Gollapudi <[email protected]>
> >>  From FC-LS-1.2 and 1.3, the PRLO LS_ACC response
> >> should have a parameter response page
> >> with a response code, and a payload length field of 20,
> >> so it's not as simple as using seq_els_rsp_send().
> >>
> >> I think that's why it did reject before ... it was a cheat.
> >>
> >> Otherwise it looks good.
> > 
> > Actually, on further reading, table 3 in FC-LS-3 says that
> > a process login is required for PRLO, so the existing case
> 
> I should've said "a N_Port Login is required for PRLO".
> 
> > in fc_rport_recv_els_req() was correct.  The requestor
> > should handle a reject with reason unable, and
> > the explanation "Port login required".

I interpreted "a N_Port Login is required" as a session is required
beteen the initiator and the target. As long as the initiator logged in
(PLOGI, PRLI) the target can send a PRLO.

As per FC-LS section 6.3 "N_Port Login between two Nx_Ports is complete
when each Nx_Port has received the Service Parameters of the other
Nx_Port. This may be accomplished by either implicit or explicit N_Port
Login"

So, I interpret that the PRLO can be sent by the target even if it didnt
originate the PLOGI.  Please let me know your thoughts.

> > 
> >     Joe
> > 
> >>> ---
> >>>  drivers/scsi/libfc/fc_rport.c |   51 
> >>> +++++++++++++++++++++++++----------------
> >>>  1 files changed, 31 insertions(+), 20 deletions(-)
> >>>
> >>> diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
> >>> index fba5218..46135db 100644
> >>> --- a/drivers/scsi/libfc/fc_rport.c
> >>> +++ b/drivers/scsi/libfc/fc_rport.c
> >>> @@ -71,7 +71,7 @@ static void fc_rport_recv_plogi_req(struct fc_lport *,
> >>>                               struct fc_seq *, struct fc_frame *);
> >>>  static void fc_rport_recv_prli_req(struct fc_rport_priv *,
> >>>                              struct fc_seq *, struct fc_frame *);
> >>> -static void fc_rport_recv_prlo_req(struct fc_rport_priv *,
> >>> +static void fc_rport_recv_prlo_req(struct fc_lport *,
> >>>                              struct fc_seq *, struct fc_frame *);
> >>>  static void fc_rport_recv_logo_req(struct fc_lport *,
> >>>                              struct fc_seq *, struct fc_frame *);
> >>> @@ -1227,9 +1227,6 @@ static void fc_rport_recv_els_req(struct fc_lport 
> >>> *lport,
> >>>   case ELS_PRLI:
> >>>           fc_rport_recv_prli_req(rdata, sp, fp);
> >>>           break;
> >>> - case ELS_PRLO:
> >>> -         fc_rport_recv_prlo_req(rdata, sp, fp);
> >>> -         break;
> >>>   case ELS_ADISC:
> >>>           fc_rport_recv_adisc_req(rdata, sp, fp);
> >>>           break;
> >>> @@ -1283,8 +1280,10 @@ void fc_rport_recv_req(struct fc_seq *sp, struct 
> >>> fc_frame *fp,
> >>>   case ELS_LOGO:
> >>>           fc_rport_recv_logo_req(lport, sp, fp);
> >>>           break;
> >>> - case ELS_PRLI:
> >>>   case ELS_PRLO:
> >>> +         fc_rport_recv_prlo_req(lport, sp, fp);
> >>> +         break;
> >>> + case ELS_PRLI:
> >>>   case ELS_ADISC:
> >>>   case ELS_RRQ:
> >>>   case ELS_REC:
> >>> @@ -1564,31 +1563,43 @@ drop:
> >>>  
> >>>  /**
> >>>   * fc_rport_recv_prlo_req() - Handler for process logout (PRLO) requests
> >>> - * @rdata: The remote port that sent the PRLO request
> >>> - * @sp:     The sequence that the PRLO was on
> >>> + * @lport: The local port that received the PRLO request
> >>> + * @sp:     The sequence that the PRLO request was on
> >>>   * @fp:     The PRLO request frame
> >>> - *
> >>> - * Locking Note: The rport lock is exected to be held before calling
> >>> - * this function.
> >>>   */
> >>> -static void fc_rport_recv_prlo_req(struct fc_rport_priv *rdata,
> >>> +static void fc_rport_recv_prlo_req(struct fc_lport *lport,
> >>>                              struct fc_seq *sp,
> >>>                              struct fc_frame *fp)
> >>>  {
> >>> - struct fc_lport *lport = rdata->local_port;
> >>> -
> >>>   struct fc_frame_header *fh;
> >>> - struct fc_seq_els_data rjt_data;
> >>> + struct fc_rport_priv *rdata;
> >>> + u32 sid;
> >>> +
> >>> + lport->tt.seq_els_rsp_send(sp, ELS_LS_ACC, NULL);
> >>>  
> >>>   fh = fc_frame_header_get(fp);
> >>> + sid = ntoh24(fh->fh_s_id);
> >>>  
> >>> - FC_RPORT_DBG(rdata, "Received PRLO request while in state %s\n",
> >>> -              fc_rport_state(rdata));
> >>> + mutex_lock(&lport->disc.disc_mutex);
> >>> + rdata = lport->tt.rport_lookup(lport, sid);
> >>> + if (rdata) {
> >>> +         mutex_lock(&rdata->rp_mutex);
> >>> +         FC_RPORT_DBG(rdata, "Received PRLO request while in state %s\n",
> >>> +                      fc_rport_state(rdata));
> >>>  
> >>> - rjt_data.fp = NULL;
> >>> - rjt_data.reason = ELS_RJT_UNAB;
> >>> - rjt_data.explan = ELS_EXPL_NONE;
> >>> - lport->tt.seq_els_rsp_send(sp, ELS_LS_RJT, &rjt_data);
> >>> +         fc_rport_enter_delete(rdata, RPORT_EV_LOGO);
> >>> +
> >>> +         /*
> >>> +          * If the remote port was created due to discovery, set state
> >>> +          * to log back in.  It may have seen a stale RSCN about us.
> >>> +          */
> >>> +         if (rdata->disc_id)
> >>> +                 fc_rport_state_enter(rdata, RPORT_ST_RESTART);
> >>> +         mutex_unlock(&rdata->rp_mutex);
> >>> + } else
> >>> +         FC_RPORT_ID_DBG(lport, sid,
> >>> +                         "Received PRLO from non-logged-in port\n");
> >>> + mutex_unlock(&lport->disc.disc_mutex);
> >>>   fc_frame_free(fp);
> >>>  }
> >>>  
> >> _______________________________________________
> >> 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
> 
> 



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

Reply via email to