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
