aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/libfc/fc_exch.c
diff options
context:
space:
mode:
authorJoe Eykholt <jeykholt@cisco.com>2010-07-20 18:21:07 -0400
committerJames Bottomley <James.Bottomley@suse.de>2010-07-28 10:06:01 -0400
commit239e81048b7dcd27448db40c845f88ac7c68424e (patch)
treec6d316b365e593a274511fca9562c87db2252a7e /drivers/scsi/libfc/fc_exch.c
parent24f089e2f2c800f88039e9d536d558ec6e349fad (diff)
[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: Joe Eykholt <jeykholt@cisco.com> Signed-off-by: Robert Love <robert.w.love@intel.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/libfc/fc_exch.c')
-rw-r--r--drivers/scsi/libfc/fc_exch.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/scsi/libfc/fc_exch.c b/drivers/scsi/libfc/fc_exch.c
index 61eabd3ce436..027042a6de3b 100644
--- a/drivers/scsi/libfc/fc_exch.c
+++ b/drivers/scsi/libfc/fc_exch.c
@@ -1231,6 +1231,28 @@ free:
1231} 1231}
1232 1232
1233/** 1233/**
1234 * fc_seq_assign() - Assign exchange and sequence for incoming request
1235 * @lport: The local port that received the request
1236 * @fp: The request frame
1237 *
1238 * On success, the sequence pointer will be returned and also in fr_seq(@fp).
1239 */
1240static struct fc_seq *fc_seq_assign(struct fc_lport *lport, struct fc_frame *fp)
1241{
1242 struct fc_exch_mgr_anchor *ema;
1243
1244 WARN_ON(lport != fr_dev(fp));
1245 WARN_ON(fr_seq(fp));
1246 fr_seq(fp) = NULL;
1247
1248 list_for_each_entry(ema, &lport->ema_list, ema_list)
1249 if ((!ema->match || ema->match(fp)) &&
1250 fc_seq_lookup_recip(lport, ema->mp, fp) != FC_RJT_NONE)
1251 break;
1252 return fr_seq(fp);
1253}
1254
1255/**
1234 * fc_exch_recv_req() - Handler for an incoming request where is other 1256 * fc_exch_recv_req() - Handler for an incoming request where is other
1235 * end is originating the sequence 1257 * end is originating the sequence
1236 * @lport: The local port that received the request 1258 * @lport: The local port that received the request
@@ -2283,6 +2305,9 @@ int fc_exch_init(struct fc_lport *lport)
2283 if (!lport->tt.seq_exch_abort) 2305 if (!lport->tt.seq_exch_abort)
2284 lport->tt.seq_exch_abort = fc_seq_exch_abort; 2306 lport->tt.seq_exch_abort = fc_seq_exch_abort;
2285 2307
2308 if (!lport->tt.seq_assign)
2309 lport->tt.seq_assign = fc_seq_assign;
2310
2286 return 0; 2311 return 0;
2287} 2312}
2288EXPORT_SYMBOL(fc_exch_init); 2313EXPORT_SYMBOL(fc_exch_init);