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