提交 239e8104 编写于 作者: J Joe Eykholt 提交者: James Bottomley

[SCSI] libfc: add interface to allocate a sequence for incoming requests

For incoming ELS and FCP requests, we often don't require an
exchange and sequence, however, sometimes we do.  For those cases,
(primarily FCP requests for targets) add a function to set up
the exchange and sequence.
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>
上级 24f089e2
...@@ -1230,6 +1230,28 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp) ...@@ -1230,6 +1230,28 @@ static void fc_exch_recv_abts(struct fc_exch *ep, struct fc_frame *rx_fp)
fc_frame_free(rx_fp); fc_frame_free(rx_fp);
} }
/**
* fc_seq_assign() - Assign exchange and sequence for incoming request
* @lport: The local port that received the request
* @fp: The request frame
*
* On success, the sequence pointer will be returned and also in fr_seq(@fp).
*/
static struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp)
{
struct fc_exch_mgr_anchor *ema;
WARN_ON(lport != fr_dev(fp));
WARN_ON(fr_seq(fp));
fr_seq(fp) = NULL;
list_for_each_entry(ema, &lport->ema_list, ema_list)
if ((!ema->match || ema->match(fp)) &&
fc_seq_lookup_recip(lport, ema->mp, fp) != FC_RJT_NONE)
break;
return fr_seq(fp);
}
/** /**
* fc_exch_recv_req() - Handler for an incoming request where is other * fc_exch_recv_req() - Handler for an incoming request where is other
* end is originating the sequence * end is originating the sequence
...@@ -2283,6 +2305,9 @@ int fc_exch_init(struct fc_lport *lport) ...@@ -2283,6 +2305,9 @@ int fc_exch_init(struct fc_lport *lport)
if (!lport->tt.seq_exch_abort) if (!lport->tt.seq_exch_abort)
lport->tt.seq_exch_abort = fc_seq_exch_abort; lport->tt.seq_exch_abort = fc_seq_exch_abort;
if (!lport->tt.seq_assign)
lport->tt.seq_assign = fc_seq_assign;
return 0; return 0;
} }
EXPORT_SYMBOL(fc_exch_init); EXPORT_SYMBOL(fc_exch_init);
......
...@@ -555,6 +555,13 @@ struct libfc_function_template { ...@@ -555,6 +555,13 @@ struct libfc_function_template {
*/ */
struct fc_seq *(*seq_start_next)(struct fc_seq *); struct fc_seq *(*seq_start_next)(struct fc_seq *);
/*
* Assign a sequence for an incoming request frame.
*
* STATUS: OPTIONAL
*/
struct fc_seq *(*seq_assign)(struct fc_lport *, struct fc_frame *);
/* /*
* Reset an exchange manager, completing all sequences and exchanges. * Reset an exchange manager, completing all sequences and exchanges.
* If s_id is non-zero, reset only exchanges originating from that FID. * If s_id is non-zero, reset only exchanges originating from that FID.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册