linux/drivers/nvme/target/fc.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (c) 2016 Avago Technologies.  All rights reserved.
   4 */
   5#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
   6#include <linux/module.h>
   7#include <linux/slab.h>
   8#include <linux/blk-mq.h>
   9#include <linux/parser.h>
  10#include <linux/random.h>
  11#include <uapi/scsi/fc/fc_fs.h>
  12#include <uapi/scsi/fc/fc_els.h>
  13
  14#include "nvmet.h"
  15#include <linux/nvme-fc-driver.h>
  16#include <linux/nvme-fc.h>
  17#include "../host/fc.h"
  18
  19
  20/* *************************** Data Structures/Defines ****************** */
  21
  22
  23#define NVMET_LS_CTX_COUNT              256
  24
  25struct nvmet_fc_tgtport;
  26struct nvmet_fc_tgt_assoc;
  27
  28struct nvmet_fc_ls_iod {                /* for an LS RQST RCV */
  29        struct nvmefc_ls_rsp            *lsrsp;
  30        struct nvmefc_tgt_fcp_req       *fcpreq;        /* only if RS */
  31
  32        struct list_head                ls_rcv_list; /* tgtport->ls_rcv_list */
  33
  34        struct nvmet_fc_tgtport         *tgtport;
  35        struct nvmet_fc_tgt_assoc       *assoc;
  36        void                            *hosthandle;
  37
  38        union nvmefc_ls_requests        *rqstbuf;
  39        union nvmefc_ls_responses       *rspbuf;
  40        u16                             rqstdatalen;
  41        dma_addr_t                      rspdma;
  42
  43        struct scatterlist              sg[2];
  44
  45        struct work_struct              work;
  46} __aligned(sizeof(unsigned long long));
  47
  48struct nvmet_fc_ls_req_op {             /* for an LS RQST XMT */
  49        struct nvmefc_ls_req            ls_req;
  50
  51        struct nvmet_fc_tgtport         *tgtport;
  52        void                            *hosthandle;
  53
  54        int                             ls_error;
  55        struct list_head                lsreq_list; /* tgtport->ls_req_list */
  56        bool                            req_queued;
  57};
  58
  59
  60/* desired maximum for a single sequence - if sg list allows it */
  61#define NVMET_FC_MAX_SEQ_LENGTH         (256 * 1024)
  62
  63enum nvmet_fcp_datadir {
  64        NVMET_FCP_NODATA,
  65        NVMET_FCP_WRITE,
  66        NVMET_FCP_READ,
  67        NVMET_FCP_ABORTED,
  68};
  69
  70struct 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              *next_sg;
  77        struct scatterlist              *data_sg;
  78        int                             data_sg_cnt;
  79        u32                             offset;
  80        enum nvmet_fcp_datadir          io_dir;
  81        bool                            active;
  82        bool                            abort;
  83        bool                            aborted;
  84        bool                            writedataactive;
  85        spinlock_t                      flock;
  86
  87        struct nvmet_req                req;
  88        struct work_struct              defer_work;
  89
  90        struct nvmet_fc_tgtport         *tgtport;
  91        struct nvmet_fc_tgt_queue       *queue;
  92
  93        struct list_head                fcp_list;       /* tgtport->fcp_list */
  94};
  95
  96struct nvmet_fc_tgtport {
  97        struct nvmet_fc_target_port     fc_target_port;
  98
  99        struct list_head                tgt_list; /* nvmet_fc_target_list */
 100        struct device                   *dev;   /* dev for dma mapping */
 101        struct nvmet_fc_target_template *ops;
 102
 103        struct nvmet_fc_ls_iod          *iod;
 104        spinlock_t                      lock;
 105        struct list_head                ls_rcv_list;
 106        struct list_head                ls_req_list;
 107        struct list_head                ls_busylist;
 108        struct list_head                assoc_list;
 109        struct list_head                host_list;
 110        struct ida                      assoc_cnt;
 111        struct nvmet_fc_port_entry      *pe;
 112        struct kref                     ref;
 113        u32                             max_sg_cnt;
 114};
 115
 116struct nvmet_fc_port_entry {
 117        struct nvmet_fc_tgtport         *tgtport;
 118        struct nvmet_port               *port;
 119        u64                             node_name;
 120        u64                             port_name;
 121        struct list_head                pe_list;
 122};
 123
 124struct nvmet_fc_defer_fcp_req {
 125        struct list_head                req_list;
 126        struct nvmefc_tgt_fcp_req       *fcp_req;
 127};
 128
 129struct nvmet_fc_tgt_queue {
 130        bool                            ninetypercent;
 131        u16                             qid;
 132        u16                             sqsize;
 133        u16                             ersp_ratio;
 134        __le16                          sqhd;
 135        atomic_t                        connected;
 136        atomic_t                        sqtail;
 137        atomic_t                        zrspcnt;
 138        atomic_t                        rsn;
 139        spinlock_t                      qlock;
 140        struct nvmet_cq                 nvme_cq;
 141        struct nvmet_sq                 nvme_sq;
 142        struct nvmet_fc_tgt_assoc       *assoc;
 143        struct list_head                fod_list;
 144        struct list_head                pending_cmd_list;
 145        struct list_head                avail_defer_list;
 146        struct workqueue_struct         *work_q;
 147        struct kref                     ref;
 148        struct rcu_head                 rcu;
 149        struct nvmet_fc_fcp_iod         fod[];          /* array of fcp_iods */
 150} __aligned(sizeof(unsigned long long));
 151
 152struct nvmet_fc_hostport {
 153        struct nvmet_fc_tgtport         *tgtport;
 154        void                            *hosthandle;
 155        struct list_head                host_list;
 156        struct kref                     ref;
 157        u8                              invalid;
 158};
 159
 160struct nvmet_fc_tgt_assoc {
 161        u64                             association_id;
 162        u32                             a_id;
 163        atomic_t                        terminating;
 164        struct nvmet_fc_tgtport         *tgtport;
 165        struct nvmet_fc_hostport        *hostport;
 166        struct nvmet_fc_ls_iod          *rcv_disconn;
 167        struct list_head                a_list;
 168        struct nvmet_fc_tgt_queue __rcu *queues[NVMET_NR_QUEUES + 1];
 169        struct kref                     ref;
 170        struct work_struct              del_work;
 171        struct rcu_head                 rcu;
 172};
 173
 174
 175static inline int
 176nvmet_fc_iodnum(struct nvmet_fc_ls_iod *iodptr)
 177{
 178        return (iodptr - iodptr->tgtport->iod);
 179}
 180
 181static inline int
 182nvmet_fc_fodnum(struct nvmet_fc_fcp_iod *fodptr)
 183{
 184        return (fodptr - fodptr->queue->fod);
 185}
 186
 187
 188/*
 189 * Association and Connection IDs:
 190 *
 191 * Association ID will have random number in upper 6 bytes and zero
 192 *   in lower 2 bytes
 193 *
 194 * Connection IDs will be Association ID with QID or'd in lower 2 bytes
 195 *
 196 * note: Association ID = Connection ID for queue 0
 197 */
 198#define BYTES_FOR_QID                   sizeof(u16)
 199#define BYTES_FOR_QID_SHIFT             (BYTES_FOR_QID * 8)
 200#define NVMET_FC_QUEUEID_MASK           ((u64)((1 << BYTES_FOR_QID_SHIFT) - 1))
 201
 202static inline u64
 203nvmet_fc_makeconnid(struct nvmet_fc_tgt_assoc *assoc, u16 qid)
 204{
 205        return (assoc->association_id | qid);
 206}
 207
 208static inline u64
 209nvmet_fc_getassociationid(u64 connectionid)
 210{
 211        return connectionid & ~NVMET_FC_QUEUEID_MASK;
 212}
 213
 214static inline u16
 215nvmet_fc_getqueueid(u64 connectionid)
 216{
 217        return (u16)(connectionid & NVMET_FC_QUEUEID_MASK);
 218}
 219
 220static inline struct nvmet_fc_tgtport *
 221targetport_to_tgtport(struct nvmet_fc_target_port *targetport)
 222{
 223        return container_of(targetport, struct nvmet_fc_tgtport,
 224                                 fc_target_port);
 225}
 226
 227static inline struct nvmet_fc_fcp_iod *
 228nvmet_req_to_fod(struct nvmet_req *nvme_req)
 229{
 230        return container_of(nvme_req, struct nvmet_fc_fcp_iod, req);
 231}
 232
 233
 234/* *************************** Globals **************************** */
 235
 236
 237static DEFINE_SPINLOCK(nvmet_fc_tgtlock);
 238
 239static LIST_HEAD(nvmet_fc_target_list);
 240static DEFINE_IDA(nvmet_fc_tgtport_cnt);
 241static LIST_HEAD(nvmet_fc_portentry_list);
 242
 243
 244static void nvmet_fc_handle_ls_rqst_work(struct work_struct *work);
 245static void nvmet_fc_fcp_rqst_op_defer_work(struct work_struct *work);
 246static void nvmet_fc_tgt_a_put(struct nvmet_fc_tgt_assoc *assoc);
 247static int nvmet_fc_tgt_a_get(struct nvmet_fc_tgt_assoc *assoc);
 248static void nvmet_fc_tgt_q_put(struct nvmet_fc_tgt_queue *queue);
 249static int nvmet_fc_tgt_q_get(struct nvmet_fc_tgt_queue *queue);
 250static void nvmet_fc_tgtport_put(struct nvmet_fc_tgtport *tgtport);
 251static int nvmet_fc_tgtport_get(struct nvmet_fc_tgtport *tgtport);
 252static void nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
 253                                        struct nvmet_fc_fcp_iod *fod);
 254static void nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc);
 255static void nvmet_fc_xmt_ls_rsp(struct nvmet_fc_tgtport *tgtport,
 256                                struct nvmet_fc_ls_iod *iod);
 257
 258
 259/* *********************** FC-NVME DMA Handling **************************** */
 260
 261/*
 262 * The fcloop device passes in a NULL device pointer. Real LLD's will
 263 * pass in a valid device pointer. If NULL is passed to the dma mapping
 264 * routines, depending on the platform, it may or may not succeed, and
 265 * may crash.
 266 *
 267 * As such:
 268 * Wrapper all the dma routines and check the dev pointer.
 269 *
 270 * If simple mappings (return just a dma address, we'll noop them,
 271 * returning a dma address of 0.
 272 *
 273 * On more complex mappings (dma_map_sg), a pseudo routine fills
 274 * in the scatter list, setting all dma addresses to 0.
 275 */
 276
 277static inline dma_addr_t
 278fc_dma_map_single(struct device *dev, void *ptr, size_t size,
 279                enum dma_data_direction dir)
 280{
 281        return dev ? dma_map_single(dev, ptr, size, dir) : (dma_addr_t)0L;
 282}
 283
 284static inline int
 285fc_dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
 286{
 287        return dev ? dma_mapping_error(dev, dma_addr) : 0;
 288}
 289
 290static inline void
 291fc_dma_unmap_single(struct device *dev, dma_addr_t addr, size_t size,
 292        enum dma_data_direction dir)
 293{
 294        if (dev)
 295                dma_unmap_single(dev, addr, size, dir);
 296}
 297
 298static inline void
 299fc_dma_sync_single_for_cpu(struct device *dev, dma_addr_t addr, size_t size,
 300                enum dma_data_direction dir)
 301{
 302        if (dev)
 303                dma_sync_single_for_cpu(dev, addr, size, dir);
 304}
 305
 306static inline void
 307fc_dma_sync_single_for_device(struct device *dev, dma_addr_t addr, size_t size,
 308                enum dma_data_direction dir)
 309{
 310        if (dev)
 311                dma_sync_single_for_device(dev, addr, size, dir);
 312}
 313
 314/* pseudo dma_map_sg call */
 315static int
 316fc_map_sg(struct scatterlist *sg, int nents)
 317{
 318        struct scatterlist *s;
 319        int i;
 320
 321        WARN_ON(nents == 0 || sg[0].length == 0);
 322
 323        for_each_sg(sg, s, nents, i) {
 324                s->dma_address = 0L;
 325#ifdef CONFIG_NEED_SG_DMA_LENGTH
 326                s->dma_length = s->length;
 327#endif
 328        }
 329        return nents;
 330}
 331
 332static inline int
 333fc_dma_map_sg(struct device *dev, struct scatterlist *sg, int nents,
 334                enum dma_data_direction dir)
 335{
 336        return dev ? dma_map_sg(dev, sg, nents, dir) : fc_map_sg(sg, nents);
 337}
 338
 339static inline void
 340fc_dma_unmap_sg(struct device *dev, struct scatterlist *sg, int nents,
 341                enum dma_data_direction dir)
 342{
 343        if (dev)
 344                dma_unmap_sg(dev, sg, nents, dir);
 345}
 346
 347
 348/* ********************** FC-NVME LS XMT Handling ************************* */
 349
 350
 351static void
 352__nvmet_fc_finish_ls_req(struct nvmet_fc_ls_req_op *lsop)
 353{
 354        struct nvmet_fc_tgtport *tgtport = lsop->tgtport;
 355        struct nvmefc_ls_req *lsreq = &lsop->ls_req;
 356        unsigned long flags;
 357
 358        spin_lock_irqsave(&tgtport->lock, flags);
 359
 360        if (!lsop->req_queued) {
 361                spin_unlock_irqrestore(&tgtport->lock, flags);
 362                return;
 363        }
 364
 365        list_del(&lsop->lsreq_list);
 366
 367        lsop->req_queued = false;
 368
 369        spin_unlock_irqrestore(&tgtport->lock, flags);
 370
 371        fc_dma_unmap_single(tgtport->dev, lsreq->rqstdma,
 372                                  (lsreq->rqstlen + lsreq->rsplen),
 373                                  DMA_BIDIRECTIONAL);
 374
 375        nvmet_fc_tgtport_put(tgtport);
 376}
 377
 378static int
 379__nvmet_fc_send_ls_req(struct nvmet_fc_tgtport *tgtport,
 380                struct nvmet_fc_ls_req_op *lsop,
 381                void (*done)(struct nvmefc_ls_req *req, int status))
 382{
 383        struct nvmefc_ls_req *lsreq = &lsop->ls_req;
 384        unsigned long flags;
 385        int ret = 0;
 386
 387        if (!tgtport->ops->ls_req)
 388                return -EOPNOTSUPP;
 389
 390        if (!nvmet_fc_tgtport_get(tgtport))
 391                return -ESHUTDOWN;
 392
 393        lsreq->done = done;
 394        lsop->req_queued = false;
 395        INIT_LIST_HEAD(&lsop->lsreq_list);
 396
 397        lsreq->rqstdma = fc_dma_map_single(tgtport->dev, lsreq->rqstaddr,
 398                                  lsreq->rqstlen + lsreq->rsplen,
 399                                  DMA_BIDIRECTIONAL);
 400        if (fc_dma_mapping_error(tgtport->dev, lsreq->rqstdma)) {
 401                ret = -EFAULT;
 402                goto out_puttgtport;
 403        }
 404        lsreq->rspdma = lsreq->rqstdma + lsreq->rqstlen;
 405
 406        spin_lock_irqsave(&tgtport->lock, flags);
 407
 408        list_add_tail(&lsop->lsreq_list, &tgtport->ls_req_list);
 409
 410        lsop->req_queued = true;
 411
 412        spin_unlock_irqrestore(&tgtport->lock, flags);
 413
 414        ret = tgtport->ops->ls_req(&tgtport->fc_target_port, lsop->hosthandle,
 415                                   lsreq);
 416        if (ret)
 417                goto out_unlink;
 418
 419        return 0;
 420
 421out_unlink:
 422        lsop->ls_error = ret;
 423        spin_lock_irqsave(&tgtport->lock, flags);
 424        lsop->req_queued = false;
 425        list_del(&lsop->lsreq_list);
 426        spin_unlock_irqrestore(&tgtport->lock, flags);
 427        fc_dma_unmap_single(tgtport->dev, lsreq->rqstdma,
 428                                  (lsreq->rqstlen + lsreq->rsplen),
 429                                  DMA_BIDIRECTIONAL);
 430out_puttgtport:
 431        nvmet_fc_tgtport_put(tgtport);
 432
 433        return ret;
 434}
 435
 436static int
 437nvmet_fc_send_ls_req_async(struct nvmet_fc_tgtport *tgtport,
 438                struct nvmet_fc_ls_req_op *lsop,
 439                void (*done)(struct nvmefc_ls_req *req, int status))
 440{
 441        /* don't wait for completion */
 442
 443        return __nvmet_fc_send_ls_req(tgtport, lsop, done);
 444}
 445
 446static void
 447nvmet_fc_disconnect_assoc_done(struct nvmefc_ls_req *lsreq, int status)
 448{
 449        struct nvmet_fc_ls_req_op *lsop =
 450                container_of(lsreq, struct nvmet_fc_ls_req_op, ls_req);
 451
 452        __nvmet_fc_finish_ls_req(lsop);
 453
 454        /* fc-nvme target doesn't care about success or failure of cmd */
 455
 456        kfree(lsop);
 457}
 458
 459/*
 460 * This routine sends a FC-NVME LS to disconnect (aka terminate)
 461 * the FC-NVME Association.  Terminating the association also
 462 * terminates the FC-NVME connections (per queue, both admin and io
 463 * queues) that are part of the association. E.g. things are torn
 464 * down, and the related FC-NVME Association ID and Connection IDs
 465 * become invalid.
 466 *
 467 * The behavior of the fc-nvme target is such that it's
 468 * understanding of the association and connections will implicitly
 469 * be torn down. The action is implicit as it may be due to a loss of
 470 * connectivity with the fc-nvme host, so the target may never get a
 471 * response even if it tried.  As such, the action of this routine
 472 * is to asynchronously send the LS, ignore any results of the LS, and
 473 * continue on with terminating the association. If the fc-nvme host
 474 * is present and receives the LS, it too can tear down.
 475 */
 476static void
 477nvmet_fc_xmt_disconnect_assoc(struct nvmet_fc_tgt_assoc *assoc)
 478{
 479        struct nvmet_fc_tgtport *tgtport = assoc->tgtport;
 480        struct fcnvme_ls_disconnect_assoc_rqst *discon_rqst;
 481        struct fcnvme_ls_disconnect_assoc_acc *discon_acc;
 482        struct nvmet_fc_ls_req_op *lsop;
 483        struct nvmefc_ls_req *lsreq;
 484        int ret;
 485
 486        /*
 487         * If ls_req is NULL or no hosthandle, it's an older lldd and no
 488         * message is normal. Otherwise, send unless the hostport has
 489         * already been invalidated by the lldd.
 490         */
 491        if (!tgtport->ops->ls_req || !assoc->hostport ||
 492            assoc->hostport->invalid)
 493                return;
 494
 495        lsop = kzalloc((sizeof(*lsop) +
 496                        sizeof(*discon_rqst) + sizeof(*discon_acc) +
 497                        tgtport->ops->lsrqst_priv_sz), GFP_KERNEL);
 498        if (!lsop) {
 499                dev_info(tgtport->dev,
 500                        "{%d:%d} send Disconnect Association failed: ENOMEM\n",
 501                        tgtport->fc_target_port.port_num, assoc->a_id);
 502                return;
 503        }
 504
 505        discon_rqst = (struct fcnvme_ls_disconnect_assoc_rqst *)&lsop[1];
 506        discon_acc = (struct fcnvme_ls_disconnect_assoc_acc *)&discon_rqst[1];
 507        lsreq = &lsop->ls_req;
 508        if (tgtport->ops->lsrqst_priv_sz)
 509                lsreq->private = (void *)&discon_acc[1];
 510        else
 511                lsreq->private = NULL;
 512
 513        lsop->tgtport = tgtport;
 514        lsop->hosthandle = assoc->hostport->hosthandle;
 515
 516        nvmefc_fmt_lsreq_discon_assoc(lsreq, discon_rqst, discon_acc,
 517                                assoc->association_id);
 518
 519        ret = nvmet_fc_send_ls_req_async(tgtport, lsop,
 520                                nvmet_fc_disconnect_assoc_done);
 521        if (ret) {
 522                dev_info(tgtport->dev,
 523                        "{%d:%d} XMT Disconnect Association failed: %d\n",
 524                        tgtport->fc_target_port.port_num, assoc->a_id, ret);
 525                kfree(lsop);
 526        }
 527}
 528
 529
 530/* *********************** FC-NVME Port Management ************************ */
 531
 532
 533static int
 534nvmet_fc_alloc_ls_iodlist(struct nvmet_fc_tgtport *tgtport)
 535{
 536        struct nvmet_fc_ls_iod *iod;
 537        int i;
 538
 539        iod = kcalloc(NVMET_LS_CTX_COUNT, sizeof(struct nvmet_fc_ls_iod),
 540                        GFP_KERNEL);
 541        if (!iod)
 542                return -ENOMEM;
 543
 544        tgtport->iod = iod;
 545
 546        for (i = 0; i < NVMET_LS_CTX_COUNT; iod++, i++) {
 547                INIT_WORK(&iod->work, nvmet_fc_handle_ls_rqst_work);
 548                iod->tgtport = tgtport;
 549                list_add_tail(&iod->ls_rcv_list, &tgtport->ls_rcv_list);
 550
 551                iod->rqstbuf = kzalloc(sizeof(union nvmefc_ls_requests) +
 552                                       sizeof(union nvmefc_ls_responses),
 553                                       GFP_KERNEL);
 554                if (!iod->rqstbuf)
 555                        goto out_fail;
 556
 557                iod->rspbuf = (union nvmefc_ls_responses *)&iod->rqstbuf[1];
 558
 559                iod->rspdma = fc_dma_map_single(tgtport->dev, iod->rspbuf,
 560                                                sizeof(*iod->rspbuf),
 561                                                DMA_TO_DEVICE);
 562                if (fc_dma_mapping_error(tgtport->dev, iod->rspdma))
 563                        goto out_fail;
 564        }
 565
 566        return 0;
 567
 568out_fail:
 569        kfree(iod->rqstbuf);
 570        list_del(&iod->ls_rcv_list);
 571        for (iod--, i--; i >= 0; iod--, i--) {
 572                fc_dma_unmap_single(tgtport->dev, iod->rspdma,
 573                                sizeof(*iod->rspbuf), DMA_TO_DEVICE);
 574                kfree(iod->rqstbuf);
 575                list_del(&iod->ls_rcv_list);
 576        }
 577
 578        kfree(iod);
 579
 580        return -EFAULT;
 581}
 582
 583static void
 584nvmet_fc_free_ls_iodlist(struct nvmet_fc_tgtport *tgtport)
 585{
 586        struct nvmet_fc_ls_iod *iod = tgtport->iod;
 587        int i;
 588
 589        for (i = 0; i < NVMET_LS_CTX_COUNT; iod++, i++) {
 590                fc_dma_unmap_single(tgtport->dev,
 591                                iod->rspdma, sizeof(*iod->rspbuf),
 592                                DMA_TO_DEVICE);
 593                kfree(iod->rqstbuf);
 594                list_del(&iod->ls_rcv_list);
 595        }
 596        kfree(tgtport->iod);
 597}
 598
 599static struct nvmet_fc_ls_iod *
 600nvmet_fc_alloc_ls_iod(struct nvmet_fc_tgtport *tgtport)
 601{
 602        struct nvmet_fc_ls_iod *iod;
 603        unsigned long flags;
 604
 605        spin_lock_irqsave(&tgtport->lock, flags);
 606        iod = list_first_entry_or_null(&tgtport->ls_rcv_list,
 607                                        struct nvmet_fc_ls_iod, ls_rcv_list);
 608        if (iod)
 609                list_move_tail(&iod->ls_rcv_list, &tgtport->ls_busylist);
 610        spin_unlock_irqrestore(&tgtport->lock, flags);
 611        return iod;
 612}
 613
 614
 615static void
 616nvmet_fc_free_ls_iod(struct nvmet_fc_tgtport *tgtport,
 617                        struct nvmet_fc_ls_iod *iod)
 618{
 619        unsigned long flags;
 620
 621        spin_lock_irqsave(&tgtport->lock, flags);
 622        list_move(&iod->ls_rcv_list, &tgtport->ls_rcv_list);
 623        spin_unlock_irqrestore(&tgtport->lock, flags);
 624}
 625
 626static void
 627nvmet_fc_prep_fcp_iodlist(struct nvmet_fc_tgtport *tgtport,
 628                                struct nvmet_fc_tgt_queue *queue)
 629{
 630        struct nvmet_fc_fcp_iod *fod = queue->fod;
 631        int i;
 632
 633        for (i = 0; i < queue->sqsize; fod++, i++) {
 634                INIT_WORK(&fod->defer_work, nvmet_fc_fcp_rqst_op_defer_work);
 635                fod->tgtport = tgtport;
 636                fod->queue = queue;
 637                fod->active = false;
 638                fod->abort = false;
 639                fod->aborted = false;
 640                fod->fcpreq = NULL;
 641                list_add_tail(&fod->fcp_list, &queue->fod_list);
 642                spin_lock_init(&fod->flock);
 643
 644                fod->rspdma = fc_dma_map_single(tgtport->dev, &fod->rspiubuf,
 645                                        sizeof(fod->rspiubuf), DMA_TO_DEVICE);
 646                if (fc_dma_mapping_error(tgtport->dev, fod->rspdma)) {
 647                        list_del(&fod->fcp_list);
 648                        for (fod--, i--; i >= 0; fod--, i--) {
 649                                fc_dma_unmap_single(tgtport->dev, fod->rspdma,
 650                                                sizeof(fod->rspiubuf),
 651                                                DMA_TO_DEVICE);
 652                                fod->rspdma = 0L;
 653                                list_del(&fod->fcp_list);
 654                        }
 655
 656                        return;
 657                }
 658        }
 659}
 660
 661static void
 662nvmet_fc_destroy_fcp_iodlist(struct nvmet_fc_tgtport *tgtport,
 663                                struct nvmet_fc_tgt_queue *queue)
 664{
 665        struct nvmet_fc_fcp_iod *fod = queue->fod;
 666        int i;
 667
 668        for (i = 0; i < queue->sqsize; fod++, i++) {
 669                if (fod->rspdma)
 670                        fc_dma_unmap_single(tgtport->dev, fod->rspdma,
 671                                sizeof(fod->rspiubuf), DMA_TO_DEVICE);
 672        }
 673}
 674
 675static struct nvmet_fc_fcp_iod *
 676nvmet_fc_alloc_fcp_iod(struct nvmet_fc_tgt_queue *queue)
 677{
 678        struct nvmet_fc_fcp_iod *fod;
 679
 680        lockdep_assert_held(&queue->qlock);
 681
 682        fod = list_first_entry_or_null(&queue->fod_list,
 683                                        struct nvmet_fc_fcp_iod, fcp_list);
 684        if (fod) {
 685                list_del(&fod->fcp_list);
 686                fod->active = true;
 687                /*
 688                 * no queue reference is taken, as it was taken by the
 689                 * queue lookup just prior to the allocation. The iod
 690                 * will "inherit" that reference.
 691                 */
 692        }
 693        return fod;
 694}
 695
 696
 697static void
 698nvmet_fc_queue_fcp_req(struct nvmet_fc_tgtport *tgtport,
 699                       struct nvmet_fc_tgt_queue *queue,
 700                       struct nvmefc_tgt_fcp_req *fcpreq)
 701{
 702        struct nvmet_fc_fcp_iod *fod = fcpreq->nvmet_fc_private;
 703
 704        /*
 705         * put all admin cmds on hw queue id 0. All io commands go to
 706         * the respective hw queue based on a modulo basis
 707         */
 708        fcpreq->hwqid = queue->qid ?
 709                        ((queue->qid - 1) % tgtport->ops->max_hw_queues) : 0;
 710
 711        nvmet_fc_handle_fcp_rqst(tgtport, fod);
 712}
 713
 714static void
 715nvmet_fc_fcp_rqst_op_defer_work(struct work_struct *work)
 716{
 717        struct nvmet_fc_fcp_iod *fod =
 718                container_of(work, struct nvmet_fc_fcp_iod, defer_work);
 719
 720        /* Submit deferred IO for processing */
 721        nvmet_fc_queue_fcp_req(fod->tgtport, fod->queue, fod->fcpreq);
 722
 723}
 724
 725static void
 726nvmet_fc_free_fcp_iod(struct nvmet_fc_tgt_queue *queue,
 727                        struct nvmet_fc_fcp_iod *fod)
 728{
 729        struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
 730        struct nvmet_fc_tgtport *tgtport = fod->tgtport;
 731        struct nvmet_fc_defer_fcp_req *deferfcp;
 732        unsigned long flags;
 733
 734        fc_dma_sync_single_for_cpu(tgtport->dev, fod->rspdma,
 735                                sizeof(fod->rspiubuf), DMA_TO_DEVICE);
 736
 737        fcpreq->nvmet_fc_private = NULL;
 738
 739        fod->active = false;
 740        fod->abort = false;
 741        fod->aborted = false;
 742        fod->writedataactive = false;
 743        fod->fcpreq = NULL;
 744
 745        tgtport->ops->fcp_req_release(&tgtport->fc_target_port, fcpreq);
 746
 747        /* release the queue lookup reference on the completed IO */
 748        nvmet_fc_tgt_q_put(queue);
 749
 750        spin_lock_irqsave(&queue->qlock, flags);
 751        deferfcp = list_first_entry_or_null(&queue->pending_cmd_list,
 752                                struct nvmet_fc_defer_fcp_req, req_list);
 753        if (!deferfcp) {
 754                list_add_tail(&fod->fcp_list, &fod->queue->fod_list);
 755                spin_unlock_irqrestore(&queue->qlock, flags);
 756                return;
 757        }
 758
 759        /* Re-use the fod for the next pending cmd that was deferred */
 760        list_del(&deferfcp->req_list);
 761
 762        fcpreq = deferfcp->fcp_req;
 763
 764        /* deferfcp can be reused for another IO at a later date */
 765        list_add_tail(&deferfcp->req_list, &queue->avail_defer_list);
 766
 767        spin_unlock_irqrestore(&queue->qlock, flags);
 768
 769        /* Save NVME CMD IO in fod */
 770        memcpy(&fod->cmdiubuf, fcpreq->rspaddr, fcpreq->rsplen);
 771
 772        /* Setup new fcpreq to be processed */
 773        fcpreq->rspaddr = NULL;
 774        fcpreq->rsplen  = 0;
 775        fcpreq->nvmet_fc_private = fod;
 776        fod->fcpreq = fcpreq;
 777        fod->active = true;
 778
 779        /* inform LLDD IO is now being processed */
 780        tgtport->ops->defer_rcv(&tgtport->fc_target_port, fcpreq);
 781
 782        /*
 783         * Leave the queue lookup get reference taken when
 784         * fod was originally allocated.
 785         */
 786
 787        queue_work(queue->work_q, &fod->defer_work);
 788}
 789
 790static struct nvmet_fc_tgt_queue *
 791nvmet_fc_alloc_target_queue(struct nvmet_fc_tgt_assoc *assoc,
 792                        u16 qid, u16 sqsize)
 793{
 794        struct nvmet_fc_tgt_queue *queue;
 795        int ret;
 796
 797        if (qid > NVMET_NR_QUEUES)
 798                return NULL;
 799
 800        queue = kzalloc(struct_size(queue, fod, sqsize), GFP_KERNEL);
 801        if (!queue)
 802                return NULL;
 803
 804        if (!nvmet_fc_tgt_a_get(assoc))
 805                goto out_free_queue;
 806
 807        queue->work_q = alloc_workqueue("ntfc%d.%d.%d", 0, 0,
 808                                assoc->tgtport->fc_target_port.port_num,
 809                                assoc->a_id, qid);
 810        if (!queue->work_q)
 811                goto out_a_put;
 812
 813        queue->qid = qid;
 814        queue->sqsize = sqsize;
 815        queue->assoc = assoc;
 816        INIT_LIST_HEAD(&queue->fod_list);
 817        INIT_LIST_HEAD(&queue->avail_defer_list);
 818        INIT_LIST_HEAD(&queue->pending_cmd_list);
 819        atomic_set(&queue->connected, 0);
 820        atomic_set(&queue->sqtail, 0);
 821        atomic_set(&queue->rsn, 1);
 822        atomic_set(&queue->zrspcnt, 0);
 823        spin_lock_init(&queue->qlock);
 824        kref_init(&queue->ref);
 825
 826        nvmet_fc_prep_fcp_iodlist(assoc->tgtport, queue);
 827
 828        ret = nvmet_sq_init(&queue->nvme_sq);
 829        if (ret)
 830                goto out_fail_iodlist;
 831
 832        WARN_ON(assoc->queues[qid]);
 833        rcu_assign_pointer(assoc->queues[qid], queue);
 834
 835        return queue;
 836
 837out_fail_iodlist:
 838        nvmet_fc_destroy_fcp_iodlist(assoc->tgtport, queue);
 839        destroy_workqueue(queue->work_q);
 840out_a_put:
 841        nvmet_fc_tgt_a_put(assoc);
 842out_free_queue:
 843        kfree(queue);
 844        return NULL;
 845}
 846
 847
 848static void
 849nvmet_fc_tgt_queue_free(struct kref *ref)
 850{
 851        struct nvmet_fc_tgt_queue *queue =
 852                container_of(ref, struct nvmet_fc_tgt_queue, ref);
 853
 854        rcu_assign_pointer(queue->assoc->queues[queue->qid], NULL);
 855
 856        nvmet_fc_destroy_fcp_iodlist(queue->assoc->tgtport, queue);
 857
 858        nvmet_fc_tgt_a_put(queue->assoc);
 859
 860        destroy_workqueue(queue->work_q);
 861
 862        kfree_rcu(queue, rcu);
 863}
 864
 865static void
 866nvmet_fc_tgt_q_put(struct nvmet_fc_tgt_queue *queue)
 867{
 868        kref_put(&queue->ref, nvmet_fc_tgt_queue_free);
 869}
 870
 871static int
 872nvmet_fc_tgt_q_get(struct nvmet_fc_tgt_queue *queue)
 873{
 874        return kref_get_unless_zero(&queue->ref);
 875}
 876
 877
 878static void
 879nvmet_fc_delete_target_queue(struct nvmet_fc_tgt_queue *queue)
 880{
 881        struct nvmet_fc_tgtport *tgtport = queue->assoc->tgtport;
 882        struct nvmet_fc_fcp_iod *fod = queue->fod;
 883        struct nvmet_fc_defer_fcp_req *deferfcp, *tempptr;
 884        unsigned long flags;
 885        int i;
 886        bool disconnect;
 887
 888        disconnect = atomic_xchg(&queue->connected, 0);
 889
 890        /* if not connected, nothing to do */
 891        if (!disconnect)
 892                return;
 893
 894        spin_lock_irqsave(&queue->qlock, flags);
 895        /* abort outstanding io's */
 896        for (i = 0; i < queue->sqsize; fod++, i++) {
 897                if (fod->active) {
 898                        spin_lock(&fod->flock);
 899                        fod->abort = true;
 900                        /*
 901                         * only call lldd abort routine if waiting for
 902                         * writedata. other outstanding ops should finish
 903                         * on their own.
 904                         */
 905                        if (fod->writedataactive) {
 906                                fod->aborted = true;
 907                                spin_unlock(&fod->flock);
 908                                tgtport->ops->fcp_abort(
 909                                        &tgtport->fc_target_port, fod->fcpreq);
 910                        } else
 911                                spin_unlock(&fod->flock);
 912                }
 913        }
 914
 915        /* Cleanup defer'ed IOs in queue */
 916        list_for_each_entry_safe(deferfcp, tempptr, &queue->avail_defer_list,
 917                                req_list) {
 918                list_del(&deferfcp->req_list);
 919                kfree(deferfcp);
 920        }
 921
 922        for (;;) {
 923                deferfcp = list_first_entry_or_null(&queue->pending_cmd_list,
 924                                struct nvmet_fc_defer_fcp_req, req_list);
 925                if (!deferfcp)
 926                        break;
 927
 928                list_del(&deferfcp->req_list);
 929                spin_unlock_irqrestore(&queue->qlock, flags);
 930
 931                tgtport->ops->defer_rcv(&tgtport->fc_target_port,
 932                                deferfcp->fcp_req);
 933
 934                tgtport->ops->fcp_abort(&tgtport->fc_target_port,
 935                                deferfcp->fcp_req);
 936
 937                tgtport->ops->fcp_req_release(&tgtport->fc_target_port,
 938                                deferfcp->fcp_req);
 939
 940                /* release the queue lookup reference */
 941                nvmet_fc_tgt_q_put(queue);
 942
 943                kfree(deferfcp);
 944
 945                spin_lock_irqsave(&queue->qlock, flags);
 946        }
 947        spin_unlock_irqrestore(&queue->qlock, flags);
 948
 949        flush_workqueue(queue->work_q);
 950
 951        nvmet_sq_destroy(&queue->nvme_sq);
 952
 953        nvmet_fc_tgt_q_put(queue);
 954}
 955
 956static struct nvmet_fc_tgt_queue *
 957nvmet_fc_find_target_queue(struct nvmet_fc_tgtport *tgtport,
 958                                u64 connection_id)
 959{
 960        struct nvmet_fc_tgt_assoc *assoc;
 961        struct nvmet_fc_tgt_queue *queue;
 962        u64 association_id = nvmet_fc_getassociationid(connection_id);
 963        u16 qid = nvmet_fc_getqueueid(connection_id);
 964
 965        if (qid > NVMET_NR_QUEUES)
 966                return NULL;
 967
 968        rcu_read_lock();
 969        list_for_each_entry_rcu(assoc, &tgtport->assoc_list, a_list) {
 970                if (association_id == assoc->association_id) {
 971                        queue = rcu_dereference(assoc->queues[qid]);
 972                        if (queue &&
 973                            (!atomic_read(&queue->connected) ||
 974                             !nvmet_fc_tgt_q_get(queue)))
 975                                queue = NULL;
 976                        rcu_read_unlock();
 977                        return queue;
 978                }
 979        }
 980        rcu_read_unlock();
 981        return NULL;
 982}
 983
 984static void
 985nvmet_fc_hostport_free(struct kref *ref)
 986{
 987        struct nvmet_fc_hostport *hostport =
 988                container_of(ref, struct nvmet_fc_hostport, ref);
 989        struct nvmet_fc_tgtport *tgtport = hostport->tgtport;
 990        unsigned long flags;
 991
 992        spin_lock_irqsave(&tgtport->lock, flags);
 993        list_del(&hostport->host_list);
 994        spin_unlock_irqrestore(&tgtport->lock, flags);
 995        if (tgtport->ops->host_release && hostport->invalid)
 996                tgtport->ops->host_release(hostport->hosthandle);
 997        kfree(hostport);
 998        nvmet_fc_tgtport_put(tgtport);
 999}
