提交 131203a1 编写于 作者: J Joe Eykholt 提交者: James Bottomley

[SCSI] libfc: move remote port lookup for ELS requests into fc_rport.c.

This moves the remote port lookup for incoming ELS requests into
fc_rport.c, in preparation for handing PLOGI and LOGO from
unknown rports.

This changes the arg to rport_recv_req from an rdata to an lport.
Signed-off-by: NJoe Eykholt <jeykholt@cisco.com>
Signed-off-by: NRobert Love <robert.w.love@intel.com>
Signed-off-by: NJames Bottomley <James.Bottomley@suse.de>
上级 6bd054cb
master alk-4.19.24 alk-4.19.30 alk-4.19.34 alk-4.19.36 alk-4.19.43 alk-4.19.48 alk-4.19.57 ck-4.19.67 ck-4.19.81 ck-4.19.91 github/fork/deepanshu1422/fix-typo-in-comment github/fork/haosdent/fix-typo linux-next v4.19.91 v4.19.90 v4.19.89 v4.19.88 v4.19.87 v4.19.86 v4.19.85 v4.19.84 v4.19.83 v4.19.82 v4.19.81 v4.19.80 v4.19.79 v4.19.78 v4.19.77 v4.19.76 v4.19.75 v4.19.74 v4.19.73 v4.19.72 v4.19.71 v4.19.70 v4.19.69 v4.19.68 v4.19.67 v4.19.66 v4.19.65 v4.19.64 v4.19.63 v4.19.62 v4.19.61 v4.19.60 v4.19.59 v4.19.58 v4.19.57 v4.19.56 v4.19.55 v4.19.54 v4.19.53 v4.19.52 v4.19.51 v4.19.50 v4.19.49 v4.19.48 v4.19.47 v4.19.46 v4.19.45 v4.19.44 v4.19.43 v4.19.42 v4.19.41 v4.19.40 v4.19.39 v4.19.38 v4.19.37 v4.19.36 v4.19.35 v4.19.34 v4.19.33 v4.19.32 v4.19.31 v4.19.30 v4.19.29 v4.19.28 v4.19.27 v4.19.26 v4.19.25 v4.19.24 v4.19.23 v4.19.22 v4.19.21 v4.19.20 v4.19.19 v4.19.18 v4.19.17 v4.19.16 v4.19.15 v4.19.14 v4.19.13 v4.19.12 v4.19.11 v4.19.10 v4.19.9 v4.19.8 v4.19.7 v4.19.6 v4.19.5 v4.19.4 v4.19.3 v4.19.2 v4.19.1 v4.19 v4.19-rc8 v4.19-rc7 v4.19-rc6 v4.19-rc5 v4.19-rc4 v4.19-rc3 v4.19-rc2 v4.19-rc1 ck-release-21 ck-release-20 ck-release-19.2 ck-release-19.1 ck-release-19 ck-release-18 ck-release-17.2 ck-release-17.1 ck-release-17 ck-release-16 ck-release-15.1 ck-release-15 ck-release-14 ck-release-13.2 ck-release-13 ck-release-12 ck-release-11 ck-release-10 ck-release-9 ck-release-7 alk-release-15 alk-release-14 alk-release-13.2 alk-release-13 alk-release-12 alk-release-11 alk-release-10 alk-release-9 alk-release-7
无相关合并请求
......@@ -812,10 +812,6 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp,
{
struct fc_frame_header *fh = fc_frame_header_get(fp);
void (*recv) (struct fc_seq *, struct fc_frame *, struct fc_lport *);
struct fc_rport_priv *rdata;
u32 s_id;
u32 d_id;
struct fc_seq_els_data rjt_data;
mutex_lock(&lport->lp_mutex);
......@@ -831,7 +827,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp,
/*
* Check opcode.
*/
recv = NULL;
recv = lport->tt.rport_recv_req;
switch (fc_frame_payload_op(fp)) {
case ELS_FLOGI:
recv = fc_lport_recv_flogi_req;
......@@ -858,29 +854,7 @@ static void fc_lport_recv_req(struct fc_lport *lport, struct fc_seq *sp,
break;
}
if (recv)
recv(sp, fp, lport);
else {
/*
* Find session.
* If this is a new incoming PLOGI, we won't find it.
*/
s_id = ntoh24(fh->fh_s_id);
d_id = ntoh24(fh->fh_d_id);
rdata = lport->tt.rport_lookup(lport, s_id);
if (rdata)
lport->tt.rport_recv_req(sp, fp, rdata);
else {
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_frame_free(fp);
}
}
recv(sp, fp, lport);
} else {
FC_LPORT_DBG(lport, "dropping invalid frame (eof %x)\n",
fr_eof(fp));
......
......@@ -912,57 +912,61 @@ static void fc_rport_enter_logo(struct fc_rport_priv *rdata)
* fc_rport_recv_req() - Receive a request from a rport
* @sp: current sequence in the PLOGI exchange
* @fp: response frame
* @rdata_arg: private remote port data
* @lport: Fibre Channel local port
*
* Locking Note: Called without the rport lock held. This
* function will hold the rport lock, call an _enter_*
* function and then unlock the rport.
* Locking Note: Called with the lport lock held.
*/
void fc_rport_recv_req(struct fc_seq *sp, struct fc_frame *fp,
struct fc_rport_priv *rdata)
struct fc_lport *lport)
{
struct fc_lport *lport = rdata->local_port;
struct fc_rport_priv *rdata;
struct fc_frame_header *fh;
struct fc_seq_els_data els_data;
u32 s_id;
u8 op;
mutex_lock(&rdata->rp_mutex);
els_data.fp = NULL;
els_data.explan = ELS_EXPL_NONE;
els_data.reason = ELS_RJT_NONE;
fh = fc_frame_header_get(fp);
s_id = ntoh24(fh->fh_s_id);
if (fh->fh_r_ctl == FC_RCTL_ELS_REQ && fh->fh_type == FC_TYPE_ELS) {
op = fc_frame_payload_op(fp);
switch (op) {
case ELS_PLOGI:
fc_rport_recv_plogi_req(rdata, sp, fp);
break;
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_LOGO:
fc_rport_recv_logo_req(rdata, sp, fp);
break;
case ELS_RRQ:
els_data.fp = fp;
lport->tt.seq_els_rsp_send(sp, ELS_RRQ, &els_data);
break;
case ELS_REC:
els_data.fp = fp;
lport->tt.seq_els_rsp_send(sp, ELS_REC, &els_data);
break;
default:
els_data.reason = ELS_RJT_UNSUP;
lport->tt.seq_els_rsp_send(sp, ELS_LS_RJT, &els_data);
break;
}
rdata = lport->tt.rport_lookup(lport, s_id);
if (!rdata) {
els_data.reason = ELS_RJT_UNAB;
lport->tt.seq_els_rsp_send(sp, ELS_LS_RJT, &els_data);
fc_frame_free(fp);
return;
}
mutex_lock(&rdata->rp_mutex);
op = fc_frame_payload_op(fp);
switch (op) {
case ELS_PLOGI:
fc_rport_recv_plogi_req(rdata, sp, fp);
break;
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_LOGO:
fc_rport_recv_logo_req(rdata, sp, fp);
break;
case ELS_RRQ:
els_data.fp = fp;
lport->tt.seq_els_rsp_send(sp, ELS_RRQ, &els_data);
break;
case ELS_REC:
els_data.fp = fp;
lport->tt.seq_els_rsp_send(sp, ELS_REC, &els_data);
break;
default:
els_data.reason = ELS_RJT_UNSUP;
lport->tt.seq_els_rsp_send(sp, ELS_LS_RJT, &els_data);
break;
}
mutex_unlock(&rdata->rp_mutex);
......
......@@ -598,7 +598,7 @@ struct libfc_function_template {
* STATUS: OPTIONAL
*/
void (*rport_recv_req)(struct fc_seq *, struct fc_frame *,
struct fc_rport_priv *);
struct fc_lport *);
/*
* lookup an rport by it's port ID.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册
反馈
建议
客服 返回
顶部