Merge tag 'trace-v4.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rostedt...
[sfrench/cifs-2.6.git] / drivers / nvme / target / fc.c
1 /*
2  * Copyright (c) 2016 Avago Technologies.  All rights reserved.
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of version 2 of the GNU General Public License as
6  * published by the Free Software Foundation.
7  *
8  * This program is distributed in the hope that it will be useful.
9  * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
10  * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
11  * PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE DISCLAIMED, EXCEPT TO
12  * THE EXTENT THAT SUCH DISCLAIMERS ARE HELD TO BE LEGALLY INVALID.
13  * See the GNU General Public License for more details, a copy of which
14  * can be found in the file COPYING included with this package
15  *
16  */
17 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18 #include <linux/module.h>
19 #include <linux/slab.h>
20 #include <linux/blk-mq.h>
21 #include <linux/parser.h>
22 #include <linux/random.h>
23 #include <uapi/scsi/fc/fc_fs.h>
24 #include <uapi/scsi/fc/fc_els.h>
25
26 #include "nvmet.h"
27 #include <linux/nvme-fc-driver.h>
28 #include <linux/nvme-fc.h>
29
30
31 /* *************************** Data Structures/Defines ****************** */
32
33
34 #define NVMET_LS_CTX_COUNT              4
35
36 /* for this implementation, assume small single frame rqst/rsp */
37 #define NVME_FC_MAX_LS_BUFFER_SIZE              2048
38
39 struct nvmet_fc_tgtport;
40 struct nvmet_fc_tgt_assoc;
41
42 struct nvmet_fc_ls_iod {
43         struct nvmefc_tgt_ls_req        *lsreq;
44         struct nvmefc_tgt_fcp_req       *fcpreq;        /* only if RS */
45
46         struct list_head                ls_list;        /* tgtport->ls_list */
47
48         struct nvmet_fc_tgtport         *tgtport;
49         struct nvmet_fc_tgt_assoc       *assoc;
50
51         u8                              *rqstbuf;
52         u8                              *rspbuf;
53         u16                             rqstdatalen;
54         dma_addr_t                      rspdma;
55
56         struct scatterlist              sg[2];
57
58         struct work_struct              work;
59 } __aligned(sizeof(unsigned long long));
60
61 #define NVMET_FC_MAX_KB_PER_XFR         256
62
63 enum nvmet_fcp_datadir {
64         NVMET_FCP_NODATA,
65         NVMET_FCP_WRITE,
66         NVMET_FCP_READ,
67         NVMET_FCP_ABORTED,
68 };
69
70 struct nvmet_fc_fcp_iod {
71         struct nvmefc_tgt_fcp_req       *fcpreq;
72
73         struct nvme_fc_cmd_iu           cmdiubuf;
74         struct nvme_fc_ersp_iu          rspiubuf;
75         dma_addr_t                      rspdma;
76         struct scatterlist              *data_sg;
77         struct scatterlist              *next_sg;
78         int                             data_sg_cnt;
79         u32                             next_sg_offset;
80         u32                             total_length;
81         u32                             offset;
82         enum nvmet_fcp_datadir          io_dir;
83         bool                            active;
84         bool                            abort;
85         bool                            aborted;
86         bool                            writedataactive;
87         spinlock_t                      flock;
88
89         struct nvmet_req                req;
90         struct work_struct              work;
91         struct work_struct              done_work;
92
93         struct nvmet_fc_tgtport         *tgtport;
94         struct nvmet_fc_tgt_queue       *queue;
95
96         struct list_head                fcp_list;       /* tgtport->fcp_list */
97 };
98
99 struct nvmet_fc_tgtport {
100
101         struct nvmet_fc_target_port     fc_target_port;
102
103         struct list_head                tgt_list; /* nvmet_fc_target_list */
104         struct device                   *dev;   /* dev for dma mapping */
105         struct nvmet_fc_target_template *ops;
106
107         struct nvmet_fc_ls_iod          *iod;
108         spinlock_t                      lock;
109         struct list_head                ls_list;
110         struct list_head                ls_busylist;
111         struct list_head                assoc_list;
112         struct ida                      assoc_cnt;
113         struct nvmet_port               *port;
114         struct kref                     ref;
115 };
116
117 struct nvmet_fc_tgt_queue {
118         bool                            ninetypercent;
119         u16                             qid;
120         u16                             sqsize;
121         u16                             ersp_ratio;
122         __le16                          sqhd;
123         int                             cpu;
124         atomic_t                        connected;
125         atomic_t                        sqtail;
126         atomic_t                        zrspcnt;
127         atomic_t                        rsn;
128         spinlock_t                      qlock;
129         struct nvmet_port               *port;
130         struct nvmet_cq                 nvme_cq;
131         struct nvmet_sq                 nvme_sq;
132         struct nvmet_fc_tgt_assoc       *assoc;
133         struct nvmet_fc_fcp_iod         *fod;           /* array of fcp_iods */
134         struct list_head                fod_list;
135         struct workqueue_struct         *work_q;
136         struct kref                     ref;
137 } __aligned(sizeof(unsigned long long));
138
139 struct nvmet_fc_tgt_assoc {
140         u64                             association_id;
141         u32                             a_id;
142         struct nvmet_fc_tgtport         *tgtport;
143         struct list_head                a_list;
144         struct nvmet_fc_tgt_queue       *queues[NVMET_NR_QUEUES];
145         struct kref                     ref;
146 };
147
148
149 static inline int
150 nvmet_fc_iodnum(struct nvmet_fc_ls_iod *iodptr)
151 {
152         return (iodptr - iodptr->tgtport->iod);
153 }
154
155 static inline int
156 nvmet_fc_fodnum(struct nvmet_fc_fcp_iod *fodptr)
157 {
158         return (fodptr - fodptr->queue->fod);
159 }
160
161
162 /*
163  * Association and Connection IDs:
164  *
165  * Association ID will have random number in upper 6 bytes and zero
166  *   in lower 2 bytes
167  *
168  * Connection IDs will be Association ID with QID or'd in lower 2 bytes
169  *
170  * note: Association ID = Connection ID for queue 0
171  */
172 #define BYTES_FOR_QID                   sizeof(u16)
173 #define BYTES_FOR_QID_SHIFT             (BYTES_FOR_QID * 8)
174 #define NVMET_FC_QUEUEID_MASK           ((u64)((1 << BYTES_FOR_QID_SHIFT) - 1))
175
176 static inline u64
177 nvmet_fc_makeconnid(struct nvmet_fc_tgt_assoc *assoc, u16 qid)
178 {
179         return (assoc->association_id | qid);
180 }
181
182 static inline u64
183 nvmet_fc_getassociationid(u64 connectionid)
184 {
185         return connectionid & ~NVMET_FC_QUEUEID_MASK;
186 }
187
188 static inline u16
189 nvmet_fc_getqueueid(u64 connectionid)
190 {
191         return (u16)(connectionid & NVMET_FC_QUEUEID_MASK);
192 }
193
194 static inline struct nvmet_fc_tgtport *
195 targetport_to_tgtport(struct nvmet_fc_target_port *targetport)
196 {
197         return container_of(targetport, struct nvmet_fc_tgtport,
198                                  fc_target_port);
199 }
200
201 static inline struct nvmet_fc_fcp_iod *
202 nvmet_req_to_fod(struct nvmet_req *nvme_req)
203 {
204         return container_of(nvme_req, struct nvmet_fc_fcp_iod, req);
205 }
206
207
208 /* *************************** Globals **************************** */
209
210
211 static DEFINE_SPINLOCK(nvmet_fc_tgtlock);
212
213 static LIST_HEAD(nvmet_fc_target_list);
214 static DEFINE_IDA(nvmet_fc_tgtport_cnt);
215
216
217 static void nvmet_fc_handle_ls_rqst_work(struct work_struct *work);
218 static void nvmet_fc_handle_fcp_rqst_work(struct work_struct *work);
219 static void nvmet_fc_fcp_rqst_op_done_work(struct work_struct *work);
220 static void nvmet_fc_tgt_a_put(struct nvmet_fc_tgt_assoc *assoc);
221 static int nvmet_fc_tgt_a_get(struct nvmet_fc_tgt_assoc *assoc);
222 static void nvmet_fc_tgt_q_put(struct nvmet_fc_tgt_queue *queue);
223 static int nvmet_fc_tgt_q_get(struct nvmet_fc_tgt_queue *queue);
224 static void nvmet_fc_tgtport_put(struct nvmet_fc_tgtport *tgtport);
225 static int nvmet_fc_tgtport_get(struct nvmet_fc_tgtport *tgtport);
226
227
228 /* *********************** FC-NVME DMA Handling **************************** */
229
230 /*
231  * The fcloop device passes in a NULL device pointer. Real LLD's will
232  * pass in a valid device pointer. If NULL is passed to the dma mapping
233  * routines, depending on the platform, it may or may not succeed, and
234  * may crash.
235  *
236  * As such:
237  * Wrapper all the dma routines and check the dev pointer.
238  *
239  * If simple mappings (return just a dma address, we'll noop them,
240  * returning a dma address of 0.
241  *
242  * On more complex mappings (dma_map_sg), a pseudo routine fills
243  * in the scatter list, setting all dma addresses to 0.
244  */
245
246 static inline dma_addr_t
247 fc_dma_map_single(struct device *dev, void *ptr, size_t size,
248                 enum dma_data_direction dir)
249 {
250         return dev ? dma_map_single(dev, ptr, size, dir) : (dma_addr_t)0L;
251 }
252
253 static inline int
254 fc_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
255 {
256         return dev ? dma_mapping_error(dev, dma_addr) : 0;
257 }
258
259 static inline void
260 fc_dma_unmap_single(struct device *dev, dma_addr_t addr, size_t size,
261         enum dma_data_direction dir)
262 {
263         if (dev)
264                 dma_unmap_single(dev, addr, size, dir);
265 }
266
267 static inline void
268 fc_dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, size_t size,
269                 enum dma_data_direction dir)
270 {
271         if (dev)
272                 dma_sync_single_for_cpu(dev, addr, size, dir);
273 }
274
275 static inline void
276 fc_dma_sync_single_for_device(struct device *dev, dma_addr_t addr, size_t size,
277                 enum dma_data_direction dir)
278 {
279         if (dev)
280                 dma_sync_single_for_device(dev, addr, size, dir);
281 }
282
283 /* pseudo dma_map_sg call */
284 static int
285 fc_map_sg(struct scatterlist *sg, int nents)
286 {
287         struct scatterlist *s;
288         int i;
289
290         WARN_ON(nents == 0 || sg[0].length == 0);
291
292         for_each_sg(sg, s, nents, i) {
293                 s->dma_address = 0L;
294 #ifdef CONFIG_NEED_SG_DMA_LENGTH
295                 s->dma_length = s->length;
296 #endif
297         }
298         return nents;
299 }
300
301 static inline int
302 fc_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
303                 enum dma_data_direction dir)
304 {
305         return dev ? dma_map_sg(dev, sg, nents, dir) : fc_map_sg(sg, nents);
306 }
307
308 static inline void
309 fc_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
310                 enum dma_data_direction dir)
311 {
312         if (dev)
313                 dma_unmap_sg(dev, sg, nents, dir);
314 }
315
316
317 /* *********************** FC-NVME Port Management ************************ */
318
319
320 static int
321 nvmet_fc_alloc_ls_iodlist(struct nvmet_fc_tgtport *tgtport)
322 {
323         struct nvmet_fc_ls_iod *iod;
324         int i;
325
326         iod = kcalloc(NVMET_LS_CTX_COUNT, sizeof(struct nvmet_fc_ls_iod),
327                         GFP_KERNEL);
328         if (!iod)
329                 return -ENOMEM;
330
331         tgtport->iod = iod;
332
333         for (i = 0; i < NVMET_LS_CTX_COUNT; iod++, i++) {
334                 INIT_WORK(&iod->work, nvmet_fc_handle_ls_rqst_work);
335                 iod->tgtport = tgtport;
336                 list_add_tail(&iod->ls_list, &tgtport->ls_list);
337
338                 iod->rqstbuf = kcalloc(2, NVME_FC_MAX_LS_BUFFER_SIZE,
339                         GFP_KERNEL);
340                 if (!iod->rqstbuf)
341                         goto out_fail;
342
343                 iod->rspbuf = iod->rqstbuf + NVME_FC_MAX_LS_BUFFER_SIZE;
344
345                 iod->rspdma = fc_dma_map_single(tgtport->dev, iod->rspbuf,
346                                                 NVME_FC_MAX_LS_BUFFER_SIZE,
347                                                 DMA_TO_DEVICE);
348                 if (fc_dma_mapping_error(tgtport->dev, iod->rspdma))
349                         goto out_fail;
350         }
351
352         return 0;
353
354 out_fail:
355         kfree(iod->rqstbuf);
356         list_del(&iod->ls_list);
357         for (iod--, i--; i >= 0; iod--, i--) {
358                 fc_dma_unmap_single(tgtport->dev, iod->rspdma,
359                                 NVME_FC_MAX_LS_BUFFER_SIZE, DMA_TO_DEVICE);
360                 kfree(iod->rqstbuf);
361                 list_del(&iod->ls_list);
362         }
363
364         kfree(iod);
365
366         return -EFAULT;
367 }
368
369 static void
370 nvmet_fc_free_ls_iodlist(struct nvmet_fc_tgtport *tgtport)
371 {
372         struct nvmet_fc_ls_iod *iod = tgtport->iod;
373         int i;
374
375         for (i = 0; i < NVMET_LS_CTX_COUNT; iod++, i++) {
376                 fc_dma_unmap_single(tgtport->dev,
377                                 iod->rspdma, NVME_FC_MAX_LS_BUFFER_SIZE,
378                                 DMA_TO_DEVICE);
379                 kfree(iod->rqstbuf);
380                 list_del(&iod->ls_list);
381         }
382         kfree(tgtport->iod);
383 }
384
385 static struct nvmet_fc_ls_iod *
386 nvmet_fc_alloc_ls_iod(struct nvmet_fc_tgtport *tgtport)
387 {
388         static struct nvmet_fc_ls_iod *iod;
389         unsigned long flags;
390
391         spin_lock_irqsave(&tgtport->lock, flags);
392         iod = list_first_entry_or_null(&tgtport->ls_list,
393                                         struct nvmet_fc_ls_iod, ls_list);
394         if (iod)
395                 list_move_tail(&iod->ls_list, &tgtport->ls_busylist);
396         spin_unlock_irqrestore(&tgtport->lock, flags);
397         return iod;
398 }
399
400
401 static void
402 nvmet_fc_free_ls_iod(struct nvmet_fc_tgtport *tgtport,
403                         struct nvmet_fc_ls_iod *iod)
404 {
405         unsigned long flags;
406
407         spin_lock_irqsave(&tgtport->lock, flags);
408         list_move(&iod->ls_list, &tgtport->ls_list);
409         spin_unlock_irqrestore(&tgtport->lock, flags);
410 }
411
412 static void
413 nvmet_fc_prep_fcp_iodlist(struct nvmet_fc_tgtport *tgtport,
414                                 struct nvmet_fc_tgt_queue *queue)
415 {
416         struct nvmet_fc_fcp_iod *fod = queue->fod;
417         int i;
418
419         for (i = 0; i < queue->sqsize; fod++, i++) {
420                 INIT_WORK(&fod->work, nvmet_fc_handle_fcp_rqst_work);
421                 INIT_WORK(&fod->done_work, nvmet_fc_fcp_rqst_op_done_work);
422                 fod->tgtport = tgtport;
423                 fod->queue = queue;
424                 fod->active = false;
425                 fod->abort = false;
426                 fod->aborted = false;
427                 fod->fcpreq = NULL;
428                 list_add_tail(&fod->fcp_list, &queue->fod_list);
429                 spin_lock_init(&fod->flock);
430
431                 fod->rspdma = fc_dma_map_single(tgtport->dev, &fod->rspiubuf,
432                                         sizeof(fod->rspiubuf), DMA_TO_DEVICE);
433                 if (fc_dma_mapping_error(tgtport->dev, fod->rspdma)) {
434                         list_del(&fod->fcp_list);
435                         for (fod--, i--; i >= 0; fod--, i--) {
436                                 fc_dma_unmap_single(tgtport->dev, fod->rspdma,
437                                                 sizeof(fod->rspiubuf),
438                                                 DMA_TO_DEVICE);
439                                 fod->rspdma = 0L;
440                                 list_del(&fod->fcp_list);
441                         }
442
443                         return;
444                 }
445         }
446 }
447
448 static void
449 nvmet_fc_destroy_fcp_iodlist(struct nvmet_fc_tgtport *tgtport,
450                                 struct nvmet_fc_tgt_queue *queue)
451 {
452         struct nvmet_fc_fcp_iod *fod = queue->fod;
453         int i;
454
455         for (i = 0; i < queue->sqsize; fod++, i++) {
456                 if (fod->rspdma)
457                         fc_dma_unmap_single(tgtport->dev, fod->rspdma,
458                                 sizeof(fod->rspiubuf), DMA_TO_DEVICE);
459         }
460 }
461
462 static struct nvmet_fc_fcp_iod *
463 nvmet_fc_alloc_fcp_iod(struct nvmet_fc_tgt_queue *queue)
464 {
465         static struct nvmet_fc_fcp_iod *fod;
466         unsigned long flags;
467
468         spin_lock_irqsave(&queue->qlock, flags);
469         fod = list_first_entry_or_null(&queue->fod_list,
470                                         struct nvmet_fc_fcp_iod, fcp_list);
471         if (fod) {
472                 list_del(&fod->fcp_list);
473                 fod->active = true;
474                 /*
475                  * no queue reference is taken, as it was taken by the
476                  * queue lookup just prior to the allocation. The iod
477                  * will "inherit" that reference.
478                  */
479         }
480         spin_unlock_irqrestore(&queue->qlock, flags);
481         return fod;
482 }
483
484
485 static void
486 nvmet_fc_free_fcp_iod(struct nvmet_fc_tgt_queue *queue,
487                         struct nvmet_fc_fcp_iod *fod)
488 {
489         struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
490         struct nvmet_fc_tgtport *tgtport = fod->tgtport;
491         unsigned long flags;
492
493         fc_dma_sync_single_for_cpu(tgtport->dev, fod->rspdma,
494                                 sizeof(fod->rspiubuf), DMA_TO_DEVICE);
495
496         fcpreq->nvmet_fc_private = NULL;
497
498         spin_lock_irqsave(&queue->qlock, flags);
499         list_add_tail(&fod->fcp_list, &fod->queue->fod_list);
500         fod->active = false;
501         fod->abort = false;
502         fod->aborted = false;
503         fod->writedataactive = false;
504         fod->fcpreq = NULL;
505         spin_unlock_irqrestore(&queue->qlock, flags);
506
507         /*
508          * release the reference taken at queue lookup and fod allocation
509          */
510         nvmet_fc_tgt_q_put(queue);
511
512         tgtport->ops->fcp_req_release(&tgtport->fc_target_port, fcpreq);
513 }
514
515 static int
516 nvmet_fc_queue_to_cpu(struct nvmet_fc_tgtport *tgtport, int qid)
517 {
518         int cpu, idx, cnt;
519
520         if (tgtport->ops->max_hw_queues == 1)
521                 return WORK_CPU_UNBOUND;
522
523         /* Simple cpu selection based on qid modulo active cpu count */
524         idx = !qid ? 0 : (qid - 1) % num_active_cpus();
525
526         /* find the n'th active cpu */
527         for (cpu = 0, cnt = 0; ; ) {
528                 if (cpu_active(cpu)) {
529                         if (cnt == idx)
530                                 break;
531                         cnt++;
532                 }
533                 cpu = (cpu + 1) % num_possible_cpus();
534         }
535
536         return cpu;
537 }
538
539 static struct nvmet_fc_tgt_queue *
540 nvmet_fc_alloc_target_queue(struct nvmet_fc_tgt_assoc *assoc,
541                         u16 qid, u16 sqsize)
542 {
543         struct nvmet_fc_tgt_queue *queue;
544         unsigned long flags;
545         int ret;
546
547         if (qid >= NVMET_NR_QUEUES)
548                 return NULL;
549
550         queue = kzalloc((sizeof(*queue) +
551                                 (sizeof(struct nvmet_fc_fcp_iod) * sqsize)),
552                                 GFP_KERNEL);
553         if (!queue)
554                 return NULL;
555
556         if (!nvmet_fc_tgt_a_get(assoc))
557                 goto out_free_queue;
558
559         queue->work_q = alloc_workqueue("ntfc%d.%d.%d", 0, 0,
560                                 assoc->tgtport->fc_target_port.port_num,
561                                 assoc->a_id, qid);
562         if (!queue->work_q)
563                 goto out_a_put;
564
565         queue->fod = (struct nvmet_fc_fcp_iod *)&queue[1];
566         queue->qid = qid;
567         queue->sqsize = sqsize;
568         queue->assoc = assoc;
569         queue->port = assoc->tgtport->port;
570         queue->cpu = nvmet_fc_queue_to_cpu(assoc->tgtport, qid);
571         INIT_LIST_HEAD(&queue->fod_list);
572         atomic_set(&queue->connected, 0);
573         atomic_set(&queue->sqtail, 0);
574         atomic_set(&queue->rsn, 1);
575         atomic_set(&queue->zrspcnt, 0);
576         spin_lock_init(&queue->qlock);
577         kref_init(&queue->ref);
578
579         nvmet_fc_prep_fcp_iodlist(assoc->tgtport, queue);
580
581         ret = nvmet_sq_init(&queue->nvme_sq);
582         if (ret)
583                 goto out_fail_iodlist;
584
585         WARN_ON(assoc->queues[qid]);
586         spin_lock_irqsave(&assoc->tgtport->lock, flags);
587         assoc->queues[qid] = queue;
588         spin_unlock_irqrestore(&assoc->tgtport->lock, flags);
589
590         return queue;
591
592 out_fail_iodlist:
593         nvmet_fc_destroy_fcp_iodlist(assoc->tgtport, queue);
594         destroy_workqueue(queue->work_q);
595 out_a_put:
596         nvmet_fc_tgt_a_put(assoc);
597 out_free_queue:
598         kfree(queue);
599         return NULL;
600 }
601
602
603 static void
604 nvmet_fc_tgt_queue_free(struct kref *ref)
605 {
606         struct nvmet_fc_tgt_queue *queue =
607                 container_of(ref, struct nvmet_fc_tgt_queue, ref);
608         unsigned long flags;
609
610         spin_lock_irqsave(&queue->assoc->tgtport->lock, flags);
611         queue->assoc->queues[queue->qid] = NULL;
612         spin_unlock_irqrestore(&queue->assoc->tgtport->lock, flags);
613
614         nvmet_fc_destroy_fcp_iodlist(queue->assoc->tgtport, queue);
615
616         nvmet_fc_tgt_a_put(queue->assoc);
617
618         destroy_workqueue(queue->work_q);
619
620         kfree(queue);
621 }
622
623 static void
624 nvmet_fc_tgt_q_put(struct nvmet_fc_tgt_queue *queue)
625 {
626         kref_put(&queue->ref, nvmet_fc_tgt_queue_free);
627 }
628
629 static int
630 nvmet_fc_tgt_q_get(struct nvmet_fc_tgt_queue *queue)
631 {
632         return kref_get_unless_zero(&queue->ref);
633 }
634
635
636 static void
637 nvmet_fc_delete_target_queue(struct nvmet_fc_tgt_queue *queue)
638 {
639         struct nvmet_fc_tgtport *tgtport = queue->assoc->tgtport;
640         struct nvmet_fc_fcp_iod *fod = queue->fod;
641         unsigned long flags;
642         int i, writedataactive;
643         bool disconnect;
644
645         disconnect = atomic_xchg(&queue->connected, 0);
646
647         spin_lock_irqsave(&queue->qlock, flags);
648         /* about outstanding io's */
649         for (i = 0; i < queue->sqsize; fod++, i++) {
650                 if (fod->active) {
651                         spin_lock(&fod->flock);
652                         fod->abort = true;
653                         writedataactive = fod->writedataactive;
654                         spin_unlock(&fod->flock);
655                         /*
656                          * only call lldd abort routine if waiting for
657                          * writedata. other outstanding ops should finish
658                          * on their own.
659                          */
660                         if (writedataactive) {
661                                 spin_lock(&fod->flock);
662                                 fod->aborted = true;
663                                 spin_unlock(&fod->flock);
664                                 tgtport->ops->fcp_abort(
665                                         &tgtport->fc_target_port, fod->fcpreq);
666                         }
667                 }
668         }
669         spin_unlock_irqrestore(&queue->qlock, flags);
670
671         flush_workqueue(queue->work_q);
672
673         if (disconnect)
674                 nvmet_sq_destroy(&queue->nvme_sq);
675
676         nvmet_fc_tgt_q_put(queue);
677 }
678
679 static struct nvmet_fc_tgt_queue *
680 nvmet_fc_find_target_queue(struct nvmet_fc_tgtport *tgtport,
681                                 u64 connection_id)
682 {
683         struct nvmet_fc_tgt_assoc *assoc;
684         struct nvmet_fc_tgt_queue *queue;
685         u64 association_id = nvmet_fc_getassociationid(connection_id);
686         u16 qid = nvmet_fc_getqueueid(connection_id);
687         unsigned long flags;
688
689         spin_lock_irqsave(&tgtport->lock, flags);
690         list_for_each_entry(assoc, &tgtport->assoc_list, a_list) {
691                 if (association_id == assoc->association_id) {
692                         queue = assoc->queues[qid];
693                         if (queue &&
694                             (!atomic_read(&queue->connected) ||
695                              !nvmet_fc_tgt_q_get(queue)))
696                                 queue = NULL;
697                         spin_unlock_irqrestore(&tgtport->lock, flags);
698                         return queue;
699                 }
700         }
701         spin_unlock_irqrestore(&tgtport->lock, flags);
702         return NULL;
703 }
704
705 static struct nvmet_fc_tgt_assoc *
706 nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport)
707 {
708         struct nvmet_fc_tgt_assoc *assoc, *tmpassoc;
709         unsigned long flags;
710         u64 ran;
711         int idx;
712         bool needrandom = true;
713
714         assoc = kzalloc(sizeof(*assoc), GFP_KERNEL);
715         if (!assoc)
716                 return NULL;
717
718         idx = ida_simple_get(&tgtport->assoc_cnt, 0, 0, GFP_KERNEL);
719         if (idx < 0)
720                 goto out_free_assoc;
721
722         if (!nvmet_fc_tgtport_get(tgtport))
723                 goto out_ida_put;
724
725         assoc->tgtport = tgtport;
726         assoc->a_id = idx;
727         INIT_LIST_HEAD(&assoc->a_list);
728         kref_init(&assoc->ref);
729
730         while (needrandom) {
731                 get_random_bytes(&ran, sizeof(ran) - BYTES_FOR_QID);
732                 ran = ran << BYTES_FOR_QID_SHIFT;
733
734                 spin_lock_irqsave(&tgtport->lock, flags);
735                 needrandom = false;
736                 list_for_each_entry(tmpassoc, &tgtport->assoc_list, a_list)
737                         if (ran == tmpassoc->association_id) {
738                                 needrandom = true;
739                                 break;
740                         }
741                 if (!needrandom) {
742                         assoc->association_id = ran;
743                         list_add_tail(&assoc->a_list, &tgtport->assoc_list);
744                 }
745                 spin_unlock_irqrestore(&tgtport->lock, flags);
746         }
747
748         return assoc;
749
750 out_ida_put:
751         ida_simple_remove(&tgtport->assoc_cnt, idx);
752 out_free_assoc:
753         kfree(assoc);
754         return NULL;
755 }
756
757 static void
758 nvmet_fc_target_assoc_free(struct kref *ref)
759 {
760         struct nvmet_fc_tgt_assoc *assoc =
761                 container_of(ref, struct nvmet_fc_tgt_assoc, ref);
762         struct nvmet_fc_tgtport *tgtport = assoc->tgtport;
763         unsigned long flags;
764
765         spin_lock_irqsave(&tgtport->lock, flags);
766         list_del(&assoc->a_list);
767         spin_unlock_irqrestore(&tgtport->lock, flags);
768         ida_simple_remove(&tgtport->assoc_cnt, assoc->a_id);
769         kfree(assoc);
770         nvmet_fc_tgtport_put(tgtport);
771 }
772
773 static void
774 nvmet_fc_tgt_a_put(struct nvmet_fc_tgt_assoc *assoc)
775 {
776         kref_put(&assoc->ref, nvmet_fc_target_assoc_free);
777 }
778
779 static int
780 nvmet_fc_tgt_a_get(struct nvmet_fc_tgt_assoc *assoc)
781 {
782         return kref_get_unless_zero(&assoc->ref);
783 }
784
785 static void
786 nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc)
787 {
788         struct nvmet_fc_tgtport *tgtport = assoc->tgtport;
789         struct nvmet_fc_tgt_queue *queue;
790         unsigned long flags;
791         int i;
792
793         spin_lock_irqsave(&tgtport->lock, flags);
794         for (i = NVMET_NR_QUEUES - 1; i >= 0; i--) {
795                 queue = assoc->queues[i];
796                 if (queue) {
797                         if (!nvmet_fc_tgt_q_get(queue))
798                                 continue;
799                         spin_unlock_irqrestore(&tgtport->lock, flags);
800                         nvmet_fc_delete_target_queue(queue);
801                         nvmet_fc_tgt_q_put(queue);
802                         spin_lock_irqsave(&tgtport->lock, flags);
803                 }
804         }
805         spin_unlock_irqrestore(&tgtport->lock, flags);
806
807         nvmet_fc_tgt_a_put(assoc);
808 }
809
810 static struct nvmet_fc_tgt_assoc *
811 nvmet_fc_find_target_assoc(struct nvmet_fc_tgtport *tgtport,
812                                 u64 association_id)
813 {
814         struct nvmet_fc_tgt_assoc *assoc;
815         struct nvmet_fc_tgt_assoc *ret = NULL;
816         unsigned long flags;
817
818         spin_lock_irqsave(&tgtport->lock, flags);
819         list_for_each_entry(assoc, &tgtport->assoc_list, a_list) {
820                 if (association_id == assoc->association_id) {
821                         ret = assoc;
822                         nvmet_fc_tgt_a_get(assoc);
823                         break;
824                 }
825         }
826         spin_unlock_irqrestore(&tgtport->lock, flags);
827
828         return ret;
829 }
830
831
832 /**
833  * nvme_fc_register_targetport - transport entry point called by an
834  *                              LLDD to register the existence of a local
835  *                              NVME subystem FC port.
836  * @pinfo:     pointer to information about the port to be registered
837  * @template:  LLDD entrypoints and operational parameters for the port
838  * @dev:       physical hardware device node port corresponds to. Will be
839  *             used for DMA mappings
840  * @portptr:   pointer to a local port pointer. Upon success, the routine
841  *             will allocate a nvme_fc_local_port structure and place its
842  *             address in the local port pointer. Upon failure, local port
843  *             pointer will be set to NULL.
844  *
845  * Returns:
846  * a completion status. Must be 0 upon success; a negative errno
847  * (ex: -ENXIO) upon failure.
848  */
849 int
850 nvmet_fc_register_targetport(struct nvmet_fc_port_info *pinfo,
851                         struct nvmet_fc_target_template *template,
852                         struct device *dev,
853                         struct nvmet_fc_target_port **portptr)
854 {
855         struct nvmet_fc_tgtport *newrec;
856         unsigned long flags;
857         int ret, idx;
858
859         if (!template->xmt_ls_rsp || !template->fcp_op ||
860             !template->fcp_abort ||
861             !template->fcp_req_release || !template->targetport_delete ||
862             !template->max_hw_queues || !template->max_sgl_segments ||
863             !template->max_dif_sgl_segments || !template->dma_boundary) {
864                 ret = -EINVAL;
865                 goto out_regtgt_failed;
866         }
867
868         newrec = kzalloc((sizeof(*newrec) + template->target_priv_sz),
869                          GFP_KERNEL);
870         if (!newrec) {
871                 ret = -ENOMEM;
872                 goto out_regtgt_failed;
873         }
874
875         idx = ida_simple_get(&nvmet_fc_tgtport_cnt, 0, 0, GFP_KERNEL);
876         if (idx < 0) {
877                 ret = -ENOSPC;
878                 goto out_fail_kfree;
879         }
880
881         if (!get_device(dev) && dev) {
882                 ret = -ENODEV;
883                 goto out_ida_put;
884         }
885
886         newrec->fc_target_port.node_name = pinfo->node_name;
887         newrec->fc_target_port.port_name = pinfo->port_name;
888         newrec->fc_target_port.private = &newrec[1];
889         newrec->fc_target_port.port_id = pinfo->port_id;
890         newrec->fc_target_port.port_num = idx;
891         INIT_LIST_HEAD(&newrec->tgt_list);
892         newrec->dev = dev;
893         newrec->ops = template;
894         spin_lock_init(&newrec->lock);
895         INIT_LIST_HEAD(&newrec->ls_list);
896         INIT_LIST_HEAD(&newrec->ls_busylist);
897         INIT_LIST_HEAD(&newrec->assoc_list);
898         kref_init(&newrec->ref);
899         ida_init(&newrec->assoc_cnt);
900
901         ret = nvmet_fc_alloc_ls_iodlist(newrec);
902         if (ret) {
903                 ret = -ENOMEM;
904                 goto out_free_newrec;
905         }
906
907         spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
908         list_add_tail(&newrec->tgt_list, &nvmet_fc_target_list);
909         spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
910
911         *portptr = &newrec->fc_target_port;
912         return 0;
913
914 out_free_newrec:
915         put_device(dev);
916 out_ida_put:
917         ida_simple_remove(&nvmet_fc_tgtport_cnt, idx);
918 out_fail_kfree:
919         kfree(newrec);
920 out_regtgt_failed:
921         *portptr = NULL;
922         return ret;
923 }
924 EXPORT_SYMBOL_GPL(nvmet_fc_register_targetport);
925
926
927 static void
928 nvmet_fc_free_tgtport(struct kref *ref)
929 {
930         struct nvmet_fc_tgtport *tgtport =
931                 container_of(ref, struct nvmet_fc_tgtport, ref);
932         struct device *dev = tgtport->dev;
933         unsigned long flags;
934
935         spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
936         list_del(&tgtport->tgt_list);
937         spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
938
939         nvmet_fc_free_ls_iodlist(tgtport);
940
941         /* let the LLDD know we've finished tearing it down */
942         tgtport->ops->targetport_delete(&tgtport->fc_target_port);
943
944         ida_simple_remove(&nvmet_fc_tgtport_cnt,
945                         tgtport->fc_target_port.port_num);
946
947         ida_destroy(&tgtport->assoc_cnt);
948
949         kfree(tgtport);
950
951         put_device(dev);
952 }
953
954 static void
955 nvmet_fc_tgtport_put(struct nvmet_fc_tgtport *tgtport)
956 {
957         kref_put(&tgtport->ref, nvmet_fc_free_tgtport);
958 }
959
960 static int
961 nvmet_fc_tgtport_get(struct nvmet_fc_tgtport *tgtport)
962 {
963         return kref_get_unless_zero(&tgtport->ref);
964 }
965
966 static void
967 __nvmet_fc_free_assocs(struct nvmet_fc_tgtport *tgtport)
968 {
969         struct nvmet_fc_tgt_assoc *assoc, *next;
970         unsigned long flags;
971
972         spin_lock_irqsave(&tgtport->lock, flags);
973         list_for_each_entry_safe(assoc, next,
974                                 &tgtport->assoc_list, a_list) {
975                 if (!nvmet_fc_tgt_a_get(assoc))
976                         continue;
977                 spin_unlock_irqrestore(&tgtport->lock, flags);
978                 nvmet_fc_delete_target_assoc(assoc);
979                 nvmet_fc_tgt_a_put(assoc);
980                 spin_lock_irqsave(&tgtport->lock, flags);
981         }
982         spin_unlock_irqrestore(&tgtport->lock, flags);
983 }
984
985 /*
986  * nvmet layer has called to terminate an association
987  */
988 static void
989 nvmet_fc_delete_ctrl(struct nvmet_ctrl *ctrl)
990 {
991         struct nvmet_fc_tgtport *tgtport, *next;
992         struct nvmet_fc_tgt_assoc *assoc;
993         struct nvmet_fc_tgt_queue *queue;
994         unsigned long flags;
995         bool found_ctrl = false;
996
997         /* this is a bit ugly, but don't want to make locks layered */
998         spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
999         list_for_each_entry_safe(tgtport, next, &nvmet_fc_target_list,
1000                         tgt_list) {
1001                 if (!nvmet_fc_tgtport_get(tgtport))
1002                         continue;
1003                 spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1004
1005                 spin_lock_irqsave(&tgtport->lock, flags);
1006                 list_for_each_entry(assoc, &tgtport->assoc_list, a_list) {
1007                         queue = assoc->queues[0];
1008                         if (queue && queue->nvme_sq.ctrl == ctrl) {
1009                                 if (nvmet_fc_tgt_a_get(assoc))
1010                                         found_ctrl = true;
1011                                 break;
1012                         }
1013                 }
1014                 spin_unlock_irqrestore(&tgtport->lock, flags);
1015
1016                 nvmet_fc_tgtport_put(tgtport);
1017
1018                 if (found_ctrl) {
1019                         nvmet_fc_delete_target_assoc(assoc);
1020                         nvmet_fc_tgt_a_put(assoc);
1021                         return;
1022                 }
1023
1024                 spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1025         }
1026         spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1027 }
1028
1029 /**
1030  * nvme_fc_unregister_targetport - transport entry point called by an
1031  *                              LLDD to deregister/remove a previously
1032  *                              registered a local NVME subsystem FC port.
1033  * @tgtport: pointer to the (registered) target port that is to be
1034  *           deregistered.
1035  *
1036  * Returns:
1037  * a completion status. Must be 0 upon success; a negative errno
1038  * (ex: -ENXIO) upon failure.
1039  */
1040 int
1041 nvmet_fc_unregister_targetport(struct nvmet_fc_target_port *target_port)
1042 {
1043         struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
1044
1045         /* terminate any outstanding associations */
1046         __nvmet_fc_free_assocs(tgtport);
1047
1048         nvmet_fc_tgtport_put(tgtport);
1049
1050         return 0;
1051 }
1052 EXPORT_SYMBOL_GPL(nvmet_fc_unregister_targetport);
1053
1054
1055 /* *********************** FC-NVME LS Handling **************************** */
1056
1057
1058 static void
1059 nvmet_fc_format_rsp_hdr(void *buf, u8 ls_cmd, __be32 desc_len, u8 rqst_ls_cmd)
1060 {
1061         struct fcnvme_ls_acc_hdr *acc = buf;
1062
1063         acc->w0.ls_cmd = ls_cmd;
1064         acc->desc_list_len = desc_len;
1065         acc->rqst.desc_tag = cpu_to_be32(FCNVME_LSDESC_RQST);
1066         acc->rqst.desc_len =
1067                         fcnvme_lsdesc_len(sizeof(struct fcnvme_lsdesc_rqst));
1068         acc->rqst.w0.ls_cmd = rqst_ls_cmd;
1069 }
1070
1071 static int
1072 nvmet_fc_format_rjt(void *buf, u16 buflen, u8 ls_cmd,
1073                         u8 reason, u8 explanation, u8 vendor)
1074 {
1075         struct fcnvme_ls_rjt *rjt = buf;
1076
1077         nvmet_fc_format_rsp_hdr(buf, FCNVME_LSDESC_RQST,
1078                         fcnvme_lsdesc_len(sizeof(struct fcnvme_ls_rjt)),
1079                         ls_cmd);
1080         rjt->rjt.desc_tag = cpu_to_be32(FCNVME_LSDESC_RJT);
1081         rjt->rjt.desc_len = fcnvme_lsdesc_len(sizeof(struct fcnvme_lsdesc_rjt));
1082         rjt->rjt.reason_code = reason;
1083         rjt->rjt.reason_explanation = explanation;
1084         rjt->rjt.vendor = vendor;
1085
1086         return sizeof(struct fcnvme_ls_rjt);
1087 }
1088
1089 /* Validation Error indexes into the string table below */
1090 enum {
1091         VERR_NO_ERROR           = 0,
1092         VERR_CR_ASSOC_LEN       = 1,
1093         VERR_CR_ASSOC_RQST_LEN  = 2,
1094         VERR_CR_ASSOC_CMD       = 3,
1095         VERR_CR_ASSOC_CMD_LEN   = 4,
1096         VERR_ERSP_RATIO         = 5,
1097         VERR_ASSOC_ALLOC_FAIL   = 6,
1098         VERR_QUEUE_ALLOC_FAIL   = 7,
1099         VERR_CR_CONN_LEN        = 8,
1100         VERR_CR_CONN_RQST_LEN   = 9,
1101         VERR_ASSOC_ID           = 10,
1102         VERR_ASSOC_ID_LEN       = 11,
1103         VERR_NO_ASSOC           = 12,
1104         VERR_CONN_ID            = 13,
1105         VERR_CONN_ID_LEN        = 14,
1106         VERR_NO_CONN            = 15,
1107         VERR_CR_CONN_CMD        = 16,
1108         VERR_CR_CONN_CMD_LEN    = 17,
1109         VERR_DISCONN_LEN        = 18,
1110         VERR_DISCONN_RQST_LEN   = 19,
1111         VERR_DISCONN_CMD        = 20,
1112         VERR_DISCONN_CMD_LEN    = 21,
1113         VERR_DISCONN_SCOPE      = 22,
1114         VERR_RS_LEN             = 23,
1115         VERR_RS_RQST_LEN        = 24,
1116         VERR_RS_CMD             = 25,
1117         VERR_RS_CMD_LEN         = 26,
1118         VERR_RS_RCTL            = 27,
1119         VERR_RS_RO              = 28,
1120 };
1121
1122 static char *validation_errors[] = {
1123         "OK",
1124         "Bad CR_ASSOC Length",
1125         "Bad CR_ASSOC Rqst Length",
1126         "Not CR_ASSOC Cmd",
1127         "Bad CR_ASSOC Cmd Length",
1128         "Bad Ersp Ratio",
1129         "Association Allocation Failed",
1130         "Queue Allocation Failed",
1131         "Bad CR_CONN Length",
1132         "Bad CR_CONN Rqst Length",
1133         "Not Association ID",
1134         "Bad Association ID Length",
1135         "No Association",
1136         "Not Connection ID",
1137         "Bad Connection ID Length",
1138         "No Connection",
1139         "Not CR_CONN Cmd",
1140         "Bad CR_CONN Cmd Length",
1141         "Bad DISCONN Length",
1142         "Bad DISCONN Rqst Length",
1143         "Not DISCONN Cmd",
1144         "Bad DISCONN Cmd Length",
1145         "Bad Disconnect Scope",
1146         "Bad RS Length",
1147         "Bad RS Rqst Length",
1148         "Not RS Cmd",
1149         "Bad RS Cmd Length",
1150         "Bad RS R_CTL",
1151         "Bad RS Relative Offset",
1152 };
1153
1154 static void
1155 nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
1156                         struct nvmet_fc_ls_iod *iod)
1157 {
1158         struct fcnvme_ls_cr_assoc_rqst *rqst =
1159                                 (struct fcnvme_ls_cr_assoc_rqst *)iod->rqstbuf;
1160         struct fcnvme_ls_cr_assoc_acc *acc =
1161                                 (struct fcnvme_ls_cr_assoc_acc *)iod->rspbuf;
1162         struct nvmet_fc_tgt_queue *queue;
1163         int ret = 0;
1164
1165         memset(acc, 0, sizeof(*acc));
1166
1167         if (iod->rqstdatalen < sizeof(struct fcnvme_ls_cr_assoc_rqst))
1168                 ret = VERR_CR_ASSOC_LEN;
1169         else if (rqst->desc_list_len !=
1170                         fcnvme_lsdesc_len(
1171                                 sizeof(struct fcnvme_ls_cr_assoc_rqst)))
1172                 ret = VERR_CR_ASSOC_RQST_LEN;
1173         else if (rqst->assoc_cmd.desc_tag !=
1174                         cpu_to_be32(FCNVME_LSDESC_CREATE_ASSOC_CMD))
1175                 ret = VERR_CR_ASSOC_CMD;
1176         else if (rqst->assoc_cmd.desc_len !=
1177                         fcnvme_lsdesc_len(
1178                                 sizeof(struct fcnvme_lsdesc_cr_assoc_cmd)))
1179                 ret = VERR_CR_ASSOC_CMD_LEN;
1180         else if (!rqst->assoc_cmd.ersp_ratio ||
1181                  (be16_to_cpu(rqst->assoc_cmd.ersp_ratio) >=
1182                                 be16_to_cpu(rqst->assoc_cmd.sqsize)))
1183                 ret = VERR_ERSP_RATIO;
1184
1185         else {
1186                 /* new association w/ admin queue */
1187                 iod->assoc = nvmet_fc_alloc_target_assoc(tgtport);
1188                 if (!iod->assoc)
1189                         ret = VERR_ASSOC_ALLOC_FAIL;
1190                 else {
1191                         queue = nvmet_fc_alloc_target_queue(iod->assoc, 0,
1192                                         be16_to_cpu(rqst->assoc_cmd.sqsize));
1193                         if (!queue)
1194                                 ret = VERR_QUEUE_ALLOC_FAIL;
1195                 }
1196         }
1197
1198         if (ret) {
1199                 dev_err(tgtport->dev,
1200                         "Create Association LS failed: %s\n",
1201                         validation_errors[ret]);
1202                 iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
1203                                 NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
1204                                 FCNVME_RJT_RC_LOGIC,
1205                                 FCNVME_RJT_EXP_NONE, 0);
1206                 return;
1207         }
1208
1209         queue->ersp_ratio = be16_to_cpu(rqst->assoc_cmd.ersp_ratio);
1210         atomic_set(&queue->connected, 1);
1211         queue->sqhd = 0;        /* best place to init value */
1212
1213         /* format a response */
1214
1215         iod->lsreq->rsplen = sizeof(*acc);
1216
1217         nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1218                         fcnvme_lsdesc_len(
1219                                 sizeof(struct fcnvme_ls_cr_assoc_acc)),
1220                         FCNVME_LS_CREATE_ASSOCIATION);
1221         acc->associd.desc_tag = cpu_to_be32(FCNVME_LSDESC_ASSOC_ID);
1222         acc->associd.desc_len =
1223                         fcnvme_lsdesc_len(
1224                                 sizeof(struct fcnvme_lsdesc_assoc_id));
1225         acc->associd.association_id =
1226                         cpu_to_be64(nvmet_fc_makeconnid(iod->assoc, 0));
1227         acc->connectid.desc_tag = cpu_to_be32(FCNVME_LSDESC_CONN_ID);
1228         acc->connectid.desc_len =
1229                         fcnvme_lsdesc_len(
1230                                 sizeof(struct fcnvme_lsdesc_conn_id));
1231         acc->connectid.connection_id = acc->associd.association_id;
1232 }
1233
1234 static void
1235 nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
1236                         struct nvmet_fc_ls_iod *iod)
1237 {
1238         struct fcnvme_ls_cr_conn_rqst *rqst =
1239                                 (struct fcnvme_ls_cr_conn_rqst *)iod->rqstbuf;
1240         struct fcnvme_ls_cr_conn_acc *acc =
1241                                 (struct fcnvme_ls_cr_conn_acc *)iod->rspbuf;
1242         struct nvmet_fc_tgt_queue *queue;
1243         int ret = 0;
1244
1245         memset(acc, 0, sizeof(*acc));
1246
1247         if (iod->rqstdatalen < sizeof(struct fcnvme_ls_cr_conn_rqst))
1248                 ret = VERR_CR_CONN_LEN;
1249         else if (rqst->desc_list_len !=
1250                         fcnvme_lsdesc_len(
1251                                 sizeof(struct fcnvme_ls_cr_conn_rqst)))
1252                 ret = VERR_CR_CONN_RQST_LEN;
1253         else if (rqst->associd.desc_tag != cpu_to_be32(FCNVME_LSDESC_ASSOC_ID))
1254                 ret = VERR_ASSOC_ID;
1255         else if (rqst->associd.desc_len !=
1256                         fcnvme_lsdesc_len(
1257                                 sizeof(struct fcnvme_lsdesc_assoc_id)))
1258                 ret = VERR_ASSOC_ID_LEN;
1259         else if (rqst->connect_cmd.desc_tag !=
1260                         cpu_to_be32(FCNVME_LSDESC_CREATE_CONN_CMD))
1261                 ret = VERR_CR_CONN_CMD;
1262         else if (rqst->connect_cmd.desc_len !=
1263                         fcnvme_lsdesc_len(
1264                                 sizeof(struct fcnvme_lsdesc_cr_conn_cmd)))
1265                 ret = VERR_CR_CONN_CMD_LEN;
1266         else if (!rqst->connect_cmd.ersp_ratio ||
1267                  (be16_to_cpu(rqst->connect_cmd.ersp_ratio) >=
1268                                 be16_to_cpu(rqst->connect_cmd.sqsize)))
1269                 ret = VERR_ERSP_RATIO;
1270
1271         else {
1272                 /* new io queue */
1273                 iod->assoc = nvmet_fc_find_target_assoc(tgtport,
1274                                 be64_to_cpu(rqst->associd.association_id));
1275                 if (!iod->assoc)
1276                         ret = VERR_NO_ASSOC;
1277                 else {
1278                         queue = nvmet_fc_alloc_target_queue(iod->assoc,
1279                                         be16_to_cpu(rqst->connect_cmd.qid),
1280                                         be16_to_cpu(rqst->connect_cmd.sqsize));
1281                         if (!queue)
1282                                 ret = VERR_QUEUE_ALLOC_FAIL;
1283
1284                         /* release get taken in nvmet_fc_find_target_assoc */
1285                         nvmet_fc_tgt_a_put(iod->assoc);
1286                 }
1287         }
1288
1289         if (ret) {
1290                 dev_err(tgtport->dev,
1291                         "Create Connection LS failed: %s\n",
1292                         validation_errors[ret]);
1293                 iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
1294                                 NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
1295                                 (ret == VERR_NO_ASSOC) ?
1296                                         FCNVME_RJT_RC_INV_ASSOC :
1297                                         FCNVME_RJT_RC_LOGIC,
1298                                 FCNVME_RJT_EXP_NONE, 0);
1299                 return;
1300         }
1301
1302         queue->ersp_ratio = be16_to_cpu(rqst->connect_cmd.ersp_ratio);
1303         atomic_set(&queue->connected, 1);
1304         queue->sqhd = 0;        /* best place to init value */
1305
1306         /* format a response */
1307
1308         iod->lsreq->rsplen = sizeof(*acc);
1309
1310         nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1311                         fcnvme_lsdesc_len(sizeof(struct fcnvme_ls_cr_conn_acc)),
1312                         FCNVME_LS_CREATE_CONNECTION);
1313         acc->connectid.desc_tag = cpu_to_be32(FCNVME_LSDESC_CONN_ID);
1314         acc->connectid.desc_len =
1315                         fcnvme_lsdesc_len(
1316                                 sizeof(struct fcnvme_lsdesc_conn_id));
1317         acc->connectid.connection_id =
1318                         cpu_to_be64(nvmet_fc_makeconnid(iod->assoc,
1319                                 be16_to_cpu(rqst->connect_cmd.qid)));
1320 }
1321
1322 static void
1323 nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
1324                         struct nvmet_fc_ls_iod *iod)
1325 {
1326         struct fcnvme_ls_disconnect_rqst *rqst =
1327                         (struct fcnvme_ls_disconnect_rqst *)iod->rqstbuf;
1328         struct fcnvme_ls_disconnect_acc *acc =
1329                         (struct fcnvme_ls_disconnect_acc *)iod->rspbuf;
1330         struct nvmet_fc_tgt_queue *queue = NULL;
1331         struct nvmet_fc_tgt_assoc *assoc;
1332         int ret = 0;
1333         bool del_assoc = false;
1334
1335         memset(acc, 0, sizeof(*acc));
1336
1337         if (iod->rqstdatalen < sizeof(struct fcnvme_ls_disconnect_rqst))
1338                 ret = VERR_DISCONN_LEN;
1339         else if (rqst->desc_list_len !=
1340                         fcnvme_lsdesc_len(
1341                                 sizeof(struct fcnvme_ls_disconnect_rqst)))
1342                 ret = VERR_DISCONN_RQST_LEN;
1343         else if (rqst->associd.desc_tag != cpu_to_be32(FCNVME_LSDESC_ASSOC_ID))
1344                 ret = VERR_ASSOC_ID;
1345         else if (rqst->associd.desc_len !=
1346                         fcnvme_lsdesc_len(
1347                                 sizeof(struct fcnvme_lsdesc_assoc_id)))
1348                 ret = VERR_ASSOC_ID_LEN;
1349         else if (rqst->discon_cmd.desc_tag !=
1350                         cpu_to_be32(FCNVME_LSDESC_DISCONN_CMD))
1351                 ret = VERR_DISCONN_CMD;
1352         else if (rqst->discon_cmd.desc_len !=
1353                         fcnvme_lsdesc_len(
1354                                 sizeof(struct fcnvme_lsdesc_disconn_cmd)))
1355                 ret = VERR_DISCONN_CMD_LEN;
1356         else if ((rqst->discon_cmd.scope != FCNVME_DISCONN_ASSOCIATION) &&
1357                         (rqst->discon_cmd.scope != FCNVME_DISCONN_CONNECTION))
1358                 ret = VERR_DISCONN_SCOPE;
1359         else {
1360                 /* match an active association */
1361                 assoc = nvmet_fc_find_target_assoc(tgtport,
1362                                 be64_to_cpu(rqst->associd.association_id));
1363                 iod->assoc = assoc;
1364                 if (assoc) {
1365                         if (rqst->discon_cmd.scope ==
1366                                         FCNVME_DISCONN_CONNECTION) {
1367                                 queue = nvmet_fc_find_target_queue(tgtport,
1368                                                 be64_to_cpu(
1369                                                         rqst->discon_cmd.id));
1370                                 if (!queue) {
1371                                         nvmet_fc_tgt_a_put(assoc);
1372                                         ret = VERR_NO_CONN;
1373                                 }
1374                         }
1375                 } else
1376                         ret = VERR_NO_ASSOC;
1377         }
1378
1379         if (ret) {
1380                 dev_err(tgtport->dev,
1381                         "Disconnect LS failed: %s\n",
1382                         validation_errors[ret]);
1383                 iod->lsreq->rsplen = nvmet_fc_format_rjt(acc,
1384                                 NVME_FC_MAX_LS_BUFFER_SIZE, rqst->w0.ls_cmd,
1385                                 (ret == VERR_NO_ASSOC) ?
1386                                         FCNVME_RJT_RC_INV_ASSOC :
1387                                         (ret == VERR_NO_CONN) ?
1388                                                 FCNVME_RJT_RC_INV_CONN :
1389                                                 FCNVME_RJT_RC_LOGIC,
1390                                 FCNVME_RJT_EXP_NONE, 0);
1391                 return;
1392         }
1393
1394         /* format a response */
1395
1396         iod->lsreq->rsplen = sizeof(*acc);
1397
1398         nvmet_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1399                         fcnvme_lsdesc_len(
1400                                 sizeof(struct fcnvme_ls_disconnect_acc)),
1401                         FCNVME_LS_DISCONNECT);
1402
1403
1404         /* are we to delete a Connection ID (queue) */
1405         if (queue) {
1406                 int qid = queue->qid;
1407
1408                 nvmet_fc_delete_target_queue(queue);
1409
1410                 /* release the get taken by find_target_queue */
1411                 nvmet_fc_tgt_q_put(queue);
1412
1413                 /* tear association down if io queue terminated */
1414                 if (!qid)
1415                         del_assoc = true;
1416         }
1417
1418         /* release get taken in nvmet_fc_find_target_assoc */
1419         nvmet_fc_tgt_a_put(iod->assoc);
1420
1421         if (del_assoc)
1422                 nvmet_fc_delete_target_assoc(iod->assoc);
1423 }
1424
1425
1426 /* *********************** NVME Ctrl Routines **************************** */
1427
1428
1429 static void nvmet_fc_fcp_nvme_cmd_done(struct nvmet_req *nvme_req);
1430
1431 static struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops;
1432
1433 static void
1434 nvmet_fc_xmt_ls_rsp_done(struct nvmefc_tgt_ls_req *lsreq)
1435 {
1436         struct nvmet_fc_ls_iod *iod = lsreq->nvmet_fc_private;
1437         struct nvmet_fc_tgtport *tgtport = iod->tgtport;
1438
1439         fc_dma_sync_single_for_cpu(tgtport->dev, iod->rspdma,
1440                                 NVME_FC_MAX_LS_BUFFER_SIZE, DMA_TO_DEVICE);
1441         nvmet_fc_free_ls_iod(tgtport, iod);
1442         nvmet_fc_tgtport_put(tgtport);
1443 }
1444
1445 static void
1446 nvmet_fc_xmt_ls_rsp(struct nvmet_fc_tgtport *tgtport,
1447                                 struct nvmet_fc_ls_iod *iod)
1448 {
1449         int ret;
1450
1451         fc_dma_sync_single_for_device(tgtport->dev, iod->rspdma,
1452                                   NVME_FC_MAX_LS_BUFFER_SIZE, DMA_TO_DEVICE);
1453
1454         ret = tgtport->ops->xmt_ls_rsp(&tgtport->fc_target_port, iod->lsreq);
1455         if (ret)
1456                 nvmet_fc_xmt_ls_rsp_done(iod->lsreq);
1457 }
1458
1459 /*
1460  * Actual processing routine for received FC-NVME LS Requests from the LLD
1461  */
1462 static void
1463 nvmet_fc_handle_ls_rqst(struct nvmet_fc_tgtport *tgtport,
1464                         struct nvmet_fc_ls_iod *iod)
1465 {
1466         struct fcnvme_ls_rqst_w0 *w0 =
1467                         (struct fcnvme_ls_rqst_w0 *)iod->rqstbuf;
1468
1469         iod->lsreq->nvmet_fc_private = iod;
1470         iod->lsreq->rspbuf = iod->rspbuf;
1471         iod->lsreq->rspdma = iod->rspdma;
1472         iod->lsreq->done = nvmet_fc_xmt_ls_rsp_done;
1473         /* Be preventative. handlers will later set to valid length */
1474         iod->lsreq->rsplen = 0;
1475
1476         iod->assoc = NULL;
1477
1478         /*
1479          * handlers:
1480          *   parse request input, execute the request, and format the
1481          *   LS response
1482          */
1483         switch (w0->ls_cmd) {
1484         case FCNVME_LS_CREATE_ASSOCIATION:
1485                 /* Creates Association and initial Admin Queue/Connection */
1486                 nvmet_fc_ls_create_association(tgtport, iod);
1487                 break;
1488         case FCNVME_LS_CREATE_CONNECTION:
1489                 /* Creates an IO Queue/Connection */
1490                 nvmet_fc_ls_create_connection(tgtport, iod);
1491                 break;
1492         case FCNVME_LS_DISCONNECT:
1493                 /* Terminate a Queue/Connection or the Association */
1494                 nvmet_fc_ls_disconnect(tgtport, iod);
1495                 break;
1496         default:
1497                 iod->lsreq->rsplen = nvmet_fc_format_rjt(iod->rspbuf,
1498                                 NVME_FC_MAX_LS_BUFFER_SIZE, w0->ls_cmd,
1499                                 FCNVME_RJT_RC_INVAL, FCNVME_RJT_EXP_NONE, 0);
1500         }
1501
1502         nvmet_fc_xmt_ls_rsp(tgtport, iod);
1503 }
1504
1505 /*
1506  * Actual processing routine for received FC-NVME LS Requests from the LLD
1507  */
1508 static void
1509 nvmet_fc_handle_ls_rqst_work(struct work_struct *work)
1510 {
1511         struct nvmet_fc_ls_iod *iod =
1512                 container_of(work, struct nvmet_fc_ls_iod, work);
1513         struct nvmet_fc_tgtport *tgtport = iod->tgtport;
1514
1515         nvmet_fc_handle_ls_rqst(tgtport, iod);
1516 }
1517
1518
1519 /**
1520  * nvmet_fc_rcv_ls_req - transport entry point called by an LLDD
1521  *                       upon the reception of a NVME LS request.
1522  *
1523  * The nvmet-fc layer will copy payload to an internal structure for
1524  * processing.  As such, upon completion of the routine, the LLDD may
1525  * immediately free/reuse the LS request buffer passed in the call.
1526  *
1527  * If this routine returns error, the LLDD should abort the exchange.
1528  *
1529  * @tgtport:    pointer to the (registered) target port the LS was
1530  *              received on.
1531  * @lsreq:      pointer to a lsreq request structure to be used to reference
1532  *              the exchange corresponding to the LS.
1533  * @lsreqbuf:   pointer to the buffer containing the LS Request
1534  * @lsreqbuf_len: length, in bytes, of the received LS request
1535  */
1536 int
1537 nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
1538                         struct nvmefc_tgt_ls_req *lsreq,
1539                         void *lsreqbuf, u32 lsreqbuf_len)
1540 {
1541         struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
1542         struct nvmet_fc_ls_iod *iod;
1543
1544         if (lsreqbuf_len > NVME_FC_MAX_LS_BUFFER_SIZE)
1545                 return -E2BIG;
1546
1547         if (!nvmet_fc_tgtport_get(tgtport))
1548                 return -ESHUTDOWN;
1549
1550         iod = nvmet_fc_alloc_ls_iod(tgtport);
1551         if (!iod) {
1552                 nvmet_fc_tgtport_put(tgtport);
1553                 return -ENOENT;
1554         }
1555
1556         iod->lsreq = lsreq;
1557         iod->fcpreq = NULL;
1558         memcpy(iod->rqstbuf, lsreqbuf, lsreqbuf_len);
1559         iod->rqstdatalen = lsreqbuf_len;
1560
1561         schedule_work(&iod->work);
1562
1563         return 0;
1564 }
1565 EXPORT_SYMBOL_GPL(nvmet_fc_rcv_ls_req);
1566
1567
1568 /*
1569  * **********************
1570  * Start of FCP handling
1571  * **********************
1572  */
1573
1574 static int
1575 nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
1576 {
1577         struct scatterlist *sg;
1578         struct page *page;
1579         unsigned int nent;
1580         u32 page_len, length;
1581         int i = 0;
1582
1583         length = fod->total_length;
1584         nent = DIV_ROUND_UP(length, PAGE_SIZE);
1585         sg = kmalloc_array(nent, sizeof(struct scatterlist), GFP_KERNEL);
1586         if (!sg)
1587                 goto out;
1588
1589         sg_init_table(sg, nent);
1590
1591         while (length) {
1592                 page_len = min_t(u32, length, PAGE_SIZE);
1593
1594                 page = alloc_page(GFP_KERNEL);
1595                 if (!page)
1596                         goto out_free_pages;
1597
1598                 sg_set_page(&sg[i], page, page_len, 0);
1599                 length -= page_len;
1600                 i++;
1601         }
1602
1603         fod->data_sg = sg;
1604         fod->data_sg_cnt = nent;
1605         fod->data_sg_cnt = fc_dma_map_sg(fod->tgtport->dev, sg, nent,
1606                                 ((fod->io_dir == NVMET_FCP_WRITE) ?
1607                                         DMA_FROM_DEVICE : DMA_TO_DEVICE));
1608                                 /* note: write from initiator perspective */
1609
1610         return 0;
1611
1612 out_free_pages:
1613         while (i > 0) {
1614                 i--;
1615                 __free_page(sg_page(&sg[i]));
1616         }
1617         kfree(sg);
1618         fod->data_sg = NULL;
1619         fod->data_sg_cnt = 0;
1620 out:
1621         return NVME_SC_INTERNAL;
1622 }
1623
1624 static void
1625 nvmet_fc_free_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
1626 {
1627         struct scatterlist *sg;
1628         int count;
1629
1630         if (!fod->data_sg || !fod->data_sg_cnt)
1631                 return;
1632
1633         fc_dma_unmap_sg(fod->tgtport->dev, fod->data_sg, fod->data_sg_cnt,
1634                                 ((fod->io_dir == NVMET_FCP_WRITE) ?
1635                                         DMA_FROM_DEVICE : DMA_TO_DEVICE));
1636         for_each_sg(fod->data_sg, sg, fod->data_sg_cnt, count)
1637                 __free_page(sg_page(sg));
1638         kfree(fod->data_sg);
1639         fod->data_sg = NULL;
1640         fod->data_sg_cnt = 0;
1641 }
1642
1643
1644 static bool
1645 queue_90percent_full(struct nvmet_fc_tgt_queue *q, u32 sqhd)
1646 {
1647         u32 sqtail, used;
1648
1649         /* egad, this is ugly. And sqtail is just a best guess */
1650         sqtail = atomic_read(&q->sqtail) % q->sqsize;
1651
1652         used = (sqtail < sqhd) ? (sqtail + q->sqsize - sqhd) : (sqtail - sqhd);
1653         return ((used * 10) >= (((u32)(q->sqsize - 1) * 9)));
1654 }
1655
1656 /*
1657  * Prep RSP payload.
1658  * May be a NVMET_FCOP_RSP or NVMET_FCOP_READDATA_RSP op
1659  */
1660 static void
1661 nvmet_fc_prep_fcp_rsp(struct nvmet_fc_tgtport *tgtport,
1662                                 struct nvmet_fc_fcp_iod *fod)
1663 {
1664         struct nvme_fc_ersp_iu *ersp = &fod->rspiubuf;
1665         struct nvme_common_command *sqe = &fod->cmdiubuf.sqe.common;
1666         struct nvme_completion *cqe = &ersp->cqe;
1667         u32 *cqewd = (u32 *)cqe;
1668         bool send_ersp = false;
1669         u32 rsn, rspcnt, xfr_length;
1670
1671         if (fod->fcpreq->op == NVMET_FCOP_READDATA_RSP)
1672                 xfr_length = fod->total_length;
1673         else
1674                 xfr_length = fod->offset;
1675
1676         /*
1677          * check to see if we can send a 0's rsp.
1678          *   Note: to send a 0's response, the NVME-FC host transport will
1679          *   recreate the CQE. The host transport knows: sq id, SQHD (last
1680          *   seen in an ersp), and command_id. Thus it will create a
1681          *   zero-filled CQE with those known fields filled in. Transport
1682          *   must send an ersp for any condition where the cqe won't match
1683          *   this.
1684          *
1685          * Here are the FC-NVME mandated cases where we must send an ersp:
1686          *  every N responses, where N=ersp_ratio
1687          *  force fabric commands to send ersp's (not in FC-NVME but good
1688          *    practice)
1689          *  normal cmds: any time status is non-zero, or status is zero
1690          *     but words 0 or 1 are non-zero.
1691          *  the SQ is 90% or more full
1692          *  the cmd is a fused command
1693          *  transferred data length not equal to cmd iu length
1694          */
1695         rspcnt = atomic_inc_return(&fod->queue->zrspcnt);
1696         if (!(rspcnt % fod->queue->ersp_ratio) ||
1697             sqe->opcode == nvme_fabrics_command ||
1698             xfr_length != fod->total_length ||
1699             (le16_to_cpu(cqe->status) & 0xFFFE) || cqewd[0] || cqewd[1] ||
1700             (sqe->flags & (NVME_CMD_FUSE_FIRST | NVME_CMD_FUSE_SECOND)) ||
1701             queue_90percent_full(fod->queue, le16_to_cpu(cqe->sq_head)))
1702                 send_ersp = true;
1703
1704         /* re-set the fields */
1705         fod->fcpreq->rspaddr = ersp;
1706         fod->fcpreq->rspdma = fod->rspdma;
1707
1708         if (!send_ersp) {
1709                 memset(ersp, 0, NVME_FC_SIZEOF_ZEROS_RSP);
1710                 fod->fcpreq->rsplen = NVME_FC_SIZEOF_ZEROS_RSP;
1711         } else {
1712                 ersp->iu_len = cpu_to_be16(sizeof(*ersp)/sizeof(u32));
1713                 rsn = atomic_inc_return(&fod->queue->rsn);
1714                 ersp->rsn = cpu_to_be32(rsn);
1715                 ersp->xfrd_len = cpu_to_be32(xfr_length);
1716                 fod->fcpreq->rsplen = sizeof(*ersp);
1717         }
1718
1719         fc_dma_sync_single_for_device(tgtport->dev, fod->rspdma,
1720                                   sizeof(fod->rspiubuf), DMA_TO_DEVICE);
1721 }
1722
1723 static void nvmet_fc_xmt_fcp_op_done(struct nvmefc_tgt_fcp_req *fcpreq);
1724
1725 static void
1726 nvmet_fc_abort_op(struct nvmet_fc_tgtport *tgtport,
1727                                 struct nvmet_fc_fcp_iod *fod)
1728 {
1729         struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
1730
1731         /* data no longer needed */
1732         nvmet_fc_free_tgt_pgs(fod);
1733
1734         /*
1735          * if an ABTS was received or we issued the fcp_abort early
1736          * don't call abort routine again.
1737          */
1738         /* no need to take lock - lock was taken earlier to get here */
1739         if (!fod->aborted)
1740                 tgtport->ops->fcp_abort(&tgtport->fc_target_port, fcpreq);
1741
1742         nvmet_fc_free_fcp_iod(fod->queue, fod);
1743 }
1744
1745 static void
1746 nvmet_fc_xmt_fcp_rsp(struct nvmet_fc_tgtport *tgtport,
1747                                 struct nvmet_fc_fcp_iod *fod)
1748 {
1749         int ret;
1750
1751         fod->fcpreq->op = NVMET_FCOP_RSP;
1752         fod->fcpreq->timeout = 0;
1753
1754         nvmet_fc_prep_fcp_rsp(tgtport, fod);
1755
1756         ret = tgtport->ops->fcp_op(&tgtport->fc_target_port, fod->fcpreq);
1757         if (ret)
1758                 nvmet_fc_abort_op(tgtport, fod);
1759 }
1760
1761 static void
1762 nvmet_fc_transfer_fcp_data(struct nvmet_fc_tgtport *tgtport,
1763                                 struct nvmet_fc_fcp_iod *fod, u8 op)
1764 {
1765         struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
1766         struct scatterlist *sg, *datasg;
1767         unsigned long flags;
1768         u32 tlen, sg_off;
1769         int ret;
1770
1771         fcpreq->op = op;
1772         fcpreq->offset = fod->offset;
1773         fcpreq->timeout = NVME_FC_TGTOP_TIMEOUT_SEC;
1774         tlen = min_t(u32, (NVMET_FC_MAX_KB_PER_XFR * 1024),
1775                         (fod->total_length - fod->offset));
1776         tlen = min_t(u32, tlen, NVME_FC_MAX_SEGMENTS * PAGE_SIZE);
1777         tlen = min_t(u32, tlen, fod->tgtport->ops->max_sgl_segments
1778                                         * PAGE_SIZE);
1779         fcpreq->transfer_length = tlen;
1780         fcpreq->transferred_length = 0;
1781         fcpreq->fcp_error = 0;
1782         fcpreq->rsplen = 0;
1783
1784         fcpreq->sg_cnt = 0;
1785
1786         datasg = fod->next_sg;
1787         sg_off = fod->next_sg_offset;
1788
1789         for (sg = fcpreq->sg ; tlen; sg++) {
1790                 *sg = *datasg;
1791                 if (sg_off) {
1792                         sg->offset += sg_off;
1793                         sg->length -= sg_off;
1794                         sg->dma_address += sg_off;
1795                         sg_off = 0;
1796                 }
1797                 if (tlen < sg->length) {
1798                         sg->length = tlen;
1799                         fod->next_sg = datasg;
1800                         fod->next_sg_offset += tlen;
1801                 } else if (tlen == sg->length) {
1802                         fod->next_sg_offset = 0;
1803                         fod->next_sg = sg_next(datasg);
1804                 } else {
1805                         fod->next_sg_offset = 0;
1806                         datasg = sg_next(datasg);
1807                 }
1808                 tlen -= sg->length;
1809                 fcpreq->sg_cnt++;
1810         }
1811
1812         /*
1813          * If the last READDATA request: check if LLDD supports
1814          * combined xfr with response.
1815          */
1816         if ((op == NVMET_FCOP_READDATA) &&
1817             ((fod->offset + fcpreq->transfer_length) == fod->total_length) &&
1818             (tgtport->ops->target_features & NVMET_FCTGTFEAT_READDATA_RSP)) {
1819                 fcpreq->op = NVMET_FCOP_READDATA_RSP;
1820                 nvmet_fc_prep_fcp_rsp(tgtport, fod);
1821         }
1822
1823         ret = tgtport->ops->fcp_op(&tgtport->fc_target_port, fod->fcpreq);
1824         if (ret) {
1825                 /*
1826                  * should be ok to set w/o lock as its in the thread of
1827                  * execution (not an async timer routine) and doesn't
1828                  * contend with any clearing action
1829                  */
1830                 fod->abort = true;
1831
1832                 if (op == NVMET_FCOP_WRITEDATA) {
1833                         spin_lock_irqsave(&fod->flock, flags);
1834                         fod->writedataactive = false;
1835                         spin_unlock_irqrestore(&fod->flock, flags);
1836                         nvmet_req_complete(&fod->req,
1837                                         NVME_SC_FC_TRANSPORT_ERROR);
1838                 } else /* NVMET_FCOP_READDATA or NVMET_FCOP_READDATA_RSP */ {
1839                         fcpreq->fcp_error = ret;
1840                         fcpreq->transferred_length = 0;
1841                         nvmet_fc_xmt_fcp_op_done(fod->fcpreq);
1842                 }
1843         }
1844 }
1845
1846 static inline bool
1847 __nvmet_fc_fod_op_abort(struct nvmet_fc_fcp_iod *fod, bool abort)
1848 {
1849         struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
1850         struct nvmet_fc_tgtport *tgtport = fod->tgtport;
1851
1852         /* if in the middle of an io and we need to tear down */
1853         if (abort) {
1854                 if (fcpreq->op == NVMET_FCOP_WRITEDATA) {
1855                         nvmet_req_complete(&fod->req,
1856                                         NVME_SC_FC_TRANSPORT_ERROR);
1857                         return true;
1858                 }
1859
1860                 nvmet_fc_abort_op(tgtport, fod);
1861                 return true;
1862         }
1863
1864         return false;
1865 }
1866
1867 /*
1868  * actual done handler for FCP operations when completed by the lldd
1869  */
1870 static void
1871 nvmet_fc_fod_op_done(struct nvmet_fc_fcp_iod *fod)
1872 {
1873         struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
1874         struct nvmet_fc_tgtport *tgtport = fod->tgtport;
1875         unsigned long flags;
1876         bool abort;
1877
1878         spin_lock_irqsave(&fod->flock, flags);
1879         abort = fod->abort;
1880         fod->writedataactive = false;
1881         spin_unlock_irqrestore(&fod->flock, flags);
1882
1883         switch (fcpreq->op) {
1884
1885         case NVMET_FCOP_WRITEDATA:
1886                 if (__nvmet_fc_fod_op_abort(fod, abort))
1887                         return;
1888                 if (fcpreq->fcp_error ||
1889                     fcpreq->transferred_length != fcpreq->transfer_length) {
1890                         spin_lock(&fod->flock);
1891                         fod->abort = true;
1892                         spin_unlock(&fod->flock);
1893
1894                         nvmet_req_complete(&fod->req,
1895                                         NVME_SC_FC_TRANSPORT_ERROR);
1896                         return;
1897                 }
1898
1899                 fod->offset += fcpreq->transferred_length;
1900                 if (fod->offset != fod->total_length) {
1901                         spin_lock_irqsave(&fod->flock, flags);
1902                         fod->writedataactive = true;
1903                         spin_unlock_irqrestore(&fod->flock, flags);
1904
1905                         /* transfer the next chunk */
1906                         nvmet_fc_transfer_fcp_data(tgtport, fod,
1907                                                 NVMET_FCOP_WRITEDATA);
1908                         return;
1909                 }
1910
1911                 /* data transfer complete, resume with nvmet layer */
1912
1913                 fod->req.execute(&fod->req);
1914
1915                 break;
1916
1917         case NVMET_FCOP_READDATA:
1918         case NVMET_FCOP_READDATA_RSP:
1919                 if (__nvmet_fc_fod_op_abort(fod, abort))
1920                         return;
1921                 if (fcpreq->fcp_error ||
1922                     fcpreq->transferred_length != fcpreq->transfer_length) {
1923                         nvmet_fc_abort_op(tgtport, fod);
1924                         return;
1925                 }
1926
1927                 /* success */
1928
1929                 if (fcpreq->op == NVMET_FCOP_READDATA_RSP) {
1930                         /* data no longer needed */
1931                         nvmet_fc_free_tgt_pgs(fod);
1932                         nvmet_fc_free_fcp_iod(fod->queue, fod);
1933                         return;
1934                 }
1935
1936                 fod->offset += fcpreq->transferred_length;
1937                 if (fod->offset != fod->total_length) {
1938                         /* transfer the next chunk */
1939                         nvmet_fc_transfer_fcp_data(tgtport, fod,
1940                                                 NVMET_FCOP_READDATA);
1941                         return;
1942                 }
1943
1944                 /* data transfer complete, send response */
1945
1946                 /* data no longer needed */
1947                 nvmet_fc_free_tgt_pgs(fod);
1948
1949                 nvmet_fc_xmt_fcp_rsp(tgtport, fod);
1950
1951                 break;
1952
1953         case NVMET_FCOP_RSP:
1954                 if (__nvmet_fc_fod_op_abort(fod, abort))
1955                         return;
1956                 nvmet_fc_free_fcp_iod(fod->queue, fod);
1957                 break;
1958
1959         default:
1960                 break;
1961         }
1962 }
1963
1964 static void
1965 nvmet_fc_fcp_rqst_op_done_work(struct work_struct *work)
1966 {
1967         struct nvmet_fc_fcp_iod *fod =
1968                 container_of(work, struct nvmet_fc_fcp_iod, done_work);
1969
1970         nvmet_fc_fod_op_done(fod);
1971 }
1972
1973 static void
1974 nvmet_fc_xmt_fcp_op_done(struct nvmefc_tgt_fcp_req *fcpreq)
1975 {
1976         struct nvmet_fc_fcp_iod *fod = fcpreq->nvmet_fc_private;
1977         struct nvmet_fc_tgt_queue *queue = fod->queue;
1978
1979         if (fod->tgtport->ops->target_features & NVMET_FCTGTFEAT_OPDONE_IN_ISR)
1980                 /* context switch so completion is not in ISR context */
1981                 queue_work_on(queue->cpu, queue->work_q, &fod->done_work);
1982         else
1983                 nvmet_fc_fod_op_done(fod);
1984 }
1985
1986 /*
1987  * actual completion handler after execution by the nvmet layer
1988  */
1989 static void
1990 __nvmet_fc_fcp_nvme_cmd_done(struct nvmet_fc_tgtport *tgtport,
1991                         struct nvmet_fc_fcp_iod *fod, int status)
1992 {
1993         struct nvme_common_command *sqe = &fod->cmdiubuf.sqe.common;
1994         struct nvme_completion *cqe = &fod->rspiubuf.cqe;
1995         unsigned long flags;
1996         bool abort;
1997
1998         spin_lock_irqsave(&fod->flock, flags);
1999         abort = fod->abort;
2000         spin_unlock_irqrestore(&fod->flock, flags);
2001
2002         /* if we have a CQE, snoop the last sq_head value */
2003         if (!status)
2004                 fod->queue->sqhd = cqe->sq_head;
2005
2006         if (abort) {
2007                 nvmet_fc_abort_op(tgtport, fod);
2008                 return;
2009         }
2010
2011         /* if an error handling the cmd post initial parsing */
2012         if (status) {
2013                 /* fudge up a failed CQE status for our transport error */
2014                 memset(cqe, 0, sizeof(*cqe));
2015                 cqe->sq_head = fod->queue->sqhd;        /* echo last cqe sqhd */
2016                 cqe->sq_id = cpu_to_le16(fod->queue->qid);
2017                 cqe->command_id = sqe->command_id;
2018                 cqe->status = cpu_to_le16(status);
2019         } else {
2020
2021                 /*
2022                  * try to push the data even if the SQE status is non-zero.
2023                  * There may be a status where data still was intended to
2024                  * be moved
2025                  */
2026                 if ((fod->io_dir == NVMET_FCP_READ) && (fod->data_sg_cnt)) {
2027                         /* push the data over before sending rsp */
2028                         nvmet_fc_transfer_fcp_data(tgtport, fod,
2029                                                 NVMET_FCOP_READDATA);
2030                         return;
2031                 }
2032
2033                 /* writes & no data - fall thru */
2034         }
2035
2036         /* data no longer needed */
2037         nvmet_fc_free_tgt_pgs(fod);
2038
2039         nvmet_fc_xmt_fcp_rsp(tgtport, fod);
2040 }
2041
2042
2043 static void
2044 nvmet_fc_fcp_nvme_cmd_done(struct nvmet_req *nvme_req)
2045 {
2046         struct nvmet_fc_fcp_iod *fod = nvmet_req_to_fod(nvme_req);
2047         struct nvmet_fc_tgtport *tgtport = fod->tgtport;
2048
2049         __nvmet_fc_fcp_nvme_cmd_done(tgtport, fod, 0);
2050 }
2051
2052
2053 /*
2054  * Actual processing routine for received FC-NVME LS Requests from the LLD
2055  */
2056 static void
2057 nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
2058                         struct nvmet_fc_fcp_iod *fod)
2059 {
2060         struct nvme_fc_cmd_iu *cmdiu = &fod->cmdiubuf;
2061         int ret;
2062
2063         /*
2064          * Fused commands are currently not supported in the linux
2065          * implementation.
2066          *
2067          * As such, the implementation of the FC transport does not
2068          * look at the fused commands and order delivery to the upper
2069          * layer until we have both based on csn.
2070          */
2071
2072         fod->fcpreq->done = nvmet_fc_xmt_fcp_op_done;
2073
2074         fod->total_length = be32_to_cpu(cmdiu->data_len);
2075         if (cmdiu->flags & FCNVME_CMD_FLAGS_WRITE) {
2076                 fod->io_dir = NVMET_FCP_WRITE;
2077                 if (!nvme_is_write(&cmdiu->sqe))
2078                         goto transport_error;
2079         } else if (cmdiu->flags & FCNVME_CMD_FLAGS_READ) {
2080                 fod->io_dir = NVMET_FCP_READ;
2081                 if (nvme_is_write(&cmdiu->sqe))
2082                         goto transport_error;
2083         } else {
2084                 fod->io_dir = NVMET_FCP_NODATA;
2085                 if (fod->total_length)
2086                         goto transport_error;
2087         }
2088
2089         fod->req.cmd = &fod->cmdiubuf.sqe;
2090         fod->req.rsp = &fod->rspiubuf.cqe;
2091         fod->req.port = fod->queue->port;
2092
2093         /* ensure nvmet handlers will set cmd handler callback */
2094         fod->req.execute = NULL;
2095
2096         /* clear any response payload */
2097         memset(&fod->rspiubuf, 0, sizeof(fod->rspiubuf));
2098
2099         ret = nvmet_req_init(&fod->req,
2100                                 &fod->queue->nvme_cq,
2101                                 &fod->queue->nvme_sq,
2102                                 &nvmet_fc_tgt_fcp_ops);
2103         if (!ret) {     /* bad SQE content or invalid ctrl state */
2104                 nvmet_fc_abort_op(tgtport, fod);
2105                 return;
2106         }
2107
2108         /* keep a running counter of tail position */
2109         atomic_inc(&fod->queue->sqtail);
2110
2111         fod->data_sg = NULL;
2112         fod->data_sg_cnt = 0;
2113         if (fod->total_length) {
2114                 ret = nvmet_fc_alloc_tgt_pgs(fod);
2115                 if (ret) {
2116                         nvmet_req_complete(&fod->req, ret);
2117                         return;
2118                 }
2119         }
2120         fod->req.sg = fod->data_sg;
2121         fod->req.sg_cnt = fod->data_sg_cnt;
2122         fod->offset = 0;
2123         fod->next_sg = fod->data_sg;
2124         fod->next_sg_offset = 0;
2125
2126         if (fod->io_dir == NVMET_FCP_WRITE) {
2127                 /* pull the data over before invoking nvmet layer */
2128                 nvmet_fc_transfer_fcp_data(tgtport, fod, NVMET_FCOP_WRITEDATA);
2129                 return;
2130         }
2131
2132         /*
2133          * Reads or no data:
2134          *
2135          * can invoke the nvmet_layer now. If read data, cmd completion will
2136          * push the data
2137          */
2138
2139         fod->req.execute(&fod->req);
2140
2141         return;
2142
2143 transport_error:
2144         nvmet_fc_abort_op(tgtport, fod);
2145 }
2146
2147 /*
2148  * Actual processing routine for received FC-NVME LS Requests from the LLD
2149  */
2150 static void
2151 nvmet_fc_handle_fcp_rqst_work(struct work_struct *work)
2152 {
2153         struct nvmet_fc_fcp_iod *fod =
2154                 container_of(work, struct nvmet_fc_fcp_iod, work);
2155         struct nvmet_fc_tgtport *tgtport = fod->tgtport;
2156
2157         nvmet_fc_handle_fcp_rqst(tgtport, fod);
2158 }
2159
2160 /**
2161  * nvmet_fc_rcv_fcp_req - transport entry point called by an LLDD
2162  *                       upon the reception of a NVME FCP CMD IU.
2163  *
2164  * Pass a FC-NVME FCP CMD IU received from the FC link to the nvmet-fc
2165  * layer for processing.
2166  *
2167  * The nvmet-fc layer will copy cmd payload to an internal structure for
2168  * processing.  As such, upon completion of the routine, the LLDD may
2169  * immediately free/reuse the CMD IU buffer passed in the call.
2170  *
2171  * If this routine returns error, the lldd should abort the exchange.
2172  *
2173  * @target_port: pointer to the (registered) target port the FCP CMD IU
2174  *              was received on.
2175  * @fcpreq:     pointer to a fcpreq request structure to be used to reference
2176  *              the exchange corresponding to the FCP Exchange.
2177  * @cmdiubuf:   pointer to the buffer containing the FCP CMD IU
2178  * @cmdiubuf_len: length, in bytes, of the received FCP CMD IU
2179  */
2180 int
2181 nvmet_fc_rcv_fcp_req(struct nvmet_fc_target_port *target_port,
2182                         struct nvmefc_tgt_fcp_req *fcpreq,
2183                         void *cmdiubuf, u32 cmdiubuf_len)
2184 {
2185         struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
2186         struct nvme_fc_cmd_iu *cmdiu = cmdiubuf;
2187         struct nvmet_fc_tgt_queue *queue;
2188         struct nvmet_fc_fcp_iod *fod;
2189
2190         /* validate iu, so the connection id can be used to find the queue */
2191         if ((cmdiubuf_len != sizeof(*cmdiu)) ||
2192                         (cmdiu->scsi_id != NVME_CMD_SCSI_ID) ||
2193                         (cmdiu->fc_id != NVME_CMD_FC_ID) ||
2194                         (be16_to_cpu(cmdiu->iu_len) != (sizeof(*cmdiu)/4)))
2195                 return -EIO;
2196
2197         queue = nvmet_fc_find_target_queue(tgtport,
2198                                 be64_to_cpu(cmdiu->connection_id));
2199         if (!queue)
2200                 return -ENOTCONN;
2201
2202         /*
2203          * note: reference taken by find_target_queue
2204          * After successful fod allocation, the fod will inherit the
2205          * ownership of that reference and will remove the reference
2206          * when the fod is freed.
2207          */
2208
2209         fod = nvmet_fc_alloc_fcp_iod(queue);
2210         if (!fod) {
2211                 /* release the queue lookup reference */
2212                 nvmet_fc_tgt_q_put(queue);
2213                 return -ENOENT;
2214         }
2215
2216         fcpreq->nvmet_fc_private = fod;
2217         fod->fcpreq = fcpreq;
2218         /*
2219          * put all admin cmds on hw queue id 0. All io commands go to
2220          * the respective hw queue based on a modulo basis
2221          */
2222         fcpreq->hwqid = queue->qid ?
2223                         ((queue->qid - 1) % tgtport->ops->max_hw_queues) : 0;
2224         memcpy(&fod->cmdiubuf, cmdiubuf, cmdiubuf_len);
2225
2226         if (tgtport->ops->target_features & NVMET_FCTGTFEAT_CMD_IN_ISR)
2227                 queue_work_on(queue->cpu, queue->work_q, &fod->work);
2228         else
2229                 nvmet_fc_handle_fcp_rqst(tgtport, fod);
2230
2231         return 0;
2232 }
2233 EXPORT_SYMBOL_GPL(nvmet_fc_rcv_fcp_req);
2234
2235 /**
2236  * nvmet_fc_rcv_fcp_abort - transport entry point called by an LLDD
2237  *                       upon the reception of an ABTS for a FCP command
2238  *
2239  * Notify the transport that an ABTS has been received for a FCP command
2240  * that had been given to the transport via nvmet_fc_rcv_fcp_req(). The
2241  * LLDD believes the command is still being worked on
2242  * (template_ops->fcp_req_release() has not been called).
2243  *
2244  * The transport will wait for any outstanding work (an op to the LLDD,
2245  * which the lldd should complete with error due to the ABTS; or the
2246  * completion from the nvmet layer of the nvme command), then will
2247  * stop processing and call the nvmet_fc_rcv_fcp_req() callback to
2248  * return the i/o context to the LLDD.  The LLDD may send the BA_ACC
2249  * to the ABTS either after return from this function (assuming any
2250  * outstanding op work has been terminated) or upon the callback being
2251  * called.
2252  *
2253  * @target_port: pointer to the (registered) target port the FCP CMD IU
2254  *              was received on.
2255  * @fcpreq:     pointer to the fcpreq request structure that corresponds
2256  *              to the exchange that received the ABTS.
2257  */
2258 void
2259 nvmet_fc_rcv_fcp_abort(struct nvmet_fc_target_port *target_port,
2260                         struct nvmefc_tgt_fcp_req *fcpreq)
2261 {
2262         struct nvmet_fc_fcp_iod *fod = fcpreq->nvmet_fc_private;
2263         struct nvmet_fc_tgt_queue *queue;
2264         unsigned long flags;
2265
2266         if (!fod || fod->fcpreq != fcpreq)
2267                 /* job appears to have already completed, ignore abort */
2268                 return;
2269
2270         queue = fod->queue;
2271
2272         spin_lock_irqsave(&queue->qlock, flags);
2273         if (fod->active) {
2274                 /*
2275                  * mark as abort. The abort handler, invoked upon completion
2276                  * of any work, will detect the aborted status and do the
2277                  * callback.
2278                  */
2279                 spin_lock(&fod->flock);
2280                 fod->abort = true;
2281                 fod->aborted = true;
2282                 spin_unlock(&fod->flock);
2283         }
2284         spin_unlock_irqrestore(&queue->qlock, flags);
2285 }
2286 EXPORT_SYMBOL_GPL(nvmet_fc_rcv_fcp_abort);
2287
2288 enum {
2289         FCT_TRADDR_ERR          = 0,
2290         FCT_TRADDR_WWNN         = 1 << 0,
2291         FCT_TRADDR_WWPN         = 1 << 1,
2292 };
2293
2294 struct nvmet_fc_traddr {
2295         u64     nn;
2296         u64     pn;
2297 };
2298
2299 static const match_table_t traddr_opt_tokens = {
2300         { FCT_TRADDR_WWNN,      "nn-%s"         },
2301         { FCT_TRADDR_WWPN,      "pn-%s"         },
2302         { FCT_TRADDR_ERR,       NULL            }
2303 };
2304
2305 static int
2306 nvmet_fc_parse_traddr(struct nvmet_fc_traddr *traddr, char *buf)
2307 {
2308         substring_t args[MAX_OPT_ARGS];
2309         char *options, *o, *p;
2310         int token, ret = 0;
2311         u64 token64;
2312
2313         options = o = kstrdup(buf, GFP_KERNEL);
2314         if (!options)
2315                 return -ENOMEM;
2316
2317         while ((p = strsep(&o, ":\n")) != NULL) {
2318                 if (!*p)
2319                         continue;
2320
2321                 token = match_token(p, traddr_opt_tokens, args);
2322                 switch (token) {
2323                 case FCT_TRADDR_WWNN:
2324                         if (match_u64(args, &token64)) {
2325                                 ret = -EINVAL;
2326                                 goto out;
2327                         }
2328                         traddr->nn = token64;
2329                         break;
2330                 case FCT_TRADDR_WWPN:
2331                         if (match_u64(args, &token64)) {
2332                                 ret = -EINVAL;
2333                                 goto out;
2334                         }
2335                         traddr->pn = token64;
2336                         break;
2337                 default:
2338                         pr_warn("unknown traddr token or missing value '%s'\n",
2339                                         p);
2340                         ret = -EINVAL;
2341                         goto out;
2342                 }
2343         }
2344
2345 out:
2346         kfree(options);
2347         return ret;
2348 }
2349
2350 static int
2351 nvmet_fc_add_port(struct nvmet_port *port)
2352 {
2353         struct nvmet_fc_tgtport *tgtport;
2354         struct nvmet_fc_traddr traddr = { 0L, 0L };
2355         unsigned long flags;
2356         int ret;
2357
2358         /* validate the address info */
2359         if ((port->disc_addr.trtype != NVMF_TRTYPE_FC) ||
2360             (port->disc_addr.adrfam != NVMF_ADDR_FAMILY_FC))
2361                 return -EINVAL;
2362
2363         /* map the traddr address info to a target port */
2364
2365         ret = nvmet_fc_parse_traddr(&traddr, port->disc_addr.traddr);
2366         if (ret)
2367                 return ret;
2368
2369         ret = -ENXIO;
2370         spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
2371         list_for_each_entry(tgtport, &nvmet_fc_target_list, tgt_list) {
2372                 if ((tgtport->fc_target_port.node_name == traddr.nn) &&
2373                     (tgtport->fc_target_port.port_name == traddr.pn)) {
2374                         /* a FC port can only be 1 nvmet port id */
2375                         if (!tgtport->port) {
2376                                 tgtport->port = port;
2377                                 port->priv = tgtport;
2378                                 nvmet_fc_tgtport_get(tgtport);
2379                                 ret = 0;
2380                         } else
2381                                 ret = -EALREADY;
2382                         break;
2383                 }
2384         }
2385         spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
2386         return ret;
2387 }
2388
2389 static void
2390 nvmet_fc_remove_port(struct nvmet_port *port)
2391 {
2392         struct nvmet_fc_tgtport *tgtport = port->priv;
2393         unsigned long flags;
2394
2395         spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
2396         if (tgtport->port == port) {
2397                 nvmet_fc_tgtport_put(tgtport);
2398                 tgtport->port = NULL;
2399         }
2400         spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
2401 }
2402
2403 static struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
2404         .owner                  = THIS_MODULE,
2405         .type                   = NVMF_TRTYPE_FC,
2406         .msdbd                  = 1,
2407         .add_port               = nvmet_fc_add_port,
2408         .remove_port            = nvmet_fc_remove_port,
2409         .queue_response         = nvmet_fc_fcp_nvme_cmd_done,
2410         .delete_ctrl            = nvmet_fc_delete_ctrl,
2411 };
2412
2413 static int __init nvmet_fc_init_module(void)
2414 {
2415         return nvmet_register_transport(&nvmet_fc_tgt_fcp_ops);
2416 }
2417
2418 static void __exit nvmet_fc_exit_module(void)
2419 {
2420         /* sanity check - all lports should be removed */
2421         if (!list_empty(&nvmet_fc_target_list))
2422                 pr_warn("%s: targetport list not empty\n", __func__);
2423
2424         nvmet_unregister_transport(&nvmet_fc_tgt_fcp_ops);
2425
2426         ida_destroy(&nvmet_fc_tgtport_cnt);
2427 }
2428
2429 module_init(nvmet_fc_init_module);
2430 module_exit(nvmet_fc_exit_module);
2431
2432 MODULE_LICENSE("GPL v2");