1000
1001static void
1002nvmet_fc_hostport_put(struct nvmet_fc_hostport *hostport)
1003{
1004        kref_put(&hostport->ref, nvmet_fc_hostport_free);
1005}
1006
1007static int
1008nvmet_fc_hostport_get(struct nvmet_fc_hostport *hostport)
1009{
1010        return kref_get_unless_zero(&hostport->ref);
1011}
1012
1013static void
1014nvmet_fc_free_hostport(struct nvmet_fc_hostport *hostport)
1015{
1016        /* if LLDD not implemented, leave as NULL */
1017        if (!hostport || !hostport->hosthandle)
1018                return;
1019
1020        nvmet_fc_hostport_put(hostport);
1021}
1022
1023static struct nvmet_fc_hostport *
1024nvmet_fc_match_hostport(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
1025{
1026        struct nvmet_fc_hostport *host;
1027
1028        lockdep_assert_held(&tgtport->lock);
1029
1030        list_for_each_entry(host, &tgtport->host_list, host_list) {
1031                if (host->hosthandle == hosthandle && !host->invalid) {
1032                        if (nvmet_fc_hostport_get(host))
1033                                return (host);
1034                }
1035        }
1036
1037        return NULL;
1038}
1039
1040static struct nvmet_fc_hostport *
1041nvmet_fc_alloc_hostport(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
1042{
1043        struct nvmet_fc_hostport *newhost, *match = NULL;
1044        unsigned long flags;
1045
1046        /* if LLDD not implemented, leave as NULL */
1047        if (!hosthandle)
1048                return NULL;
1049
1050        /*
1051         * take reference for what will be the newly allocated hostport if
1052         * we end up using a new allocation
1053         */
1054        if (!nvmet_fc_tgtport_get(tgtport))
1055                return ERR_PTR(-EINVAL);
1056
1057        spin_lock_irqsave(&tgtport->lock, flags);
1058        match = nvmet_fc_match_hostport(tgtport, hosthandle);
1059        spin_unlock_irqrestore(&tgtport->lock, flags);
1060
1061        if (match) {
1062                /* no new allocation - release reference */
1063                nvmet_fc_tgtport_put(tgtport);
1064                return match;
1065        }
1066
1067        newhost = kzalloc(sizeof(*newhost), GFP_KERNEL);
1068        if (!newhost) {
1069                /* no new allocation - release reference */
1070                nvmet_fc_tgtport_put(tgtport);
1071                return ERR_PTR(-ENOMEM);
1072        }
1073
1074        spin_lock_irqsave(&tgtport->lock, flags);
1075        match = nvmet_fc_match_hostport(tgtport, hosthandle);
1076        if (match) {
1077                /* new allocation not needed */
1078                kfree(newhost);
1079                newhost = match;
1080                /* no new allocation - release reference */
1081                nvmet_fc_tgtport_put(tgtport);
1082        } else {
1083                newhost->tgtport = tgtport;
1084                newhost->hosthandle = hosthandle;
1085                INIT_LIST_HEAD(&newhost->host_list);
1086                kref_init(&newhost->ref);
1087
1088                list_add_tail(&newhost->host_list, &tgtport->host_list);
1089        }
1090        spin_unlock_irqrestore(&tgtport->lock, flags);
1091
1092        return newhost;
1093}
1094
1095static void
1096nvmet_fc_delete_assoc(struct work_struct *work)
1097{
1098        struct nvmet_fc_tgt_assoc *assoc =
1099                container_of(work, struct nvmet_fc_tgt_assoc, del_work);
1100
1101        nvmet_fc_delete_target_assoc(assoc);
1102        nvmet_fc_tgt_a_put(assoc);
1103}
1104
1105static struct nvmet_fc_tgt_assoc *
1106nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport, void *hosthandle)
1107{
1108        struct nvmet_fc_tgt_assoc *assoc, *tmpassoc;
1109        unsigned long flags;
1110        u64 ran;
1111        int idx;
1112        bool needrandom = true;
1113
1114        assoc = kzalloc(sizeof(*assoc), GFP_KERNEL);
1115        if (!assoc)
1116                return NULL;
1117
1118        idx = ida_simple_get(&tgtport->assoc_cnt, 0, 0, GFP_KERNEL);
1119        if (idx < 0)
1120                goto out_free_assoc;
1121
1122        if (!nvmet_fc_tgtport_get(tgtport))
1123                goto out_ida;
1124
1125        assoc->hostport = nvmet_fc_alloc_hostport(tgtport, hosthandle);
1126        if (IS_ERR(assoc->hostport))
1127                goto out_put;
1128
1129        assoc->tgtport = tgtport;
1130        assoc->a_id = idx;
1131        INIT_LIST_HEAD(&assoc->a_list);
1132        kref_init(&assoc->ref);
1133        INIT_WORK(&assoc->del_work, nvmet_fc_delete_assoc);
1134        atomic_set(&assoc->terminating, 0);
1135
1136        while (needrandom) {
1137                get_random_bytes(&ran, sizeof(ran) - BYTES_FOR_QID);
1138                ran = ran << BYTES_FOR_QID_SHIFT;
1139
1140                spin_lock_irqsave(&tgtport->lock, flags);
1141                needrandom = false;
1142                list_for_each_entry(tmpassoc, &tgtport->assoc_list, a_list) {
1143                        if (ran == tmpassoc->association_id) {
1144                                needrandom = true;
1145                                break;
1146                        }
1147                }
1148                if (!needrandom) {
1149                        assoc->association_id = ran;
1150                        list_add_tail_rcu(&assoc->a_list, &tgtport->assoc_list);
1151                }
1152                spin_unlock_irqrestore(&tgtport->lock, flags);
1153        }
1154
1155        return assoc;
1156
1157out_put:
1158        nvmet_fc_tgtport_put(tgtport);
1159out_ida:
1160        ida_simple_remove(&tgtport->assoc_cnt, idx);
1161out_free_assoc:
1162        kfree(assoc);
1163        return NULL;
1164}
1165
1166static void
1167nvmet_fc_target_assoc_free(struct kref *ref)
1168{
1169        struct nvmet_fc_tgt_assoc *assoc =
1170                container_of(ref, struct nvmet_fc_tgt_assoc, ref);
1171        struct nvmet_fc_tgtport *tgtport = assoc->tgtport;
1172        struct nvmet_fc_ls_iod  *oldls;
1173        unsigned long flags;
1174
1175        /* Send Disconnect now that all i/o has completed */
1176        nvmet_fc_xmt_disconnect_assoc(assoc);
1177
1178        nvmet_fc_free_hostport(assoc->hostport);
1179        spin_lock_irqsave(&tgtport->lock, flags);
1180        list_del_rcu(&assoc->a_list);
1181        oldls = assoc->rcv_disconn;
1182        spin_unlock_irqrestore(&tgtport->lock, flags);
1183        /* if pending Rcv Disconnect Association LS, send rsp now */
1184        if (oldls)
1185                nvmet_fc_xmt_ls_rsp(tgtport, oldls);
1186        ida_simple_remove(&tgtport->assoc_cnt, assoc->a_id);
1187        dev_info(tgtport->dev,
1188                "{%d:%d} Association freed\n",
1189                tgtport->fc_target_port.port_num, assoc->a_id);
1190        kfree_rcu(assoc, rcu);
1191        nvmet_fc_tgtport_put(tgtport);
1192}
1193
1194static void
1195nvmet_fc_tgt_a_put(struct nvmet_fc_tgt_assoc *assoc)
1196{
1197        kref_put(&assoc->ref, nvmet_fc_target_assoc_free);
1198}
1199
1200static int
1201nvmet_fc_tgt_a_get(struct nvmet_fc_tgt_assoc *assoc)
1202{
1203        return kref_get_unless_zero(&assoc->ref);
1204}
1205
1206static void
1207nvmet_fc_delete_target_assoc(struct nvmet_fc_tgt_assoc *assoc)
1208{
1209        struct nvmet_fc_tgtport *tgtport = assoc->tgtport;
1210        struct nvmet_fc_tgt_queue *queue;
1211        int i, terminating;
1212
1213        terminating = atomic_xchg(&assoc->terminating, 1);
1214
1215        /* if already terminating, do nothing */
1216        if (terminating)
1217                return;
1218
1219
1220        for (i = NVMET_NR_QUEUES; i >= 0; i--) {
1221                rcu_read_lock();
1222                queue = rcu_dereference(assoc->queues[i]);
1223                if (!queue) {
1224                        rcu_read_unlock();
1225                        continue;
1226                }
1227
1228                if (!nvmet_fc_tgt_q_get(queue)) {
1229                        rcu_read_unlock();
1230                        continue;
1231                }
1232                rcu_read_unlock();
1233                nvmet_fc_delete_target_queue(queue);
1234                nvmet_fc_tgt_q_put(queue);
1235        }
1236
1237        dev_info(tgtport->dev,
1238                "{%d:%d} Association deleted\n",
1239                tgtport->fc_target_port.port_num, assoc->a_id);
1240
1241        nvmet_fc_tgt_a_put(assoc);
1242}
1243
1244static struct nvmet_fc_tgt_assoc *
1245nvmet_fc_find_target_assoc(struct nvmet_fc_tgtport *tgtport,
1246                                u64 association_id)
1247{
1248        struct nvmet_fc_tgt_assoc *assoc;
1249        struct nvmet_fc_tgt_assoc *ret = NULL;
1250
1251        rcu_read_lock();
1252        list_for_each_entry_rcu(assoc, &tgtport->assoc_list, a_list) {
1253                if (association_id == assoc->association_id) {
1254                        ret = assoc;
1255                        if (!nvmet_fc_tgt_a_get(assoc))
1256                                ret = NULL;
1257                        break;
1258                }
1259        }
1260        rcu_read_unlock();
1261
1262        return ret;
1263}
1264
1265static void
1266nvmet_fc_portentry_bind(struct nvmet_fc_tgtport *tgtport,
1267                        struct nvmet_fc_port_entry *pe,
1268                        struct nvmet_port *port)
1269{
1270        lockdep_assert_held(&nvmet_fc_tgtlock);
1271
1272        pe->tgtport = tgtport;
1273        tgtport->pe = pe;
1274
1275        pe->port = port;
1276        port->priv = pe;
1277
1278        pe->node_name = tgtport->fc_target_port.node_name;
1279        pe->port_name = tgtport->fc_target_port.port_name;
1280        INIT_LIST_HEAD(&pe->pe_list);
1281
1282        list_add_tail(&pe->pe_list, &nvmet_fc_portentry_list);
1283}
1284
1285static void
1286nvmet_fc_portentry_unbind(struct nvmet_fc_port_entry *pe)
1287{
1288        unsigned long flags;
1289
1290        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1291        if (pe->tgtport)
1292                pe->tgtport->pe = NULL;
1293        list_del(&pe->pe_list);
1294        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1295}
1296
1297/*
1298 * called when a targetport deregisters. Breaks the relationship
1299 * with the nvmet port, but leaves the port_entry in place so that
1300 * re-registration can resume operation.
1301 */
1302static void
1303nvmet_fc_portentry_unbind_tgt(struct nvmet_fc_tgtport *tgtport)
1304{
1305        struct nvmet_fc_port_entry *pe;
1306        unsigned long flags;
1307
1308        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1309        pe = tgtport->pe;
1310        if (pe)
1311                pe->tgtport = NULL;
1312        tgtport->pe = NULL;
1313        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1314}
1315
1316/*
1317 * called when a new targetport is registered. Looks in the
1318 * existing nvmet port_entries to see if the nvmet layer is
1319 * configured for the targetport's wwn's. (the targetport existed,
1320 * nvmet configured, the lldd unregistered the tgtport, and is now
1321 * reregistering the same targetport).  If so, set the nvmet port
1322 * port entry on the targetport.
1323 */
1324static void
1325nvmet_fc_portentry_rebind_tgt(struct nvmet_fc_tgtport *tgtport)
1326{
1327        struct nvmet_fc_port_entry *pe;
1328        unsigned long flags;
1329
1330        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1331        list_for_each_entry(pe, &nvmet_fc_portentry_list, pe_list) {
1332                if (tgtport->fc_target_port.node_name == pe->node_name &&
1333                    tgtport->fc_target_port.port_name == pe->port_name) {
1334                        WARN_ON(pe->tgtport);
1335                        tgtport->pe = pe;
1336                        pe->tgtport = tgtport;
1337                        break;
1338                }
1339        }
1340        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1341}
1342
1343/**
1344 * nvme_fc_register_targetport - transport entry point called by an
1345 *                              LLDD to register the existence of a local
1346 *                              NVME subystem FC port.
1347 * @pinfo:     pointer to information about the port to be registered
1348 * @template:  LLDD entrypoints and operational parameters for the port
1349 * @dev:       physical hardware device node port corresponds to. Will be
1350 *             used for DMA mappings
1351 * @portptr:   pointer to a local port pointer. Upon success, the routine
1352 *             will allocate a nvme_fc_local_port structure and place its
1353 *             address in the local port pointer. Upon failure, local port
1354 *             pointer will be set to NULL.
1355 *
1356 * Returns:
1357 * a completion status. Must be 0 upon success; a negative errno
1358 * (ex: -ENXIO) upon failure.
1359 */
1360int
1361nvmet_fc_register_targetport(struct nvmet_fc_port_info *pinfo,
1362                        struct nvmet_fc_target_template *template,
1363                        struct device *dev,
1364                        struct nvmet_fc_target_port **portptr)
1365{
1366        struct nvmet_fc_tgtport *newrec;
1367        unsigned long flags;
1368        int ret, idx;
1369
1370        if (!template->xmt_ls_rsp || !template->fcp_op ||
1371            !template->fcp_abort ||
1372            !template->fcp_req_release || !template->targetport_delete ||
1373            !template->max_hw_queues || !template->max_sgl_segments ||
1374            !template->max_dif_sgl_segments || !template->dma_boundary) {
1375                ret = -EINVAL;
1376                goto out_regtgt_failed;
1377        }
1378
1379        newrec = kzalloc((sizeof(*newrec) + template->target_priv_sz),
1380                         GFP_KERNEL);
1381        if (!newrec) {
1382                ret = -ENOMEM;
1383                goto out_regtgt_failed;
1384        }
1385
1386        idx = ida_simple_get(&nvmet_fc_tgtport_cnt, 0, 0, GFP_KERNEL);
1387        if (idx < 0) {
1388                ret = -ENOSPC;
1389                goto out_fail_kfree;
1390        }
1391
1392        if (!get_device(dev) && dev) {
1393                ret = -ENODEV;
1394                goto out_ida_put;
1395        }
1396
1397        newrec->fc_target_port.node_name = pinfo->node_name;
1398        newrec->fc_target_port.port_name = pinfo->port_name;
1399        if (template->target_priv_sz)
1400                newrec->fc_target_port.private = &newrec[1];
1401        else
1402                newrec->fc_target_port.private = NULL;
1403        newrec->fc_target_port.port_id = pinfo->port_id;
1404        newrec->fc_target_port.port_num = idx;
1405        INIT_LIST_HEAD(&newrec->tgt_list);
1406        newrec->dev = dev;
1407        newrec->ops = template;
1408        spin_lock_init(&newrec->lock);
1409        INIT_LIST_HEAD(&newrec->ls_rcv_list);
1410        INIT_LIST_HEAD(&newrec->ls_req_list);
1411        INIT_LIST_HEAD(&newrec->ls_busylist);
1412        INIT_LIST_HEAD(&newrec->assoc_list);
1413        INIT_LIST_HEAD(&newrec->host_list);
1414        kref_init(&newrec->ref);
1415        ida_init(&newrec->assoc_cnt);
1416        newrec->max_sg_cnt = template->max_sgl_segments;
1417
1418        ret = nvmet_fc_alloc_ls_iodlist(newrec);
1419        if (ret) {
1420                ret = -ENOMEM;
1421                goto out_free_newrec;
1422        }
1423
1424        nvmet_fc_portentry_rebind_tgt(newrec);
1425
1426        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1427        list_add_tail(&newrec->tgt_list, &nvmet_fc_target_list);
1428        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1429
1430        *portptr = &newrec->fc_target_port;
1431        return 0;
1432
1433out_free_newrec:
1434        put_device(dev);
1435out_ida_put:
1436        ida_simple_remove(&nvmet_fc_tgtport_cnt, idx);
1437out_fail_kfree:
1438        kfree(newrec);
1439out_regtgt_failed:
1440        *portptr = NULL;
1441        return ret;
1442}
1443EXPORT_SYMBOL_GPL(nvmet_fc_register_targetport);
1444
1445
1446static void
1447nvmet_fc_free_tgtport(struct kref *ref)
1448{
1449        struct nvmet_fc_tgtport *tgtport =
1450                container_of(ref, struct nvmet_fc_tgtport, ref);
1451        struct device *dev = tgtport->dev;
1452        unsigned long flags;
1453
1454        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1455        list_del(&tgtport->tgt_list);
1456        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1457
1458        nvmet_fc_free_ls_iodlist(tgtport);
1459
1460        /* let the LLDD know we've finished tearing it down */
1461        tgtport->ops->targetport_delete(&tgtport->fc_target_port);
1462
1463        ida_simple_remove(&nvmet_fc_tgtport_cnt,
1464                        tgtport->fc_target_port.port_num);
1465
1466        ida_destroy(&tgtport->assoc_cnt);
1467
1468        kfree(tgtport);
1469
1470        put_device(dev);
1471}
1472
1473static void
1474nvmet_fc_tgtport_put(struct nvmet_fc_tgtport *tgtport)
1475{
1476        kref_put(&tgtport->ref, nvmet_fc_free_tgtport);
1477}
1478
1479static int
1480nvmet_fc_tgtport_get(struct nvmet_fc_tgtport *tgtport)
1481{
1482        return kref_get_unless_zero(&tgtport->ref);
1483}
1484
1485static void
1486__nvmet_fc_free_assocs(struct nvmet_fc_tgtport *tgtport)
1487{
1488        struct nvmet_fc_tgt_assoc *assoc;
1489
1490        rcu_read_lock();
1491        list_for_each_entry_rcu(assoc, &tgtport->assoc_list, a_list) {
1492                if (!nvmet_fc_tgt_a_get(assoc))
1493                        continue;
1494                if (!schedule_work(&assoc->del_work))
1495                        /* already deleting - release local reference */
1496                        nvmet_fc_tgt_a_put(assoc);
1497        }
1498        rcu_read_unlock();
1499}
1500
1501/**
1502 * nvmet_fc_invalidate_host - transport entry point called by an LLDD
1503 *                       to remove references to a hosthandle for LS's.
1504 *
1505 * The nvmet-fc layer ensures that any references to the hosthandle
1506 * on the targetport are forgotten (set to NULL).  The LLDD will
1507 * typically call this when a login with a remote host port has been
1508 * lost, thus LS's for the remote host port are no longer possible.
1509 *
1510 * If an LS request is outstanding to the targetport/hosthandle (or
1511 * issued concurrently with the call to invalidate the host), the
1512 * LLDD is responsible for terminating/aborting the LS and completing
1513 * the LS request. It is recommended that these terminations/aborts
1514 * occur after calling to invalidate the host handle to avoid additional
1515 * retries by the nvmet-fc transport. The nvmet-fc transport may
1516 * continue to reference host handle while it cleans up outstanding
1517 * NVME associations. The nvmet-fc transport will call the
1518 * ops->host_release() callback to notify the LLDD that all references
1519 * are complete and the related host handle can be recovered.
1520 * Note: if there are no references, the callback may be called before
1521 * the invalidate host call returns.
1522 *
1523 * @target_port: pointer to the (registered) target port that a prior
1524 *              LS was received on and which supplied the transport the
1525 *              hosthandle.
1526 * @hosthandle: the handle (pointer) that represents the host port
1527 *              that no longer has connectivity and that LS's should
1528 *              no longer be directed to.
1529 */
1530void
1531nvmet_fc_invalidate_host(struct nvmet_fc_target_port *target_port,
1532                        void *hosthandle)
1533{
1534        struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
1535        struct nvmet_fc_tgt_assoc *assoc, *next;
1536        unsigned long flags;
1537        bool noassoc = true;
1538
1539        spin_lock_irqsave(&tgtport->lock, flags);
1540        list_for_each_entry_safe(assoc, next,
1541                                &tgtport->assoc_list, a_list) {
1542                if (!assoc->hostport ||
1543                    assoc->hostport->hosthandle != hosthandle)
1544                        continue;
1545                if (!nvmet_fc_tgt_a_get(assoc))
1546                        continue;
1547                assoc->hostport->invalid = 1;
1548                noassoc = false;
1549                if (!schedule_work(&assoc->del_work))
1550                        /* already deleting - release local reference */
1551                        nvmet_fc_tgt_a_put(assoc);
1552        }
1553        spin_unlock_irqrestore(&tgtport->lock, flags);
1554
1555        /* if there's nothing to wait for - call the callback */
1556        if (noassoc && tgtport->ops->host_release)
1557                tgtport->ops->host_release(hosthandle);
1558}
1559EXPORT_SYMBOL_GPL(nvmet_fc_invalidate_host);
1560
1561/*
1562 * nvmet layer has called to terminate an association
1563 */
1564static void
1565nvmet_fc_delete_ctrl(struct nvmet_ctrl *ctrl)
1566{
1567        struct nvmet_fc_tgtport *tgtport, *next;
1568        struct nvmet_fc_tgt_assoc *assoc;
1569        struct nvmet_fc_tgt_queue *queue;
1570        unsigned long flags;
1571        bool found_ctrl = false;
1572
1573        /* this is a bit ugly, but don't want to make locks layered */
1574        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1575        list_for_each_entry_safe(tgtport, next, &nvmet_fc_target_list,
1576                        tgt_list) {
1577                if (!nvmet_fc_tgtport_get(tgtport))
1578                        continue;
1579                spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1580
1581                rcu_read_lock();
1582                list_for_each_entry_rcu(assoc, &tgtport->assoc_list, a_list) {
1583                        queue = rcu_dereference(assoc->queues[0]);
1584                        if (queue && queue->nvme_sq.ctrl == ctrl) {
1585                                if (nvmet_fc_tgt_a_get(assoc))
1586                                        found_ctrl = true;
1587                                break;
1588                        }
1589                }
1590                rcu_read_unlock();
1591
1592                nvmet_fc_tgtport_put(tgtport);
1593
1594                if (found_ctrl) {
1595                        if (!schedule_work(&assoc->del_work))
1596                                /* already deleting - release local reference */
1597                                nvmet_fc_tgt_a_put(assoc);
1598                        return;
1599                }
1600
1601                spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
1602        }
1603        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
1604}
1605
1606/**
1607 * nvme_fc_unregister_targetport - transport entry point called by an
1608 *                              LLDD to deregister/remove a previously
1609 *                              registered a local NVME subsystem FC port.
1610 * @target_port: pointer to the (registered) target port that is to be
1611 *               deregistered.
1612 *
1613 * Returns:
1614 * a completion status. Must be 0 upon success; a negative errno
1615 * (ex: -ENXIO) upon failure.
1616 */
1617int
1618nvmet_fc_unregister_targetport(struct nvmet_fc_target_port *target_port)
1619{
1620        struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
1621
1622        nvmet_fc_portentry_unbind_tgt(tgtport);
1623
1624        /* terminate any outstanding associations */
1625        __nvmet_fc_free_assocs(tgtport);
1626
1627        /*
1628         * should terminate LS's as well. However, LS's will be generated
1629         * at the tail end of association termination, so they likely don't
1630         * exist yet. And even if they did, it's worthwhile to just let
1631         * them finish and targetport ref counting will clean things up.
1632         */
1633
1634        nvmet_fc_tgtport_put(tgtport);
1635
1636        return 0;
1637}
1638EXPORT_SYMBOL_GPL(nvmet_fc_unregister_targetport);
1639
1640
1641/* ********************** FC-NVME LS RCV Handling ************************* */
1642
1643
1644static void
1645nvmet_fc_ls_create_association(struct nvmet_fc_tgtport *tgtport,
1646                        struct nvmet_fc_ls_iod *iod)
1647{
1648        struct fcnvme_ls_cr_assoc_rqst *rqst = &iod->rqstbuf->rq_cr_assoc;
1649        struct fcnvme_ls_cr_assoc_acc *acc = &iod->rspbuf->rsp_cr_assoc;
1650        struct nvmet_fc_tgt_queue *queue;
1651        int ret = 0;
1652
1653        memset(acc, 0, sizeof(*acc));
1654
1655        /*
1656         * FC-NVME spec changes. There are initiators sending different
1657         * lengths as padding sizes for Create Association Cmd descriptor
1658         * was incorrect.
1659         * Accept anything of "minimum" length. Assume format per 1.15
1660         * spec (with HOSTID reduced to 16 bytes), ignore how long the
1661         * trailing pad length is.
1662         */
1663        if (iod->rqstdatalen < FCNVME_LSDESC_CRA_RQST_MINLEN)
1664                ret = VERR_CR_ASSOC_LEN;
1665        else if (be32_to_cpu(rqst->desc_list_len) <
1666                        FCNVME_LSDESC_CRA_RQST_MIN_LISTLEN)
1667                ret = VERR_CR_ASSOC_RQST_LEN;
1668        else if (rqst->assoc_cmd.desc_tag !=
1669                        cpu_to_be32(FCNVME_LSDESC_CREATE_ASSOC_CMD))
1670                ret = VERR_CR_ASSOC_CMD;
1671        else if (be32_to_cpu(rqst->assoc_cmd.desc_len) <
1672                        FCNVME_LSDESC_CRA_CMD_DESC_MIN_DESCLEN)
1673                ret = VERR_CR_ASSOC_CMD_LEN;
1674        else if (!rqst->assoc_cmd.ersp_ratio ||
1675                 (be16_to_cpu(rqst->assoc_cmd.ersp_ratio) >=
1676                                be16_to_cpu(rqst->assoc_cmd.sqsize)))
1677                ret = VERR_ERSP_RATIO;
1678
1679        else {
1680                /* new association w/ admin queue */
1681                iod->assoc = nvmet_fc_alloc_target_assoc(
1682                                                tgtport, iod->hosthandle);
1683                if (!iod->assoc)
1684                        ret = VERR_ASSOC_ALLOC_FAIL;
1685                else {
1686                        queue = nvmet_fc_alloc_target_queue(iod->assoc, 0,
1687                                        be16_to_cpu(rqst->assoc_cmd.sqsize));
1688                        if (!queue)
1689                                ret = VERR_QUEUE_ALLOC_FAIL;
1690                }
1691        }
1692
1693        if (ret) {
1694                dev_err(tgtport->dev,
1695                        "Create Association LS failed: %s\n",
1696                        validation_errors[ret]);
1697                iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
1698                                sizeof(*acc), rqst->w0.ls_cmd,
1699                                FCNVME_RJT_RC_LOGIC,
1700                                FCNVME_RJT_EXP_NONE, 0);
1701                return;
1702        }
1703
1704        queue->ersp_ratio = be16_to_cpu(rqst->assoc_cmd.ersp_ratio);
1705        atomic_set(&queue->connected, 1);
1706        queue->sqhd = 0;        /* best place to init value */
1707
1708        dev_info(tgtport->dev,
1709                "{%d:%d} Association created\n",
1710                tgtport->fc_target_port.port_num, iod->assoc->a_id);
1711
1712        /* format a response */
1713
1714        iod->lsrsp->rsplen = sizeof(*acc);
1715
1716        nvme_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1717                        fcnvme_lsdesc_len(
1718                                sizeof(struct fcnvme_ls_cr_assoc_acc)),
1719                        FCNVME_LS_CREATE_ASSOCIATION);
1720        acc->associd.desc_tag = cpu_to_be32(FCNVME_LSDESC_ASSOC_ID);
1721        acc->associd.desc_len =
1722                        fcnvme_lsdesc_len(
1723                                sizeof(struct fcnvme_lsdesc_assoc_id));
1724        acc->associd.association_id =
1725                        cpu_to_be64(nvmet_fc_makeconnid(iod->assoc, 0));
1726        acc->connectid.desc_tag = cpu_to_be32(FCNVME_LSDESC_CONN_ID);
1727        acc->connectid.desc_len =
1728                        fcnvme_lsdesc_len(
1729                                sizeof(struct fcnvme_lsdesc_conn_id));
1730        acc->connectid.connection_id = acc->associd.association_id;
1731}
1732
1733static void
1734nvmet_fc_ls_create_connection(struct nvmet_fc_tgtport *tgtport,
1735                        struct nvmet_fc_ls_iod *iod)
1736{
1737        struct fcnvme_ls_cr_conn_rqst *rqst = &iod->rqstbuf->rq_cr_conn;
1738        struct fcnvme_ls_cr_conn_acc *acc = &iod->rspbuf->rsp_cr_conn;
1739        struct nvmet_fc_tgt_queue *queue;
1740        int ret = 0;
1741
1742        memset(acc, 0, sizeof(*acc));
1743
1744        if (iod->rqstdatalen < sizeof(struct fcnvme_ls_cr_conn_rqst))
1745                ret = VERR_CR_CONN_LEN;
1746        else if (rqst->desc_list_len !=
1747                        fcnvme_lsdesc_len(
1748                                sizeof(struct fcnvme_ls_cr_conn_rqst)))
1749                ret = VERR_CR_CONN_RQST_LEN;
1750        else if (rqst->associd.desc_tag != cpu_to_be32(FCNVME_LSDESC_ASSOC_ID))
1751                ret = VERR_ASSOC_ID;
1752        else if (rqst->associd.desc_len !=
1753                        fcnvme_lsdesc_len(
1754                                sizeof(struct fcnvme_lsdesc_assoc_id)))
1755                ret = VERR_ASSOC_ID_LEN;
1756        else if (rqst->connect_cmd.desc_tag !=
1757                        cpu_to_be32(FCNVME_LSDESC_CREATE_CONN_CMD))
1758                ret = VERR_CR_CONN_CMD;
1759        else if (rqst->connect_cmd.desc_len !=
1760                        fcnvme_lsdesc_len(
1761                                sizeof(struct fcnvme_lsdesc_cr_conn_cmd)))
1762                ret = VERR_CR_CONN_CMD_LEN;
1763        else if (!rqst->connect_cmd.ersp_ratio ||
1764                 (be16_to_cpu(rqst->connect_cmd.ersp_ratio) >=
1765                                be16_to_cpu(rqst->connect_cmd.sqsize)))
1766                ret = VERR_ERSP_RATIO;
1767
1768        else {
1769                /* new io queue */
1770                iod->assoc = nvmet_fc_find_target_assoc(tgtport,
1771                                be64_to_cpu(rqst->associd.association_id));
1772                if (!iod->assoc)
1773                        ret = VERR_NO_ASSOC;
1774                else {
1775                        queue = nvmet_fc_alloc_target_queue(iod->assoc,
1776                                        be16_to_cpu(rqst->connect_cmd.qid),
1777                                        be16_to_cpu(rqst->connect_cmd.sqsize));
1778                        if (!queue)
1779                                ret = VERR_QUEUE_ALLOC_FAIL;
1780
1781                        /* release get taken in nvmet_fc_find_target_assoc */
1782                        nvmet_fc_tgt_a_put(iod->assoc);
1783                }
1784        }
1785
1786        if (ret) {
1787                dev_err(tgtport->dev,
1788                        "Create Connection LS failed: %s\n",
1789                        validation_errors[ret]);
1790                iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
1791                                sizeof(*acc), rqst->w0.ls_cmd,
1792                                (ret == VERR_NO_ASSOC) ?
1793                                        FCNVME_RJT_RC_INV_ASSOC :
1794                                        FCNVME_RJT_RC_LOGIC,
1795                                FCNVME_RJT_EXP_NONE, 0);
1796                return;
1797        }
1798
1799        queue->ersp_ratio = be16_to_cpu(rqst->connect_cmd.ersp_ratio);
1800        atomic_set(&queue->connected, 1);
1801        queue->sqhd = 0;        /* best place to init value */
1802
1803        /* format a response */
1804
1805        iod->lsrsp->rsplen = sizeof(*acc);
1806
1807        nvme_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1808                        fcnvme_lsdesc_len(sizeof(struct fcnvme_ls_cr_conn_acc)),
1809                        FCNVME_LS_CREATE_CONNECTION);
1810        acc->connectid.desc_tag = cpu_to_be32(FCNVME_LSDESC_CONN_ID);
1811        acc->connectid.desc_len =
1812                        fcnvme_lsdesc_len(
1813                                sizeof(struct fcnvme_lsdesc_conn_id));
1814        acc->connectid.connection_id =
1815                        cpu_to_be64(nvmet_fc_makeconnid(iod->assoc,
1816                                be16_to_cpu(rqst->connect_cmd.qid)));
1817}
1818
1819/*
1820 * Returns true if the LS response is to be transmit
1821 * Returns false if the LS response is to be delayed
1822 */
1823static int
1824nvmet_fc_ls_disconnect(struct nvmet_fc_tgtport *tgtport,
1825                        struct nvmet_fc_ls_iod *iod)
1826{
1827        struct fcnvme_ls_disconnect_assoc_rqst *rqst =
1828                                                &iod->rqstbuf->rq_dis_assoc;
1829        struct fcnvme_ls_disconnect_assoc_acc *acc =
1830                                                &iod->rspbuf->rsp_dis_assoc;
1831        struct nvmet_fc_tgt_assoc *assoc = NULL;
1832        struct nvmet_fc_ls_iod *oldls = NULL;
1833        unsigned long flags;
1834        int ret = 0;
1835
1836        memset(acc, 0, sizeof(*acc));
1837
1838        ret = nvmefc_vldt_lsreq_discon_assoc(iod->rqstdatalen, rqst);
1839        if (!ret) {
1840                /* match an active association - takes an assoc ref if !NULL */
1841                assoc = nvmet_fc_find_target_assoc(tgtport,
1842                                be64_to_cpu(rqst->associd.association_id));
1843                iod->assoc = assoc;
1844                if (!assoc)
1845                        ret = VERR_NO_ASSOC;
1846        }
1847
1848        if (ret || !assoc) {
1849                dev_err(tgtport->dev,
1850                        "Disconnect LS failed: %s\n",
1851                        validation_errors[ret]);
1852                iod->lsrsp->rsplen = nvme_fc_format_rjt(acc,
1853                                sizeof(*acc), rqst->w0.ls_cmd,
1854                                (ret == VERR_NO_ASSOC) ?
1855                                        FCNVME_RJT_RC_INV_ASSOC :
1856                                        FCNVME_RJT_RC_LOGIC,
1857                                FCNVME_RJT_EXP_NONE, 0);
1858                return true;
1859        }
1860
1861        /* format a response */
1862
1863        iod->lsrsp->rsplen = sizeof(*acc);
1864
1865        nvme_fc_format_rsp_hdr(acc, FCNVME_LS_ACC,
1866                        fcnvme_lsdesc_len(
1867                                sizeof(struct fcnvme_ls_disconnect_assoc_acc)),
1868                        FCNVME_LS_DISCONNECT_ASSOC);
1869
1870        /* release get taken in nvmet_fc_find_target_assoc */
1871        nvmet_fc_tgt_a_put(assoc);
1872
1873        /*
1874         * The rules for LS response says the response cannot
1875         * go back until ABTS's have been sent for all outstanding
1876         * I/O and a Disconnect Association LS has been sent.
1877         * So... save off the Disconnect LS to send the response
1878         * later. If there was a prior LS already saved, replace
1879         * it with the newer one and send a can't perform reject
1880         * on the older one.
1881         */
1882        spin_lock_irqsave(&tgtport->lock, flags);
1883        oldls = assoc->rcv_disconn;
1884        assoc->rcv_disconn = iod;
1885        spin_unlock_irqrestore(&tgtport->lock, flags);
1886
1887        nvmet_fc_delete_target_assoc(assoc);
1888
1889        if (oldls) {
1890                dev_info(tgtport->dev,
1891                        "{%d:%d} Multiple Disconnect Association LS's "
1892                        "received\n",
1893                        tgtport->fc_target_port.port_num, assoc->a_id);
1894                /* overwrite good response with bogus failure */
1895                oldls->lsrsp->rsplen = nvme_fc_format_rjt(oldls->rspbuf,
1896                                                sizeof(*iod->rspbuf),
1897                                                /* ok to use rqst, LS is same */
1898                                                rqst->w0.ls_cmd,
1899                                                FCNVME_RJT_RC_UNAB,
1900                                                FCNVME_RJT_EXP_NONE, 0);
1901                nvmet_fc_xmt_ls_rsp(tgtport, oldls);
1902        }
1903
1904        return false;
1905}
1906
1907
1908/* *********************** NVME Ctrl Routines **************************** */
1909
1910
1911static void nvmet_fc_fcp_nvme_cmd_done(struct nvmet_req *nvme_req);
1912
1913static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops;
1914
1915static void
1916nvmet_fc_xmt_ls_rsp_done(struct nvmefc_ls_rsp *lsrsp)
1917{
1918        struct nvmet_fc_ls_iod *iod = lsrsp->nvme_fc_private;
1919        struct nvmet_fc_tgtport *tgtport = iod->tgtport;
1920
1921        fc_dma_sync_single_for_cpu(tgtport->dev, iod->rspdma,
1922                                sizeof(*iod->rspbuf), DMA_TO_DEVICE);
1923        nvmet_fc_free_ls_iod(tgtport, iod);
1924        nvmet_fc_tgtport_put(tgtport);
1925}
1926
1927static void
1928nvmet_fc_xmt_ls_rsp(struct nvmet_fc_tgtport *tgtport,
1929                                struct nvmet_fc_ls_iod *iod)
1930{
1931        int ret;
1932
1933        fc_dma_sync_single_for_device(tgtport->dev, iod->rspdma,
1934                                  sizeof(*iod->rspbuf), DMA_TO_DEVICE);
1935
1936        ret = tgtport->ops->xmt_ls_rsp(&tgtport->fc_target_port, iod->lsrsp);
1937        if (ret)
1938                nvmet_fc_xmt_ls_rsp_done(iod->lsrsp);
1939}
1940
1941/*
1942 * Actual processing routine for received FC-NVME LS Requests from the LLD
1943 */
1944static void
1945nvmet_fc_handle_ls_rqst(struct nvmet_fc_tgtport *tgtport,
1946                        struct nvmet_fc_ls_iod *iod)
1947{
1948        struct fcnvme_ls_rqst_w0 *w0 = &iod->rqstbuf->rq_cr_assoc.w0;
1949        bool sendrsp = true;
1950
1951        iod->lsrsp->nvme_fc_private = iod;
1952        iod->lsrsp->rspbuf = iod->rspbuf;
1953        iod->lsrsp->rspdma = iod->rspdma;
1954        iod->lsrsp->done = nvmet_fc_xmt_ls_rsp_done;
1955        /* Be preventative. handlers will later set to valid length */
1956        iod->lsrsp->rsplen = 0;
1957
1958        iod->assoc = NULL;
1959
1960        /*
1961         * handlers:
1962         *   parse request input, execute the request, and format the
1963         *   LS response
1964         */
1965        switch (w0->ls_cmd) {
1966        case FCNVME_LS_CREATE_ASSOCIATION:
1967                /* Creates Association and initial Admin Queue/Connection */
1968                nvmet_fc_ls_create_association(tgtport, iod);
1969                break;
1970        case FCNVME_LS_CREATE_CONNECTION:
1971                /* Creates an IO Queue/Connection */
1972                nvmet_fc_ls_create_connection(tgtport, iod);
1973                break;
1974        case FCNVME_LS_DISCONNECT_ASSOC:
1975                /* Terminate a Queue/Connection or the Association */
1976                sendrsp = nvmet_fc_ls_disconnect(tgtport, iod);
1977                break;
1978        default:
1979                iod->lsrsp->rsplen = nvme_fc_format_rjt(iod->rspbuf,
1980                                sizeof(*iod->rspbuf), w0->ls_cmd,
1981                                FCNVME_RJT_RC_INVAL, FCNVME_RJT_EXP_NONE, 0);
1982        }
1983
1984        if (sendrsp)
1985                nvmet_fc_xmt_ls_rsp(tgtport, iod);
1986}
1987
1988/*
1989 * Actual processing routine for received FC-NVME LS Requests from the LLD
1990 */
1991static void
1992nvmet_fc_handle_ls_rqst_work(struct work_struct *work)
1993{
1994        struct nvmet_fc_ls_iod *iod =
1995                container_of(work, struct nvmet_fc_ls_iod, work);
1996        struct nvmet_fc_tgtport *tgtport = iod->tgtport;
1997
1998        nvmet_fc_handle_ls_rqst(tgtport, iod);
1999}
2000
2001
2002/**
2003 * nvmet_fc_rcv_ls_req - transport entry point called by an LLDD
2004 *                       upon the reception of a NVME LS request.
2005 *
2006 * The nvmet-fc layer will copy payload to an internal structure for
2007 * processing.  As such, upon completion of the routine, the LLDD may
2008 * immediately free/reuse the LS request buffer passed in the call.
2009 *
2010 * If this routine returns error, the LLDD should abort the exchange.
2011 *
2012 * @target_port: pointer to the (registered) target port the LS was
2013 *              received on.
2014 * @hosthandle: pointer to the host specific data, gets stored in iod.
2015 * @lsrsp:      pointer to a lsrsp structure to be used to reference
2016 *              the exchange corresponding to the LS.
2017 * @lsreqbuf:   pointer to the buffer containing the LS Request
2018 * @lsreqbuf_len: length, in bytes, of the received LS request
2019 */
2020int
2021nvmet_fc_rcv_ls_req(struct nvmet_fc_target_port *target_port,
2022                        void *hosthandle,
2023                        struct nvmefc_ls_rsp *lsrsp,
2024                        void *lsreqbuf, u32 lsreqbuf_len)
2025{
2026        struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
2027        struct nvmet_fc_ls_iod *iod;
2028        struct fcnvme_ls_rqst_w0 *w0 = (struct fcnvme_ls_rqst_w0 *)lsreqbuf;
2029
2030        if (lsreqbuf_len > sizeof(union nvmefc_ls_requests)) {
2031                dev_info(tgtport->dev,
2032                        "RCV %s LS failed: payload too large (%d)\n",
2033                        (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
2034                                nvmefc_ls_names[w0->ls_cmd] : "",
2035                        lsreqbuf_len);
2036                return -E2BIG;
2037        }
2038
2039        if (!nvmet_fc_tgtport_get(tgtport)) {
2040                dev_info(tgtport->dev,
2041                        "RCV %s LS failed: target deleting\n",
2042                        (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
2043                                nvmefc_ls_names[w0->ls_cmd] : "");
2044                return -ESHUTDOWN;
2045        }
2046
2047        iod = nvmet_fc_alloc_ls_iod(tgtport);
2048        if (!iod) {
2049                dev_info(tgtport->dev,
2050                        "RCV %s LS failed: context allocation failed\n",
2051                        (w0->ls_cmd <= NVME_FC_LAST_LS_CMD_VALUE) ?
2052                                nvmefc_ls_names[w0->ls_cmd] : "");
2053                nvmet_fc_tgtport_put(tgtport);
2054                return -ENOENT;
2055        }
2056
2057        iod->lsrsp = lsrsp;
2058        iod->fcpreq = NULL;
2059        memcpy(iod->rqstbuf, lsreqbuf, lsreqbuf_len);
2060        iod->rqstdatalen = lsreqbuf_len;
2061        iod->hosthandle = hosthandle;
2062
2063        schedule_work(&iod->work);
2064
2065        return 0;
2066}
2067EXPORT_SYMBOL_GPL(nvmet_fc_rcv_ls_req);
2068
2069
2070/*
2071 * **********************
2072 * Start of FCP handling
2073 * **********************
2074 */
2075
2076static int
2077nvmet_fc_alloc_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
2078{
2079        struct scatterlist *sg;
2080        unsigned int nent;
2081
2082        sg = sgl_alloc(fod->req.transfer_len, GFP_KERNEL, &nent);
2083        if (!sg)
2084                goto out;
2085
2086        fod->data_sg = sg;
2087        fod->data_sg_cnt = nent;
2088        fod->data_sg_cnt = fc_dma_map_sg(fod->tgtport->dev, sg, nent,
2089                                ((fod->io_dir == NVMET_FCP_WRITE) ?
2090                                        DMA_FROM_DEVICE : DMA_TO_DEVICE));
2091                                /* note: write from initiator perspective */
2092        fod->next_sg = fod->data_sg;
2093
2094        return 0;
2095
2096out:
2097        return NVME_SC_INTERNAL;
2098}
2099
2100static void
2101nvmet_fc_free_tgt_pgs(struct nvmet_fc_fcp_iod *fod)
2102{
2103        if (!fod->data_sg || !fod->data_sg_cnt)
2104                return;
2105
2106        fc_dma_unmap_sg(fod->tgtport->dev, fod->data_sg, fod->data_sg_cnt,
2107                                ((fod->io_dir == NVMET_FCP_WRITE) ?
2108                                        DMA_FROM_DEVICE : DMA_TO_DEVICE));
2109        sgl_free(fod->data_sg);
2110        fod->data_sg = NULL;
2111        fod->data_sg_cnt = 0;
2112}
2113
2114
2115static bool
2116queue_90percent_full(struct nvmet_fc_tgt_queue *q, u32 sqhd)
2117{
2118        u32 sqtail, used;
2119
2120        /* egad, this is ugly. And sqtail is just a best guess */
2121        sqtail = atomic_read(&q->sqtail) % q->sqsize;
2122
2123        used = (sqtail < sqhd) ? (sqtail + q->sqsize - sqhd) : (sqtail - sqhd);
2124        return ((used * 10) >= (((u32)(q->sqsize - 1) * 9)));
2125}
2126
2127/*
2128 * Prep RSP payload.
2129 * May be a NVMET_FCOP_RSP or NVMET_FCOP_READDATA_RSP op
2130 */
2131static void
2132nvmet_fc_prep_fcp_rsp(struct nvmet_fc_tgtport *tgtport,
2133                                struct nvmet_fc_fcp_iod *fod)
2134{
2135        struct nvme_fc_ersp_iu *ersp = &fod->rspiubuf;
2136        struct nvme_common_command *sqe = &fod->cmdiubuf.sqe.common;
2137        struct nvme_completion *cqe = &ersp->cqe;
2138        u32 *cqewd = (u32 *)cqe;
2139        bool send_ersp = false;
2140        u32 rsn, rspcnt, xfr_length;
2141
2142        if (fod->fcpreq->op == NVMET_FCOP_READDATA_RSP)
2143                xfr_length = fod->req.transfer_len;
2144        else
2145                xfr_length = fod->offset;
2146
2147        /*
2148         * check to see if we can send a 0's rsp.
2149         *   Note: to send a 0's response, the NVME-FC host transport will
2150         *   recreate the CQE. The host transport knows: sq id, SQHD (last
2151         *   seen in an ersp), and command_id. Thus it will create a
2152         *   zero-filled CQE with those known fields filled in. Transport
2153         *   must send an ersp for any condition where the cqe won't match
2154         *   this.
2155         *
2156         * Here are the FC-NVME mandated cases where we must send an ersp:
2157         *  every N responses, where N=ersp_ratio
2158         *  force fabric commands to send ersp's (not in FC-NVME but good
2159         *    practice)
2160         *  normal cmds: any time status is non-zero, or status is zero
2161         *     but words 0 or 1 are non-zero.
2162         *  the SQ is 90% or more full
2163         *  the cmd is a fused command
2164         *  transferred data length not equal to cmd iu length
2165         */
2166        rspcnt = atomic_inc_return(&fod->queue->zrspcnt);
2167        if (!(rspcnt % fod->queue->ersp_ratio) ||
2168            nvme_is_fabrics((struct nvme_command *) sqe) ||
2169            xfr_length != fod->req.transfer_len ||
2170            (le16_to_cpu(cqe->status) & 0xFFFE) || cqewd[0] || cqewd[1] ||
2171            (sqe->flags & (NVME_CMD_FUSE_FIRST | NVME_CMD_FUSE_SECOND)) ||
2172            queue_90percent_full(fod->queue, le16_to_cpu(cqe->sq_head)))
2173                send_ersp = true;
2174
2175        /* re-set the fields */
2176        fod->fcpreq->rspaddr = ersp;
2177        fod->fcpreq->rspdma = fod->rspdma;
2178
2179        if (!send_ersp) {
2180                memset(ersp, 0, NVME_FC_SIZEOF_ZEROS_RSP);
2181                fod->fcpreq->rsplen = NVME_FC_SIZEOF_ZEROS_RSP;
2182        } else {
2183                ersp->iu_len = cpu_to_be16(sizeof(*ersp)/sizeof(u32));
2184                rsn = atomic_inc_return(&fod->queue->rsn);
2185                ersp->rsn = cpu_to_be32(rsn);
2186                ersp->xfrd_len = cpu_to_be32(xfr_length);
2187                fod->fcpreq->rsplen = sizeof(*ersp);
2188        }
2189
2190        fc_dma_sync_single_for_device(tgtport->dev, fod->rspdma,
2191                                  sizeof(fod->rspiubuf), DMA_TO_DEVICE);
2192}
2193
2194static void nvmet_fc_xmt_fcp_op_done(struct nvmefc_tgt_fcp_req *fcpreq);
2195
2196static void
2197nvmet_fc_abort_op(struct nvmet_fc_tgtport *tgtport,
2198                                struct nvmet_fc_fcp_iod *fod)
2199{
2200        struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
2201
2202        /* data no longer needed */
2203        nvmet_fc_free_tgt_pgs(fod);
2204
2205        /*
2206         * if an ABTS was received or we issued the fcp_abort early
2207         * don't call abort routine again.
2208         */
2209        /* no need to take lock - lock was taken earlier to get here */
2210        if (!fod->aborted)
2211                tgtport->ops->fcp_abort(&tgtport->fc_target_port, fcpreq);
2212
2213        nvmet_fc_free_fcp_iod(fod->queue, fod);
2214}
2215
2216static void
2217nvmet_fc_xmt_fcp_rsp(struct nvmet_fc_tgtport *tgtport,
2218                                struct nvmet_fc_fcp_iod *fod)
2219{
2220        int ret;
2221
2222        fod->fcpreq->op = NVMET_FCOP_RSP;
2223        fod->fcpreq->timeout = 0;
2224
2225        nvmet_fc_prep_fcp_rsp(tgtport, fod);
2226
2227        ret = tgtport->ops->fcp_op(&tgtport->fc_target_port, fod->fcpreq);
2228        if (ret)
2229                nvmet_fc_abort_op(tgtport, fod);
2230}
2231
2232static void
2233nvmet_fc_transfer_fcp_data(struct nvmet_fc_tgtport *tgtport,
2234                                struct nvmet_fc_fcp_iod *fod, u8 op)
2235{
2236        struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
2237        struct scatterlist *sg = fod->next_sg;
2238        unsigned long flags;
2239        u32 remaininglen = fod->req.transfer_len - fod->offset;
2240        u32 tlen = 0;
2241        int ret;
2242
2243        fcpreq->op = op;
2244        fcpreq->offset = fod->offset;
2245        fcpreq->timeout = NVME_FC_TGTOP_TIMEOUT_SEC;
2246
2247        /*
2248         * for next sequence:
2249         *  break at a sg element boundary
2250         *  attempt to keep sequence length capped at
2251         *    NVMET_FC_MAX_SEQ_LENGTH but allow sequence to
2252         *    be longer if a single sg element is larger
2253         *    than that amount. This is done to avoid creating
2254         *    a new sg list to use for the tgtport api.
2255         */
2256        fcpreq->sg = sg;
2257        fcpreq->sg_cnt = 0;
2258        while (tlen < remaininglen &&
2259               fcpreq->sg_cnt < tgtport->max_sg_cnt &&
2260               tlen + sg_dma_len(sg) < NVMET_FC_MAX_SEQ_LENGTH) {
2261                fcpreq->sg_cnt++;
2262                tlen += sg_dma_len(sg);
2263                sg = sg_next(sg);
2264        }
2265        if (tlen < remaininglen && fcpreq->sg_cnt == 0) {
2266                fcpreq->sg_cnt++;
2267                tlen += min_t(u32, sg_dma_len(sg), remaininglen);
2268                sg = sg_next(sg);
2269        }
2270        if (tlen < remaininglen)
2271                fod->next_sg = sg;
2272        else
2273                fod->next_sg = NULL;
2274
2275        fcpreq->transfer_length = tlen;
2276        fcpreq->transferred_length = 0;
2277        fcpreq->fcp_error = 0;
2278        fcpreq->rsplen = 0;
2279
2280        /*
2281         * If the last READDATA request: check if LLDD supports
2282         * combined xfr with response.
2283         */
2284        if ((op == NVMET_FCOP_READDATA) &&
2285            ((fod->offset + fcpreq->transfer_length) == fod->req.transfer_len) &&
2286            (tgtport->ops->target_features & NVMET_FCTGTFEAT_READDATA_RSP)) {
2287                fcpreq->op = NVMET_FCOP_READDATA_RSP;
2288                nvmet_fc_prep_fcp_rsp(tgtport, fod);
2289        }
2290
2291        ret = tgtport->ops->fcp_op(&tgtport->fc_target_port, fod->fcpreq);
2292        if (ret) {
2293                /*
2294                 * should be ok to set w/o lock as its in the thread of
2295                 * execution (not an async timer routine) and doesn't
2296                 * contend with any clearing action
2297                 */
2298                fod->abort = true;
2299
2300                if (op == NVMET_FCOP_WRITEDATA) {
2301                        spin_lock_irqsave(&fod->flock, flags);
2302                        fod->writedataactive = false;
2303                        spin_unlock_irqrestore(&fod->flock, flags);
2304                        nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
2305                } else /* NVMET_FCOP_READDATA or NVMET_FCOP_READDATA_RSP */ {
2306                        fcpreq->fcp_error = ret;
2307                        fcpreq->transferred_length = 0;
2308                        nvmet_fc_xmt_fcp_op_done(fod->fcpreq);
2309                }
2310        }
2311}
2312
2313static inline bool
2314__nvmet_fc_fod_op_abort(struct nvmet_fc_fcp_iod *fod, bool abort)
2315{
2316        struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
2317        struct nvmet_fc_tgtport *tgtport = fod->tgtport;
2318
2319        /* if in the middle of an io and we need to tear down */
2320        if (abort) {
2321                if (fcpreq->op == NVMET_FCOP_WRITEDATA) {
2322                        nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
2323                        return true;
2324                }
2325
2326                nvmet_fc_abort_op(tgtport, fod);
2327                return true;
2328        }
2329
2330        return false;
2331}
2332
2333/*
2334 * actual done handler for FCP operations when completed by the lldd
2335 */
2336static void
2337nvmet_fc_fod_op_done(struct nvmet_fc_fcp_iod *fod)
2338{
2339        struct nvmefc_tgt_fcp_req *fcpreq = fod->fcpreq;
2340        struct nvmet_fc_tgtport *tgtport = fod->tgtport;
2341        unsigned long flags;
2342        bool abort;
2343
2344        spin_lock_irqsave(&fod->flock, flags);
2345        abort = fod->abort;
2346        fod->writedataactive = false;
2347        spin_unlock_irqrestore(&fod->flock, flags);
2348
2349        switch (fcpreq->op) {
2350
2351        case NVMET_FCOP_WRITEDATA:
2352                if (__nvmet_fc_fod_op_abort(fod, abort))
2353                        return;
2354                if (fcpreq->fcp_error ||
2355                    fcpreq->transferred_length != fcpreq->transfer_length) {
2356                        spin_lock_irqsave(&fod->flock, flags);
2357                        fod->abort = true;
2358                        spin_unlock_irqrestore(&fod->flock, flags);
2359
2360                        nvmet_req_complete(&fod->req, NVME_SC_INTERNAL);
2361                        return;
2362                }
2363
2364                fod->offset += fcpreq->transferred_length;
2365                if (fod->offset != fod->req.transfer_len) {
2366                        spin_lock_irqsave(&fod->flock, flags);
2367                        fod->writedataactive = true;
2368                        spin_unlock_irqrestore(&fod->flock, flags);
2369
2370                        /* transfer the next chunk */
2371                        nvmet_fc_transfer_fcp_data(tgtport, fod,
2372                                                NVMET_FCOP_WRITEDATA);
2373                        return;
2374                }
2375
2376                /* data transfer complete, resume with nvmet layer */
2377                fod->req.execute(&fod->req);
2378                break;
2379
2380        case NVMET_FCOP_READDATA:
2381        case NVMET_FCOP_READDATA_RSP:
2382                if (__nvmet_fc_fod_op_abort(fod, abort))
2383                        return;
2384                if (fcpreq->fcp_error ||
2385                    fcpreq->transferred_length != fcpreq->transfer_length) {
2386                        nvmet_fc_abort_op(tgtport, fod);
2387                        return;
2388                }
2389
2390                /* success */
2391
2392                if (fcpreq->op == NVMET_FCOP_READDATA_RSP) {
2393                        /* data no longer needed */
2394                        nvmet_fc_free_tgt_pgs(fod);
2395                        nvmet_fc_free_fcp_iod(fod->queue, fod);
2396                        return;
2397                }
2398
2399                fod->offset += fcpreq->transferred_length;
2400                if (fod->offset != fod->req.transfer_len) {
2401                        /* transfer the next chunk */
2402                        nvmet_fc_transfer_fcp_data(tgtport, fod,
2403                                                NVMET_FCOP_READDATA);
2404                        return;
2405                }
2406
2407                /* data transfer complete, send response */
2408
2409                /* data no longer needed */
2410                nvmet_fc_free_tgt_pgs(fod);
2411
2412                nvmet_fc_xmt_fcp_rsp(tgtport, fod);
2413
2414                break;
2415
2416        case NVMET_FCOP_RSP:
2417                if (__nvmet_fc_fod_op_abort(fod, abort))
2418                        return;
2419                nvmet_fc_free_fcp_iod(fod->queue, fod);
2420                break;
2421
2422        default:
2423                break;
2424        }
2425}
2426
2427static void
2428nvmet_fc_xmt_fcp_op_done(struct nvmefc_tgt_fcp_req *fcpreq)
2429{
2430        struct nvmet_fc_fcp_iod *fod = fcpreq->nvmet_fc_private;
2431
2432        nvmet_fc_fod_op_done(fod);
2433}
2434
2435/*
2436 * actual completion handler after execution by the nvmet layer
2437 */
2438static void
2439__nvmet_fc_fcp_nvme_cmd_done(struct nvmet_fc_tgtport *tgtport,
2440                        struct nvmet_fc_fcp_iod *fod, int status)
2441{
2442        struct nvme_common_command *sqe = &fod->cmdiubuf.sqe.common;
2443        struct nvme_completion *cqe = &fod->rspiubuf.cqe;
2444        unsigned long flags;
2445        bool abort;
2446
2447        spin_lock_irqsave(&fod->flock, flags);
2448        abort = fod->abort;
2449        spin_unlock_irqrestore(&fod->flock, flags);
2450
2451        /* if we have a CQE, snoop the last sq_head value */
2452        if (!status)
2453                fod->queue->sqhd = cqe->sq_head;
2454
2455        if (abort) {
2456                nvmet_fc_abort_op(tgtport, fod);
2457                return;
2458        }
2459
2460        /* if an error handling the cmd post initial parsing */
2461        if (status) {
2462                /* fudge up a failed CQE status for our transport error */
2463                memset(cqe, 0, sizeof(*cqe));
2464                cqe->sq_head = fod->queue->sqhd;        /* echo last cqe sqhd */
2465                cqe->sq_id = cpu_to_le16(fod->queue->qid);
2466                cqe->command_id = sqe->command_id;
2467                cqe->status = cpu_to_le16(status);
2468        } else {
2469
2470                /*
2471                 * try to push the data even if the SQE status is non-zero.
2472                 * There may be a status where data still was intended to
2473                 * be moved
2474                 */
2475                if ((fod->io_dir == NVMET_FCP_READ) && (fod->data_sg_cnt)) {
2476                        /* push the data over before sending rsp */
2477                        nvmet_fc_transfer_fcp_data(tgtport, fod,
2478                                                NVMET_FCOP_READDATA);
2479                        return;
2480                }
2481
2482                /* writes & no data - fall thru */
2483        }
2484
2485        /* data no longer needed */
2486        nvmet_fc_free_tgt_pgs(fod);
2487
2488        nvmet_fc_xmt_fcp_rsp(tgtport, fod);
2489}
2490
2491
2492static void
2493nvmet_fc_fcp_nvme_cmd_done(struct nvmet_req *nvme_req)
2494{
2495        struct nvmet_fc_fcp_iod *fod = nvmet_req_to_fod(nvme_req);
2496        struct nvmet_fc_tgtport *tgtport = fod->tgtport;
2497
2498        __nvmet_fc_fcp_nvme_cmd_done(tgtport, fod, 0);
2499}
2500
2501
2502/*
2503 * Actual processing routine for received FC-NVME I/O Requests from the LLD
2504 */
2505static void
2506nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
2507                        struct nvmet_fc_fcp_iod *fod)
2508{
2509        struct nvme_fc_cmd_iu *cmdiu = &fod->cmdiubuf;
2510        u32 xfrlen = be32_to_cpu(cmdiu->data_len);
2511        int ret;
2512
2513        /*
2514         * Fused commands are currently not supported in the linux
2515         * implementation.
2516         *
2517         * As such, the implementation of the FC transport does not
2518         * look at the fused commands and order delivery to the upper
2519         * layer until we have both based on csn.
2520         */
2521
2522        fod->fcpreq->done = nvmet_fc_xmt_fcp_op_done;
2523
2524        if (cmdiu->flags & FCNVME_CMD_FLAGS_WRITE) {
2525                fod->io_dir = NVMET_FCP_WRITE;
2526                if (!nvme_is_write(&cmdiu->sqe))
2527                        goto transport_error;
2528        } else if (cmdiu->flags & FCNVME_CMD_FLAGS_READ) {
2529                fod->io_dir = NVMET_FCP_READ;
2530                if (nvme_is_write(&cmdiu->sqe))
2531                        goto transport_error;
2532        } else {
2533                fod->io_dir = NVMET_FCP_NODATA;
2534                if (xfrlen)
2535                        goto transport_error;
2536        }
2537
2538        fod->req.cmd = &fod->cmdiubuf.sqe;
2539        fod->req.cqe = &fod->rspiubuf.cqe;
2540        if (tgtport->pe)
2541                fod->req.port = tgtport->pe->port;
2542
2543        /* clear any response payload */
2544        memset(&fod->rspiubuf, 0, sizeof(fod->rspiubuf));
2545
2546        fod->data_sg = NULL;
2547        fod->data_sg_cnt = 0;
2548
2549        ret = nvmet_req_init(&fod->req,
2550                                &fod->queue->nvme_cq,
2551                                &fod->queue->nvme_sq,
2552                                &nvmet_fc_tgt_fcp_ops);
2553        if (!ret) {
2554                /* bad SQE content or invalid ctrl state */
2555                /* nvmet layer has already called op done to send rsp. */
2556                return;
2557        }
2558
2559        fod->req.transfer_len = xfrlen;
2560
2561        /* keep a running counter of tail position */
2562        atomic_inc(&fod->queue->sqtail);
2563
2564        if (fod->req.transfer_len) {
2565                ret = nvmet_fc_alloc_tgt_pgs(fod);
2566                if (ret) {
2567                        nvmet_req_complete(&fod->req, ret);
2568                        return;
2569                }
2570        }
2571        fod->req.sg = fod->data_sg;
2572        fod->req.sg_cnt = fod->data_sg_cnt;
2573        fod->offset = 0;
2574
2575        if (fod->io_dir == NVMET_FCP_WRITE) {
2576                /* pull the data over before invoking nvmet layer */
2577                nvmet_fc_transfer_fcp_data(tgtport, fod, NVMET_FCOP_WRITEDATA);
2578                return;
2579        }
2580
2581        /*
2582         * Reads or no data:
2583         *
2584         * can invoke the nvmet_layer now. If read data, cmd completion will
2585         * push the data
2586         */
2587        fod->req.execute(&fod->req);
2588        return;
2589
2590transport_error:
2591        nvmet_fc_abort_op(tgtport, fod);
2592}
2593
2594/**
2595 * nvmet_fc_rcv_fcp_req - transport entry point called by an LLDD
2596 *                       upon the reception of a NVME FCP CMD IU.
2597 *
2598 * Pass a FC-NVME FCP CMD IU received from the FC link to the nvmet-fc
2599 * layer for processing.
2600 *
2601 * The nvmet_fc layer allocates a local job structure (struct
2602 * nvmet_fc_fcp_iod) from the queue for the io and copies the
2603 * CMD IU buffer to the job structure. As such, on a successful
2604 * completion (returns 0), the LLDD may immediately free/reuse
2605 * the CMD IU buffer passed in the call.
2606 *
2607 * However, in some circumstances, due to the packetized nature of FC
2608 * and the api of the FC LLDD which may issue a hw command to send the
2609 * response, but the LLDD may not get the hw completion for that command
2610 * and upcall the nvmet_fc layer before a new command may be
2611 * asynchronously received - its possible for a command to be received
2612 * before the LLDD and nvmet_fc have recycled the job structure. It gives
2613 * the appearance of more commands received than fits in the sq.
2614 * To alleviate this scenario, a temporary queue is maintained in the
2615 * transport for pending LLDD requests waiting for a queue job structure.
2616 * In these "overrun" cases, a temporary queue element is allocated
2617 * the LLDD request and CMD iu buffer information remembered, and the
2618 * routine returns a -EOVERFLOW status. Subsequently, when a queue job
2619 * structure is freed, it is immediately reallocated for anything on the
2620 * pending request list. The LLDDs defer_rcv() callback is called,
2621 * informing the LLDD that it may reuse the CMD IU buffer, and the io
2622 * is then started normally with the transport.
2623 *
2624 * The LLDD, when receiving an -EOVERFLOW completion status, is to treat
2625 * the completion as successful but must not reuse the CMD IU buffer
2626 * until the LLDD's defer_rcv() callback has been called for the
2627 * corresponding struct nvmefc_tgt_fcp_req pointer.
2628 *
2629 * If there is any other condition in which an error occurs, the
2630 * transport will return a non-zero status indicating the error.
2631 * In all cases other than -EOVERFLOW, the transport has not accepted the
2632 * request and the LLDD should abort the exchange.
2633 *
2634 * @target_port: pointer to the (registered) target port the FCP CMD IU
2635 *              was received on.
2636 * @fcpreq:     pointer to a fcpreq request structure to be used to reference
2637 *              the exchange corresponding to the FCP Exchange.
2638 * @cmdiubuf:   pointer to the buffer containing the FCP CMD IU
2639 * @cmdiubuf_len: length, in bytes, of the received FCP CMD IU
2640 */
2641int
2642nvmet_fc_rcv_fcp_req(struct nvmet_fc_target_port *target_port,
2643                        struct nvmefc_tgt_fcp_req *fcpreq,
2644                        void *cmdiubuf, u32 cmdiubuf_len)
2645{
2646        struct nvmet_fc_tgtport *tgtport = targetport_to_tgtport(target_port);
2647        struct nvme_fc_cmd_iu *cmdiu = cmdiubuf;
2648        struct nvmet_fc_tgt_queue *queue;
2649        struct nvmet_fc_fcp_iod *fod;
2650        struct nvmet_fc_defer_fcp_req *deferfcp;
2651        unsigned long flags;
2652
2653        /* validate iu, so the connection id can be used to find the queue */
2654        if ((cmdiubuf_len != sizeof(*cmdiu)) ||
2655                        (cmdiu->format_id != NVME_CMD_FORMAT_ID) ||
2656                        (cmdiu->fc_id != NVME_CMD_FC_ID) ||
2657                        (be16_to_cpu(cmdiu->iu_len) != (sizeof(*cmdiu)/4)))
2658                return -EIO;
2659
2660        queue = nvmet_fc_find_target_queue(tgtport,
2661                                be64_to_cpu(cmdiu->connection_id));
2662        if (!queue)
2663                return -ENOTCONN;
2664
2665        /*
2666         * note: reference taken by find_target_queue
2667         * After successful fod allocation, the fod will inherit the
2668         * ownership of that reference and will remove the reference
2669         * when the fod is freed.
2670         */
2671
2672        spin_lock_irqsave(&queue->qlock, flags);
2673
2674        fod = nvmet_fc_alloc_fcp_iod(queue);
2675        if (fod) {
2676                spin_unlock_irqrestore(&queue->qlock, flags);
2677
2678                fcpreq->nvmet_fc_private = fod;
2679                fod->fcpreq = fcpreq;
2680
2681                memcpy(&fod->cmdiubuf, cmdiubuf, cmdiubuf_len);
2682
2683                nvmet_fc_queue_fcp_req(tgtport, queue, fcpreq);
2684
2685                return 0;
2686        }
2687
2688        if (!tgtport->ops->defer_rcv) {
2689                spin_unlock_irqrestore(&queue->qlock, flags);
2690                /* release the queue lookup reference */
2691                nvmet_fc_tgt_q_put(queue);
2692                return -ENOENT;
2693        }
2694
2695        deferfcp = list_first_entry_or_null(&queue->avail_defer_list,
2696                        struct nvmet_fc_defer_fcp_req, req_list);
2697        if (deferfcp) {
2698                /* Just re-use one that was previously allocated */
2699                list_del(&deferfcp->req_list);
2700        } else {
2701                spin_unlock_irqrestore(&queue->qlock, flags);
2702
2703                /* Now we need to dynamically allocate one */
2704                deferfcp = kmalloc(sizeof(*deferfcp), GFP_KERNEL);
2705                if (!deferfcp) {
2706                        /* release the queue lookup reference */
2707                        nvmet_fc_tgt_q_put(queue);
2708                        return -ENOMEM;
2709                }
2710                spin_lock_irqsave(&queue->qlock, flags);
2711        }
2712
2713        /* For now, use rspaddr / rsplen to save payload information */
2714        fcpreq->rspaddr = cmdiubuf;
2715        fcpreq->rsplen  = cmdiubuf_len;
2716        deferfcp->fcp_req = fcpreq;
2717
2718        /* defer processing till a fod becomes available */
2719        list_add_tail(&deferfcp->req_list, &queue->pending_cmd_list);
2720
2721        /* NOTE: the queue lookup reference is still valid */
2722
2723        spin_unlock_irqrestore(&queue->qlock, flags);
2724
2725        return -EOVERFLOW;
2726}
2727EXPORT_SYMBOL_GPL(nvmet_fc_rcv_fcp_req);
2728
2729/**
2730 * nvmet_fc_rcv_fcp_abort - transport entry point called by an LLDD
2731 *                       upon the reception of an ABTS for a FCP command
2732 *
2733 * Notify the transport that an ABTS has been received for a FCP command
2734 * that had been given to the transport via nvmet_fc_rcv_fcp_req(). The
2735 * LLDD believes the command is still being worked on
2736 * (template_ops->fcp_req_release() has not been called).
2737 *
2738 * The transport will wait for any outstanding work (an op to the LLDD,
2739 * which the lldd should complete with error due to the ABTS; or the
2740 * completion from the nvmet layer of the nvme command), then will
2741 * stop processing and call the nvmet_fc_rcv_fcp_req() callback to
2742 * return the i/o context to the LLDD.  The LLDD may send the BA_ACC
2743 * to the ABTS either after return from this function (assuming any
2744 * outstanding op work has been terminated) or upon the callback being
2745 * called.
2746 *
2747 * @target_port: pointer to the (registered) target port the FCP CMD IU
2748 *              was received on.
2749 * @fcpreq:     pointer to the fcpreq request structure that corresponds
2750 *              to the exchange that received the ABTS.
2751 */
2752void
2753nvmet_fc_rcv_fcp_abort(struct nvmet_fc_target_port *target_port,
2754                        struct nvmefc_tgt_fcp_req *fcpreq)
2755{
2756        struct nvmet_fc_fcp_iod *fod = fcpreq->nvmet_fc_private;
2757        struct nvmet_fc_tgt_queue *queue;
2758        unsigned long flags;
2759
2760        if (!fod || fod->fcpreq != fcpreq)
2761                /* job appears to have already completed, ignore abort */
2762                return;
2763
2764        queue = fod->queue;
2765
2766        spin_lock_irqsave(&queue->qlock, flags);
2767        if (fod->active) {
2768                /*
2769                 * mark as abort. The abort handler, invoked upon completion
2770                 * of any work, will detect the aborted status and do the
2771                 * callback.
2772                 */
2773                spin_lock(&fod->flock);
2774                fod->abort = true;
2775                fod->aborted = true;
2776                spin_unlock(&fod->flock);
2777        }
2778        spin_unlock_irqrestore(&queue->qlock, flags);
2779}
2780EXPORT_SYMBOL_GPL(nvmet_fc_rcv_fcp_abort);
2781
2782
2783struct nvmet_fc_traddr {
2784        u64     nn;
2785        u64     pn;
2786};
2787
2788static int
2789__nvme_fc_parse_u64(substring_t *sstr, u64 *val)
2790{
2791        u64 token64;
2792
2793        if (match_u64(sstr, &token64))
2794                return -EINVAL;
2795        *val = token64;
2796
2797        return 0;
2798}
2799
2800/*
2801 * This routine validates and extracts the WWN's from the TRADDR string.
2802 * As kernel parsers need the 0x to determine number base, universally
2803 * build string to parse with 0x prefix before parsing name strings.
2804 */
2805static int
2806nvme_fc_parse_traddr(struct nvmet_fc_traddr *traddr, char *buf, size_t blen)
2807{
2808        char name[2 + NVME_FC_TRADDR_HEXNAMELEN + 1];
2809        substring_t wwn = { name, &name[sizeof(name)-1] };
2810        int nnoffset, pnoffset;
2811
2812        /* validate if string is one of the 2 allowed formats */
2813        if (strnlen(buf, blen) == NVME_FC_TRADDR_MAXLENGTH &&
2814                        !strncmp(buf, "nn-0x", NVME_FC_TRADDR_OXNNLEN) &&
2815                        !strncmp(&buf[NVME_FC_TRADDR_MAX_PN_OFFSET],
2816                                "pn-0x", NVME_FC_TRADDR_OXNNLEN)) {
2817                nnoffset = NVME_FC_TRADDR_OXNNLEN;
2818                pnoffset = NVME_FC_TRADDR_MAX_PN_OFFSET +
2819                                                NVME_FC_TRADDR_OXNNLEN;
2820        } else if ((strnlen(buf, blen) == NVME_FC_TRADDR_MINLENGTH &&
2821                        !strncmp(buf, "nn-", NVME_FC_TRADDR_NNLEN) &&
2822                        !strncmp(&buf[NVME_FC_TRADDR_MIN_PN_OFFSET],
2823                                "pn-", NVME_FC_TRADDR_NNLEN))) {
2824                nnoffset = NVME_FC_TRADDR_NNLEN;
2825                pnoffset = NVME_FC_TRADDR_MIN_PN_OFFSET + NVME_FC_TRADDR_NNLEN;
2826        } else
2827                goto out_einval;
2828
2829        name[0] = '0';
2830        name[1] = 'x';
2831        name[2 + NVME_FC_TRADDR_HEXNAMELEN] = 0;
2832
2833        memcpy(&name[2], &buf[nnoffset], NVME_FC_TRADDR_HEXNAMELEN);
2834        if (__nvme_fc_parse_u64(&wwn, &traddr->nn))
2835                goto out_einval;
2836
2837        memcpy(&name[2], &buf[pnoffset], NVME_FC_TRADDR_HEXNAMELEN);
2838        if (__nvme_fc_parse_u64(&wwn, &traddr->pn))
2839                goto out_einval;
2840
2841        return 0;
2842
2843out_einval:
2844        pr_warn("%s: bad traddr string\n", __func__);
2845        return -EINVAL;
2846}
2847
2848static int
2849nvmet_fc_add_port(struct nvmet_port *port)
2850{
2851        struct nvmet_fc_tgtport *tgtport;
2852        struct nvmet_fc_port_entry *pe;
2853        struct nvmet_fc_traddr traddr = { 0L, 0L };
2854        unsigned long flags;
2855        int ret;
2856
2857        /* validate the address info */
2858        if ((port->disc_addr.trtype != NVMF_TRTYPE_FC) ||
2859            (port->disc_addr.adrfam != NVMF_ADDR_FAMILY_FC))
2860                return -EINVAL;
2861
2862        /* map the traddr address info to a target port */
2863
2864        ret = nvme_fc_parse_traddr(&traddr, port->disc_addr.traddr,
2865                        sizeof(port->disc_addr.traddr));
2866        if (ret)
2867                return ret;
2868
2869        pe = kzalloc(sizeof(*pe), GFP_KERNEL);
2870        if (!pe)
2871                return -ENOMEM;
2872
2873        ret = -ENXIO;
2874        spin_lock_irqsave(&nvmet_fc_tgtlock, flags);
2875        list_for_each_entry(tgtport, &nvmet_fc_target_list, tgt_list) {
2876                if ((tgtport->fc_target_port.node_name == traddr.nn) &&
2877                    (tgtport->fc_target_port.port_name == traddr.pn)) {
2878                        /* a FC port can only be 1 nvmet port id */
2879                        if (!tgtport->pe) {
2880                                nvmet_fc_portentry_bind(tgtport, pe, port);
2881                                ret = 0;
2882                        } else
2883                                ret = -EALREADY;
2884                        break;
2885                }
2886        }
2887        spin_unlock_irqrestore(&nvmet_fc_tgtlock, flags);
2888
2889        if (ret)
2890                kfree(pe);
2891
2892        return ret;
2893}
2894
2895static void
2896nvmet_fc_remove_port(struct nvmet_port *port)
2897{
2898        struct nvmet_fc_port_entry *pe = port->priv;
2899
2900        nvmet_fc_portentry_unbind(pe);
2901
2902        kfree(pe);
2903}
2904
2905static void
2906nvmet_fc_discovery_chg(struct nvmet_port *port)
2907{
2908        struct nvmet_fc_port_entry *pe = port->priv;
2909        struct nvmet_fc_tgtport *tgtport = pe->tgtport;
2910
2911        if (tgtport && tgtport->ops->discovery_event)
2912                tgtport->ops->discovery_event(&tgtport->fc_target_port);
2913}
2914
2915static const struct nvmet_fabrics_ops nvmet_fc_tgt_fcp_ops = {
2916        .owner                  = THIS_MODULE,
2917        .type                   = NVMF_TRTYPE_FC,
2918        .msdbd                  = 1,
2919        .add_port               = nvmet_fc_add_port,
2920        .remove_port            = nvmet_fc_remove_port,
2921        .queue_response         = nvmet_fc_fcp_nvme_cmd_done,
2922        .delete_ctrl            = nvmet_fc_delete_ctrl,
2923        .discovery_chg          = nvmet_fc_discovery_chg,
2924};
2925
2926static int __init nvmet_fc_init_module(void)
2927{
2928        return nvmet_register_transport(&nvmet_fc_tgt_fcp_ops);
2929}
2930
2931static void __exit nvmet_fc_exit_module(void)
2932{
2933        /* sanity check - all lports should be removed */
2934        if (!list_empty(&nvmet_fc_target_list))
2935                pr_warn("%s: targetport list not empty\n", __func__);
2936
2937        nvmet_unregister_transport(&nvmet_fc_tgt_fcp_ops);
2938
2939        ida_destroy(&nvmet_fc_tgtport_cnt);
2940}
2941
2942module_init(nvmet_fc_init_module);
2943module_exit(nvmet_fc_exit_module);
2944
2945MODULE_LICENSE("GPL v2");
2946