1 /******************************************************************************* 2 * 3 * This file contains the Linux/SCSI LLD virtual SCSI initiator driver 4 * for emulated SAS initiator ports 5 * 6 * © Copyright 2011-2013 Datera, Inc. 7 * 8 * Licensed to the Linux Foundation under the General Public License (GPL) version 2. 9 * 10 * Author: Nicholas A. Bellinger <nab@risingtidesystems.com> 11 * 12 * This program is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License as published by 14 * the Free Software Foundation; either version 2 of the License, or 15 * (at your option) any later version. 16 * 17 * This program is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 ****************************************************************************/ 22 23 #include <linux/module.h> 24 #include <linux/moduleparam.h> 25 #include <linux/init.h> 26 #include <linux/slab.h> 27 #include <linux/types.h> 28 #include <linux/configfs.h> 29 #include <scsi/scsi.h> 30 #include <scsi/scsi_tcq.h> 31 #include <scsi/scsi_host.h> 32 #include <scsi/scsi_device.h> 33 #include <scsi/scsi_cmnd.h> 34 35 #include <target/target_core_base.h> 36 #include <target/target_core_fabric.h> 37 38 #include "tcm_loop.h" 39 40 #define to_tcm_loop_hba(hba) container_of(hba, struct tcm_loop_hba, dev) 41 42 static struct kmem_cache *tcm_loop_cmd_cache; 43 44 static int tcm_loop_hba_no_cnt; 45 46 static int tcm_loop_queue_status(struct se_cmd *se_cmd); 47 48 static unsigned int tcm_loop_nr_hw_queues = 1; 49 module_param_named(nr_hw_queues, tcm_loop_nr_hw_queues, uint, 0644); 50 51 static unsigned int tcm_loop_can_queue = 1024; 52 module_param_named(can_queue, tcm_loop_can_queue, uint, 0644); 53 54 static unsigned int tcm_loop_cmd_per_lun = 1024; 55 module_param_named(cmd_per_lun, tcm_loop_cmd_per_lun, uint, 0644); 56 57 /* 58 * Called from struct target_core_fabric_ops->check_stop_free() 59 */ 60 static int tcm_loop_check_stop_free(struct se_cmd *se_cmd) 61 { 62 return transport_generic_free_cmd(se_cmd, 0); 63 } 64 65 static void tcm_loop_release_cmd(struct se_cmd *se_cmd) 66 { 67 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 68 struct tcm_loop_cmd, tl_se_cmd); 69 struct scsi_cmnd *sc = tl_cmd->sc; 70 71 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) 72 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 73 else 74 scsi_done(sc); 75 } 76 77 static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host) 78 { 79 seq_puts(m, "tcm_loop_proc_info()\n"); 80 return 0; 81 } 82 83 static int tcm_loop_driver_probe(struct device *); 84 static void tcm_loop_driver_remove(struct device *); 85 86 static const struct bus_type tcm_loop_lld_bus = { 87 .name = "tcm_loop_bus", 88 .probe = tcm_loop_driver_probe, 89 .remove = tcm_loop_driver_remove, 90 }; 91 92 static struct device_driver tcm_loop_driverfs = { 93 .name = "tcm_loop", 94 .bus = &tcm_loop_lld_bus, 95 }; 96 /* 97 * Used with root_device_register() in tcm_loop_alloc_core_bus() below 98 */ 99 static struct device *tcm_loop_primary; 100 101 static void tcm_loop_target_queue_cmd(struct tcm_loop_cmd *tl_cmd) 102 { 103 struct se_cmd *se_cmd = &tl_cmd->tl_se_cmd; 104 struct scsi_cmnd *sc = tl_cmd->sc; 105 struct tcm_loop_nexus *tl_nexus; 106 struct tcm_loop_hba *tl_hba; 107 struct tcm_loop_tpg *tl_tpg; 108 struct scatterlist *sgl_bidi = NULL; 109 u32 sgl_bidi_count = 0, transfer_length; 110 111 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 112 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 113 114 /* 115 * Ensure that this tl_tpg reference from the incoming sc->device->id 116 * has already been configured via tcm_loop_make_naa_tpg(). 117 */ 118 if (!tl_tpg->tl_hba) { 119 set_host_byte(sc, DID_NO_CONNECT); 120 goto out_done; 121 } 122 if (tl_tpg->tl_transport_status == TCM_TRANSPORT_OFFLINE) { 123 set_host_byte(sc, DID_TRANSPORT_DISRUPTED); 124 goto out_done; 125 } 126 tl_nexus = tl_tpg->tl_nexus; 127 if (!tl_nexus) { 128 scmd_printk(KERN_ERR, sc, 129 "TCM_Loop I_T Nexus does not exist\n"); 130 set_host_byte(sc, DID_ERROR); 131 goto out_done; 132 } 133 134 transfer_length = scsi_transfer_length(sc); 135 if (!scsi_prot_sg_count(sc) && 136 scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) { 137 se_cmd->prot_pto = true; 138 /* 139 * loopback transport doesn't support 140 * WRITE_GENERATE, READ_STRIP protection 141 * information operations, go ahead unprotected. 142 */ 143 transfer_length = scsi_bufflen(sc); 144 } 145 146 se_cmd->tag = tl_cmd->sc_cmd_tag; 147 target_init_cmd(se_cmd, tl_nexus->se_sess, &tl_cmd->tl_sense_buf[0], 148 tl_cmd->sc->device->lun, transfer_length, 149 TCM_SIMPLE_TAG, sc->sc_data_direction, 0); 150 151 if (target_submit_prep(se_cmd, sc->cmnd, scsi_sglist(sc), 152 scsi_sg_count(sc), sgl_bidi, sgl_bidi_count, 153 scsi_prot_sglist(sc), scsi_prot_sg_count(sc), 154 GFP_ATOMIC)) 155 return; 156 157 target_submit(se_cmd); 158 return; 159 160 out_done: 161 scsi_done(sc); 162 } 163 164 /* 165 * ->queuecommand can be and usually is called from interrupt context, so 166 * defer the actual submission to a workqueue. 167 */ 168 static enum scsi_qc_status tcm_loop_queuecommand(struct Scsi_Host *sh, 169 struct scsi_cmnd *sc) 170 { 171 struct tcm_loop_cmd *tl_cmd = scsi_cmd_priv(sc); 172 173 pr_debug("%s() %d:%d:%d:%llu got CDB: 0x%02x scsi_buf_len: %u\n", 174 __func__, sc->device->host->host_no, sc->device->id, 175 sc->device->channel, sc->device->lun, sc->cmnd[0], 176 scsi_bufflen(sc)); 177 178 memset(tl_cmd, 0, sizeof(*tl_cmd)); 179 tl_cmd->sc = sc; 180 tl_cmd->sc_cmd_tag = blk_mq_unique_tag(scsi_cmd_to_rq(sc)); 181 182 tcm_loop_target_queue_cmd(tl_cmd); 183 return 0; 184 } 185 186 /* 187 * Called from SCSI EH process context to issue a LUN_RESET TMR 188 * to struct scsi_device 189 */ 190 static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg, 191 u64 lun, int task, enum tcm_tmreq_table tmr) 192 { 193 struct se_cmd *se_cmd; 194 struct se_session *se_sess; 195 struct tcm_loop_nexus *tl_nexus; 196 struct tcm_loop_cmd *tl_cmd; 197 int ret = TMR_FUNCTION_FAILED, rc; 198 199 /* 200 * Locate the tl_nexus and se_sess pointers 201 */ 202 tl_nexus = tl_tpg->tl_nexus; 203 if (!tl_nexus) { 204 pr_err("Unable to perform device reset without active I_T Nexus\n"); 205 return ret; 206 } 207 208 tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_KERNEL); 209 if (!tl_cmd) 210 return ret; 211 212 init_completion(&tl_cmd->tmr_done); 213 214 se_cmd = &tl_cmd->tl_se_cmd; 215 se_sess = tl_tpg->tl_nexus->se_sess; 216 217 rc = target_submit_tmr(se_cmd, se_sess, tl_cmd->tl_sense_buf, lun, 218 NULL, tmr, GFP_KERNEL, task, 219 TARGET_SCF_ACK_KREF); 220 if (rc < 0) 221 goto release; 222 wait_for_completion(&tl_cmd->tmr_done); 223 ret = se_cmd->se_tmr_req->response; 224 target_put_sess_cmd(se_cmd); 225 226 out: 227 return ret; 228 229 release: 230 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 231 goto out; 232 } 233 234 static int tcm_loop_abort_task(struct scsi_cmnd *sc) 235 { 236 struct tcm_loop_hba *tl_hba; 237 struct tcm_loop_tpg *tl_tpg; 238 int ret; 239 240 /* 241 * Locate the tcm_loop_hba_t pointer 242 */ 243 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 244 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 245 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, 246 blk_mq_unique_tag(scsi_cmd_to_rq(sc)), 247 TMR_ABORT_TASK); 248 return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; 249 } 250 251 /* 252 * Called from SCSI EH process context to issue a LUN_RESET TMR 253 * to struct scsi_device 254 */ 255 static int tcm_loop_device_reset(struct scsi_cmnd *sc) 256 { 257 struct tcm_loop_hba *tl_hba; 258 struct tcm_loop_tpg *tl_tpg; 259 int ret; 260 261 /* 262 * Locate the tcm_loop_hba_t pointer 263 */ 264 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 265 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 266 267 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, 268 0, TMR_LUN_RESET); 269 return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; 270 } 271 272 static int tcm_loop_target_reset(struct scsi_cmnd *sc) 273 { 274 struct tcm_loop_hba *tl_hba; 275 struct tcm_loop_tpg *tl_tpg; 276 277 /* 278 * Locate the tcm_loop_hba_t pointer 279 */ 280 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 281 if (!tl_hba) { 282 pr_err("Unable to perform device reset without active I_T Nexus\n"); 283 return FAILED; 284 } 285 /* 286 * Locate the tl_tpg pointer from TargetID in sc->device->id 287 */ 288 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 289 if (tl_tpg) { 290 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; 291 return SUCCESS; 292 } 293 return FAILED; 294 } 295 296 static const struct scsi_host_template tcm_loop_driver_template = { 297 .show_info = tcm_loop_show_info, 298 .proc_name = "tcm_loopback", 299 .name = "TCM_Loopback", 300 .queuecommand = tcm_loop_queuecommand, 301 .change_queue_depth = scsi_change_queue_depth, 302 .eh_abort_handler = tcm_loop_abort_task, 303 .eh_device_reset_handler = tcm_loop_device_reset, 304 .eh_target_reset_handler = tcm_loop_target_reset, 305 .this_id = -1, 306 .sg_tablesize = 256, 307 .max_sectors = 0xFFFF, 308 .dma_boundary = PAGE_SIZE - 1, 309 .module = THIS_MODULE, 310 .track_queue_depth = 1, 311 .cmd_size = sizeof(struct tcm_loop_cmd), 312 }; 313 314 static int tcm_loop_driver_probe(struct device *dev) 315 { 316 struct tcm_loop_hba *tl_hba; 317 struct Scsi_Host *sh; 318 int error, host_prot; 319 320 tl_hba = to_tcm_loop_hba(dev); 321 322 sh = scsi_host_alloc(&tcm_loop_driver_template, 323 sizeof(struct tcm_loop_hba)); 324 if (!sh) { 325 pr_err("Unable to allocate struct scsi_host\n"); 326 return -ENODEV; 327 } 328 tl_hba->sh = sh; 329 330 /* 331 * Assign the struct tcm_loop_hba pointer to struct Scsi_Host->hostdata 332 */ 333 *((struct tcm_loop_hba **)sh->hostdata) = tl_hba; 334 /* 335 * Setup single ID, Channel and LUN for now.. 336 */ 337 sh->max_id = 2; 338 sh->max_lun = 0; 339 sh->max_channel = 0; 340 sh->max_cmd_len = SCSI_MAX_VARLEN_CDB_SIZE; 341 sh->nr_hw_queues = tcm_loop_nr_hw_queues; 342 sh->can_queue = tcm_loop_can_queue; 343 sh->cmd_per_lun = tcm_loop_cmd_per_lun; 344 345 host_prot = SHOST_DIF_TYPE1_PROTECTION | SHOST_DIF_TYPE2_PROTECTION | 346 SHOST_DIF_TYPE3_PROTECTION | SHOST_DIX_TYPE1_PROTECTION | 347 SHOST_DIX_TYPE2_PROTECTION | SHOST_DIX_TYPE3_PROTECTION; 348 349 scsi_host_set_prot(sh, host_prot); 350 scsi_host_set_guard(sh, SHOST_DIX_GUARD_CRC); 351 352 error = scsi_add_host(sh, &tl_hba->dev); 353 if (error) { 354 pr_err("%s: scsi_add_host failed\n", __func__); 355 scsi_host_put(sh); 356 return -ENODEV; 357 } 358 return 0; 359 } 360 361 static void tcm_loop_driver_remove(struct device *dev) 362 { 363 struct tcm_loop_hba *tl_hba; 364 struct Scsi_Host *sh; 365 366 tl_hba = to_tcm_loop_hba(dev); 367 sh = tl_hba->sh; 368 369 scsi_remove_host(sh); 370 scsi_host_put(sh); 371 } 372 373 static void tcm_loop_release_adapter(struct device *dev) 374 { 375 struct tcm_loop_hba *tl_hba = to_tcm_loop_hba(dev); 376 377 kfree(tl_hba); 378 } 379 380 /* 381 * Called from tcm_loop_make_scsi_hba() in tcm_loop_configfs.c 382 */ 383 static int tcm_loop_setup_hba_bus(struct tcm_loop_hba *tl_hba, int tcm_loop_host_id) 384 { 385 int ret; 386 387 tl_hba->dev.bus = &tcm_loop_lld_bus; 388 tl_hba->dev.parent = tcm_loop_primary; 389 tl_hba->dev.release = &tcm_loop_release_adapter; 390 dev_set_name(&tl_hba->dev, "tcm_loop_adapter_%d", tcm_loop_host_id); 391 392 ret = device_register(&tl_hba->dev); 393 if (ret) { 394 pr_err("device_register() failed for tl_hba->dev: %d\n", ret); 395 put_device(&tl_hba->dev); 396 return -ENODEV; 397 } 398 399 return 0; 400 } 401 402 /* 403 * Called from tcm_loop_fabric_init() in tcl_loop_fabric.c to load the emulated 404 * tcm_loop SCSI bus. 405 */ 406 static int tcm_loop_alloc_core_bus(void) 407 { 408 int ret; 409 410 tcm_loop_primary = root_device_register("tcm_loop_0"); 411 if (IS_ERR(tcm_loop_primary)) { 412 pr_err("Unable to allocate tcm_loop_primary\n"); 413 return PTR_ERR(tcm_loop_primary); 414 } 415 416 ret = bus_register(&tcm_loop_lld_bus); 417 if (ret) { 418 pr_err("bus_register() failed for tcm_loop_lld_bus\n"); 419 goto dev_unreg; 420 } 421 422 ret = driver_register(&tcm_loop_driverfs); 423 if (ret) { 424 pr_err("driver_register() failed for tcm_loop_driverfs\n"); 425 goto bus_unreg; 426 } 427 428 pr_debug("Initialized TCM Loop Core Bus\n"); 429 return ret; 430 431 bus_unreg: 432 bus_unregister(&tcm_loop_lld_bus); 433 dev_unreg: 434 root_device_unregister(tcm_loop_primary); 435 return ret; 436 } 437 438 static void tcm_loop_release_core_bus(void) 439 { 440 driver_unregister(&tcm_loop_driverfs); 441 bus_unregister(&tcm_loop_lld_bus); 442 root_device_unregister(tcm_loop_primary); 443 444 pr_debug("Releasing TCM Loop Core BUS\n"); 445 } 446 447 static inline struct tcm_loop_tpg *tl_tpg(struct se_portal_group *se_tpg) 448 { 449 return container_of(se_tpg, struct tcm_loop_tpg, tl_se_tpg); 450 } 451 452 static char *tcm_loop_get_endpoint_wwn(struct se_portal_group *se_tpg) 453 { 454 /* 455 * Return the passed NAA identifier for the Target Port 456 */ 457 return &tl_tpg(se_tpg)->tl_hba->tl_wwn_address[0]; 458 } 459 460 static u16 tcm_loop_get_tag(struct se_portal_group *se_tpg) 461 { 462 /* 463 * This Tag is used when forming SCSI Name identifier in EVPD=1 0x83 464 * to represent the SCSI Target Port. 465 */ 466 return tl_tpg(se_tpg)->tl_tpgt; 467 } 468 469 /* 470 * Returning (1) here allows for target_core_mod struct se_node_acl to be generated 471 * based upon the incoming fabric dependent SCSI Initiator Port 472 */ 473 static int tcm_loop_check_demo_mode(struct se_portal_group *se_tpg) 474 { 475 return 1; 476 } 477 478 static int tcm_loop_check_prot_fabric_only(struct se_portal_group *se_tpg) 479 { 480 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg, 481 tl_se_tpg); 482 return tl_tpg->tl_fabric_prot_type; 483 } 484 485 static u32 tcm_loop_sess_get_index(struct se_session *se_sess) 486 { 487 return 1; 488 } 489 490 static int tcm_loop_get_cmd_state(struct se_cmd *se_cmd) 491 { 492 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 493 struct tcm_loop_cmd, tl_se_cmd); 494 495 return tl_cmd->sc_cmd_state; 496 } 497 498 static int tcm_loop_write_pending(struct se_cmd *se_cmd) 499 { 500 /* 501 * Since Linux/SCSI has already sent down a struct scsi_cmnd 502 * sc->sc_data_direction of DMA_TO_DEVICE with struct scatterlist array 503 * memory, and memory has already been mapped to struct se_cmd->t_mem_list 504 * format with transport_generic_map_mem_to_cmd(). 505 * 506 * We now tell TCM to add this WRITE CDB directly into the TCM storage 507 * object execution queue. 508 */ 509 target_execute_cmd(se_cmd); 510 return 0; 511 } 512 513 static int tcm_loop_queue_data_or_status(const char *func, 514 struct se_cmd *se_cmd, u8 scsi_status) 515 { 516 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 517 struct tcm_loop_cmd, tl_se_cmd); 518 struct scsi_cmnd *sc = tl_cmd->sc; 519 520 pr_debug("%s() called for scsi_cmnd: %p cdb: 0x%02x\n", 521 func, sc, sc->cmnd[0]); 522 523 if (se_cmd->sense_buffer && 524 ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || 525 (se_cmd->se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { 526 527 memcpy(sc->sense_buffer, se_cmd->sense_buffer, 528 SCSI_SENSE_BUFFERSIZE); 529 sc->result = SAM_STAT_CHECK_CONDITION; 530 } else 531 sc->result = scsi_status; 532 533 set_host_byte(sc, DID_OK); 534 if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || 535 (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) 536 scsi_set_resid(sc, se_cmd->residual_count); 537 return 0; 538 } 539 540 static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) 541 { 542 return tcm_loop_queue_data_or_status(__func__, se_cmd, SAM_STAT_GOOD); 543 } 544 545 static int tcm_loop_queue_status(struct se_cmd *se_cmd) 546 { 547 return tcm_loop_queue_data_or_status(__func__, 548 se_cmd, se_cmd->scsi_status); 549 } 550 551 static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd) 552 { 553 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 554 struct tcm_loop_cmd, tl_se_cmd); 555 556 /* Wake up tcm_loop_issue_tmr(). */ 557 complete(&tl_cmd->tmr_done); 558 } 559 560 static void tcm_loop_aborted_task(struct se_cmd *se_cmd) 561 { 562 return; 563 } 564 565 static char *tcm_loop_dump_proto_id(struct tcm_loop_hba *tl_hba) 566 { 567 switch (tl_hba->tl_proto_id) { 568 case SCSI_PROTOCOL_SAS: 569 return "SAS"; 570 case SCSI_PROTOCOL_FCP: 571 return "FCP"; 572 case SCSI_PROTOCOL_ISCSI: 573 return "iSCSI"; 574 default: 575 break; 576 } 577 578 return "Unknown"; 579 } 580 581 /* Start items for tcm_loop_port_cit */ 582 583 static int tcm_loop_port_link( 584 struct se_portal_group *se_tpg, 585 struct se_lun *lun) 586 { 587 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 588 struct tcm_loop_tpg, tl_se_tpg); 589 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 590 591 atomic_inc_mb(&tl_tpg->tl_tpg_port_count); 592 /* 593 * Add Linux/SCSI struct scsi_device by HCTL 594 */ 595 scsi_add_device(tl_hba->sh, 0, tl_tpg->tl_tpgt, lun->unpacked_lun); 596 597 pr_debug("TCM_Loop_ConfigFS: Port Link Successful\n"); 598 return 0; 599 } 600 601 static void tcm_loop_port_unlink( 602 struct se_portal_group *se_tpg, 603 struct se_lun *se_lun) 604 { 605 struct scsi_device *sd; 606 struct tcm_loop_hba *tl_hba; 607 struct tcm_loop_tpg *tl_tpg; 608 609 tl_tpg = container_of(se_tpg, struct tcm_loop_tpg, tl_se_tpg); 610 tl_hba = tl_tpg->tl_hba; 611 612 sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt, 613 se_lun->unpacked_lun); 614 if (!sd) { 615 pr_err("Unable to locate struct scsi_device for %d:%d:%llu\n", 616 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun); 617 return; 618 } 619 /* 620 * Remove Linux/SCSI struct scsi_device by HCTL 621 */ 622 scsi_remove_device(sd); 623 scsi_device_put(sd); 624 625 atomic_dec_mb(&tl_tpg->tl_tpg_port_count); 626 627 pr_debug("TCM_Loop_ConfigFS: Port Unlink Successful\n"); 628 } 629 630 /* End items for tcm_loop_port_cit */ 631 632 static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_show( 633 struct config_item *item, char *page) 634 { 635 struct se_portal_group *se_tpg = attrib_to_tpg(item); 636 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg, 637 tl_se_tpg); 638 639 return sprintf(page, "%d\n", tl_tpg->tl_fabric_prot_type); 640 } 641 642 static ssize_t tcm_loop_tpg_attrib_fabric_prot_type_store( 643 struct config_item *item, const char *page, size_t count) 644 { 645 struct se_portal_group *se_tpg = attrib_to_tpg(item); 646 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, struct tcm_loop_tpg, 647 tl_se_tpg); 648 unsigned long val; 649 int ret = kstrtoul(page, 0, &val); 650 651 if (ret) { 652 pr_err("kstrtoul() returned %d for fabric_prot_type\n", ret); 653 return ret; 654 } 655 if (val != 0 && val != 1 && val != 3) { 656 pr_err("Invalid qla2xxx fabric_prot_type: %lu\n", val); 657 return -EINVAL; 658 } 659 tl_tpg->tl_fabric_prot_type = val; 660 661 return count; 662 } 663 664 CONFIGFS_ATTR(tcm_loop_tpg_attrib_, fabric_prot_type); 665 666 static struct configfs_attribute *tcm_loop_tpg_attrib_attrs[] = { 667 &tcm_loop_tpg_attrib_attr_fabric_prot_type, 668 NULL, 669 }; 670 671 /* Start items for tcm_loop_nexus_cit */ 672 673 static int tcm_loop_alloc_sess_cb(struct se_portal_group *se_tpg, 674 struct se_session *se_sess, void *p) 675 { 676 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 677 struct tcm_loop_tpg, tl_se_tpg); 678 679 tl_tpg->tl_nexus = p; 680 return 0; 681 } 682 683 static int tcm_loop_make_nexus( 684 struct tcm_loop_tpg *tl_tpg, 685 const char *name) 686 { 687 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 688 struct tcm_loop_nexus *tl_nexus; 689 int ret; 690 691 if (tl_tpg->tl_nexus) { 692 pr_debug("tl_tpg->tl_nexus already exists\n"); 693 return -EEXIST; 694 } 695 696 tl_nexus = kzalloc(sizeof(*tl_nexus), GFP_KERNEL); 697 if (!tl_nexus) 698 return -ENOMEM; 699 700 tl_nexus->se_sess = target_setup_session(&tl_tpg->tl_se_tpg, 0, 0, 701 TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS, 702 name, tl_nexus, tcm_loop_alloc_sess_cb); 703 if (IS_ERR(tl_nexus->se_sess)) { 704 ret = PTR_ERR(tl_nexus->se_sess); 705 kfree(tl_nexus); 706 return ret; 707 } 708 709 pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated %s Initiator Port: %s\n", 710 tcm_loop_dump_proto_id(tl_hba), name); 711 return 0; 712 } 713 714 static int tcm_loop_drop_nexus( 715 struct tcm_loop_tpg *tpg) 716 { 717 struct se_session *se_sess; 718 struct tcm_loop_nexus *tl_nexus; 719 720 tl_nexus = tpg->tl_nexus; 721 if (!tl_nexus) 722 return -ENODEV; 723 724 se_sess = tl_nexus->se_sess; 725 if (!se_sess) 726 return -ENODEV; 727 728 if (atomic_read(&tpg->tl_tpg_port_count)) { 729 pr_err("Unable to remove TCM_Loop I_T Nexus with active TPG port count: %d\n", 730 atomic_read(&tpg->tl_tpg_port_count)); 731 return -EPERM; 732 } 733 734 pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated %s Initiator Port: %s\n", 735 tcm_loop_dump_proto_id(tpg->tl_hba), 736 tl_nexus->se_sess->se_node_acl->initiatorname); 737 /* 738 * Release the SCSI I_T Nexus to the emulated Target Port 739 */ 740 target_remove_session(se_sess); 741 tpg->tl_nexus = NULL; 742 kfree(tl_nexus); 743 return 0; 744 } 745 746 /* End items for tcm_loop_nexus_cit */ 747 748 static ssize_t tcm_loop_tpg_nexus_show(struct config_item *item, char *page) 749 { 750 struct se_portal_group *se_tpg = to_tpg(item); 751 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 752 struct tcm_loop_tpg, tl_se_tpg); 753 struct tcm_loop_nexus *tl_nexus; 754 ssize_t ret; 755 756 tl_nexus = tl_tpg->tl_nexus; 757 if (!tl_nexus) 758 return -ENODEV; 759 760 ret = snprintf(page, PAGE_SIZE, "%s\n", 761 tl_nexus->se_sess->se_node_acl->initiatorname); 762 763 return ret; 764 } 765 766 static ssize_t tcm_loop_tpg_nexus_store(struct config_item *item, 767 const char *page, size_t count) 768 { 769 struct se_portal_group *se_tpg = to_tpg(item); 770 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 771 struct tcm_loop_tpg, tl_se_tpg); 772 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 773 unsigned char i_port[TL_WWN_ADDR_LEN], *ptr, *port_ptr; 774 int ret; 775 /* 776 * Shutdown the active I_T nexus if 'NULL' is passed.. 777 */ 778 if (!strncmp(page, "NULL", 4)) { 779 ret = tcm_loop_drop_nexus(tl_tpg); 780 return (!ret) ? count : ret; 781 } 782 /* 783 * Otherwise make sure the passed virtual Initiator port WWN matches 784 * the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call 785 * tcm_loop_make_nexus() 786 */ 787 if (strlen(page) >= TL_WWN_ADDR_LEN) { 788 pr_err("Emulated NAA Sas Address: %s, exceeds max: %d\n", 789 page, TL_WWN_ADDR_LEN); 790 return -EINVAL; 791 } 792 snprintf(&i_port[0], TL_WWN_ADDR_LEN, "%s", page); 793 794 ptr = strstr(i_port, "naa."); 795 if (ptr) { 796 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_SAS) { 797 pr_err("Passed SAS Initiator Port %s does not match target port protoid: %s\n", 798 i_port, tcm_loop_dump_proto_id(tl_hba)); 799 return -EINVAL; 800 } 801 port_ptr = &i_port[0]; 802 goto check_newline; 803 } 804 ptr = strstr(i_port, "fc."); 805 if (ptr) { 806 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_FCP) { 807 pr_err("Passed FCP Initiator Port %s does not match target port protoid: %s\n", 808 i_port, tcm_loop_dump_proto_id(tl_hba)); 809 return -EINVAL; 810 } 811 port_ptr = &i_port[3]; /* Skip over "fc." */ 812 goto check_newline; 813 } 814 ptr = strstr(i_port, "iqn."); 815 if (ptr) { 816 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_ISCSI) { 817 pr_err("Passed iSCSI Initiator Port %s does not match target port protoid: %s\n", 818 i_port, tcm_loop_dump_proto_id(tl_hba)); 819 return -EINVAL; 820 } 821 port_ptr = &i_port[0]; 822 goto check_newline; 823 } 824 pr_err("Unable to locate prefix for emulated Initiator Port: %s\n", 825 i_port); 826 return -EINVAL; 827 /* 828 * Clear any trailing newline for the NAA WWN 829 */ 830 check_newline: 831 if (i_port[strlen(i_port)-1] == '\n') 832 i_port[strlen(i_port)-1] = '\0'; 833 834 ret = tcm_loop_make_nexus(tl_tpg, port_ptr); 835 if (ret < 0) 836 return ret; 837 838 return count; 839 } 840 841 static ssize_t tcm_loop_tpg_transport_status_show(struct config_item *item, 842 char *page) 843 { 844 struct se_portal_group *se_tpg = to_tpg(item); 845 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 846 struct tcm_loop_tpg, tl_se_tpg); 847 const char *status = NULL; 848 ssize_t ret = -EINVAL; 849 850 switch (tl_tpg->tl_transport_status) { 851 case TCM_TRANSPORT_ONLINE: 852 status = "online"; 853 break; 854 case TCM_TRANSPORT_OFFLINE: 855 status = "offline"; 856 break; 857 default: 858 break; 859 } 860 861 if (status) 862 ret = snprintf(page, PAGE_SIZE, "%s\n", status); 863 864 return ret; 865 } 866 867 static ssize_t tcm_loop_tpg_transport_status_store(struct config_item *item, 868 const char *page, size_t count) 869 { 870 struct se_portal_group *se_tpg = to_tpg(item); 871 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 872 struct tcm_loop_tpg, tl_se_tpg); 873 874 if (!strncmp(page, "online", 6)) { 875 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; 876 return count; 877 } 878 if (!strncmp(page, "offline", 7)) { 879 tl_tpg->tl_transport_status = TCM_TRANSPORT_OFFLINE; 880 if (tl_tpg->tl_nexus) { 881 struct se_session *tl_sess = tl_tpg->tl_nexus->se_sess; 882 883 core_allocate_nexus_loss_ua(tl_sess->se_node_acl); 884 } 885 return count; 886 } 887 return -EINVAL; 888 } 889 890 static ssize_t tcm_loop_tpg_address_show(struct config_item *item, 891 char *page) 892 { 893 struct se_portal_group *se_tpg = to_tpg(item); 894 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 895 struct tcm_loop_tpg, tl_se_tpg); 896 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 897 898 if (!tl_hba->sh) 899 return -ENODEV; 900 901 return snprintf(page, PAGE_SIZE, "%d:0:%d\n", 902 tl_hba->sh->host_no, tl_tpg->tl_tpgt); 903 } 904 905 CONFIGFS_ATTR(tcm_loop_tpg_, nexus); 906 CONFIGFS_ATTR(tcm_loop_tpg_, transport_status); 907 CONFIGFS_ATTR_RO(tcm_loop_tpg_, address); 908 909 static struct configfs_attribute *tcm_loop_tpg_attrs[] = { 910 &tcm_loop_tpg_attr_nexus, 911 &tcm_loop_tpg_attr_transport_status, 912 &tcm_loop_tpg_attr_address, 913 NULL, 914 }; 915 916 /* Start items for tcm_loop_naa_cit */ 917 918 static struct se_portal_group *tcm_loop_make_naa_tpg(struct se_wwn *wwn, 919 const char *name) 920 { 921 struct tcm_loop_hba *tl_hba = container_of(wwn, 922 struct tcm_loop_hba, tl_hba_wwn); 923 struct tcm_loop_tpg *tl_tpg; 924 int ret; 925 unsigned long tpgt; 926 927 if (strstr(name, "tpgt_") != name) { 928 pr_err("Unable to locate \"tpgt_#\" directory group\n"); 929 return ERR_PTR(-EINVAL); 930 } 931 if (kstrtoul(name+5, 10, &tpgt)) 932 return ERR_PTR(-EINVAL); 933 934 if (tpgt >= TL_TPGS_PER_HBA) { 935 pr_err("Passed tpgt: %lu exceeds TL_TPGS_PER_HBA: %u\n", 936 tpgt, TL_TPGS_PER_HBA); 937 return ERR_PTR(-EINVAL); 938 } 939 tl_tpg = &tl_hba->tl_hba_tpgs[tpgt]; 940 tl_tpg->tl_hba = tl_hba; 941 tl_tpg->tl_tpgt = tpgt; 942 /* 943 * Register the tl_tpg as a emulated TCM Target Endpoint 944 */ 945 ret = core_tpg_register(wwn, &tl_tpg->tl_se_tpg, tl_hba->tl_proto_id); 946 if (ret < 0) 947 return ERR_PTR(-ENOMEM); 948 949 pr_debug("TCM_Loop_ConfigFS: Allocated Emulated %s Target Port %s,t,0x%04lx\n", 950 tcm_loop_dump_proto_id(tl_hba), 951 config_item_name(&wwn->wwn_group.cg_item), tpgt); 952 return &tl_tpg->tl_se_tpg; 953 } 954 955 static void tcm_loop_drop_naa_tpg( 956 struct se_portal_group *se_tpg) 957 { 958 struct se_wwn *wwn = se_tpg->se_tpg_wwn; 959 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 960 struct tcm_loop_tpg, tl_se_tpg); 961 struct tcm_loop_hba *tl_hba; 962 unsigned short tpgt; 963 964 tl_hba = tl_tpg->tl_hba; 965 tpgt = tl_tpg->tl_tpgt; 966 /* 967 * Release the I_T Nexus for the Virtual target link if present 968 */ 969 tcm_loop_drop_nexus(tl_tpg); 970 /* 971 * Deregister the tl_tpg as a emulated TCM Target Endpoint 972 */ 973 core_tpg_deregister(se_tpg); 974 975 tl_tpg->tl_hba = NULL; 976 tl_tpg->tl_tpgt = 0; 977 978 pr_debug("TCM_Loop_ConfigFS: Deallocated Emulated %s Target Port %s,t,0x%04x\n", 979 tcm_loop_dump_proto_id(tl_hba), 980 config_item_name(&wwn->wwn_group.cg_item), tpgt); 981 } 982 983 /* End items for tcm_loop_naa_cit */ 984 985 /* Start items for tcm_loop_cit */ 986 987 static struct se_wwn *tcm_loop_make_scsi_hba( 988 struct target_fabric_configfs *tf, 989 struct config_group *group, 990 const char *name) 991 { 992 struct tcm_loop_hba *tl_hba; 993 struct Scsi_Host *sh; 994 char *ptr; 995 int ret, off = 0; 996 997 tl_hba = kzalloc(sizeof(*tl_hba), GFP_KERNEL); 998 if (!tl_hba) 999 return ERR_PTR(-ENOMEM); 1000 1001 /* 1002 * Determine the emulated Protocol Identifier and Target Port Name 1003 * based on the incoming configfs directory name. 1004 */ 1005 ptr = strstr(name, "naa."); 1006 if (ptr) { 1007 tl_hba->tl_proto_id = SCSI_PROTOCOL_SAS; 1008 goto check_len; 1009 } 1010 ptr = strstr(name, "fc."); 1011 if (ptr) { 1012 tl_hba->tl_proto_id = SCSI_PROTOCOL_FCP; 1013 off = 3; /* Skip over "fc." */ 1014 goto check_len; 1015 } 1016 ptr = strstr(name, "iqn."); 1017 if (!ptr) { 1018 pr_err("Unable to locate prefix for emulated Target Port: %s\n", 1019 name); 1020 ret = -EINVAL; 1021 goto out; 1022 } 1023 tl_hba->tl_proto_id = SCSI_PROTOCOL_ISCSI; 1024 1025 check_len: 1026 if (strlen(name) >= TL_WWN_ADDR_LEN) { 1027 pr_err("Emulated NAA %s Address: %s, exceeds max: %d\n", 1028 name, tcm_loop_dump_proto_id(tl_hba), TL_WWN_ADDR_LEN); 1029 ret = -EINVAL; 1030 goto out; 1031 } 1032 snprintf(&tl_hba->tl_wwn_address[0], TL_WWN_ADDR_LEN, "%s", &name[off]); 1033 1034 /* 1035 * Call device_register(tl_hba->dev) to register the emulated 1036 * Linux/SCSI LLD of type struct Scsi_Host at tl_hba->sh after 1037 * device_register() callbacks in tcm_loop_driver_probe() 1038 */ 1039 ret = tcm_loop_setup_hba_bus(tl_hba, tcm_loop_hba_no_cnt); 1040 if (ret) 1041 return ERR_PTR(ret); 1042 1043 sh = tl_hba->sh; 1044 tcm_loop_hba_no_cnt++; 1045 pr_debug("TCM_Loop_ConfigFS: Allocated emulated Target %s Address: %s at Linux/SCSI Host ID: %d\n", 1046 tcm_loop_dump_proto_id(tl_hba), name, sh->host_no); 1047 return &tl_hba->tl_hba_wwn; 1048 out: 1049 kfree(tl_hba); 1050 return ERR_PTR(ret); 1051 } 1052 1053 static void tcm_loop_drop_scsi_hba( 1054 struct se_wwn *wwn) 1055 { 1056 struct tcm_loop_hba *tl_hba = container_of(wwn, 1057 struct tcm_loop_hba, tl_hba_wwn); 1058 1059 pr_debug("TCM_Loop_ConfigFS: Deallocating emulated Target %s Address: %s at Linux/SCSI Host ID: %d\n", 1060 tcm_loop_dump_proto_id(tl_hba), tl_hba->tl_wwn_address, 1061 tl_hba->sh->host_no); 1062 /* 1063 * Call device_unregister() on the original tl_hba->dev. 1064 * tcm_loop_fabric_scsi.c:tcm_loop_release_adapter() will 1065 * release *tl_hba; 1066 */ 1067 device_unregister(&tl_hba->dev); 1068 } 1069 1070 /* Start items for tcm_loop_cit */ 1071 static ssize_t tcm_loop_wwn_version_show(struct config_item *item, char *page) 1072 { 1073 return sprintf(page, "TCM Loopback Fabric module %s\n", TCM_LOOP_VERSION); 1074 } 1075 1076 CONFIGFS_ATTR_RO(tcm_loop_wwn_, version); 1077 1078 static struct configfs_attribute *tcm_loop_wwn_attrs[] = { 1079 &tcm_loop_wwn_attr_version, 1080 NULL, 1081 }; 1082 1083 /* End items for tcm_loop_cit */ 1084 1085 static const struct target_core_fabric_ops loop_ops = { 1086 .module = THIS_MODULE, 1087 .fabric_name = "loopback", 1088 .tpg_get_wwn = tcm_loop_get_endpoint_wwn, 1089 .tpg_get_tag = tcm_loop_get_tag, 1090 .tpg_check_demo_mode = tcm_loop_check_demo_mode, 1091 .tpg_check_prot_fabric_only = tcm_loop_check_prot_fabric_only, 1092 .check_stop_free = tcm_loop_check_stop_free, 1093 .release_cmd = tcm_loop_release_cmd, 1094 .sess_get_index = tcm_loop_sess_get_index, 1095 .write_pending = tcm_loop_write_pending, 1096 .get_cmd_state = tcm_loop_get_cmd_state, 1097 .queue_data_in = tcm_loop_queue_data_in, 1098 .queue_status = tcm_loop_queue_status, 1099 .queue_tm_rsp = tcm_loop_queue_tm_rsp, 1100 .aborted_task = tcm_loop_aborted_task, 1101 .fabric_make_wwn = tcm_loop_make_scsi_hba, 1102 .fabric_drop_wwn = tcm_loop_drop_scsi_hba, 1103 .fabric_make_tpg = tcm_loop_make_naa_tpg, 1104 .fabric_drop_tpg = tcm_loop_drop_naa_tpg, 1105 .fabric_post_link = tcm_loop_port_link, 1106 .fabric_pre_unlink = tcm_loop_port_unlink, 1107 .tfc_wwn_attrs = tcm_loop_wwn_attrs, 1108 .tfc_tpg_base_attrs = tcm_loop_tpg_attrs, 1109 .tfc_tpg_attrib_attrs = tcm_loop_tpg_attrib_attrs, 1110 .default_submit_type = TARGET_QUEUE_SUBMIT, 1111 .direct_submit_supp = 0, 1112 }; 1113 1114 static int __init tcm_loop_fabric_init(void) 1115 { 1116 int ret = -ENOMEM; 1117 1118 tcm_loop_cmd_cache = kmem_cache_create("tcm_loop_cmd_cache", 1119 sizeof(struct tcm_loop_cmd), 1120 __alignof__(struct tcm_loop_cmd), 1121 0, NULL); 1122 if (!tcm_loop_cmd_cache) { 1123 pr_debug("kmem_cache_create() for tcm_loop_cmd_cache failed\n"); 1124 goto out; 1125 } 1126 1127 ret = tcm_loop_alloc_core_bus(); 1128 if (ret) 1129 goto out_destroy_cache; 1130 1131 ret = target_register_template(&loop_ops); 1132 if (ret) 1133 goto out_release_core_bus; 1134 1135 return 0; 1136 1137 out_release_core_bus: 1138 tcm_loop_release_core_bus(); 1139 out_destroy_cache: 1140 kmem_cache_destroy(tcm_loop_cmd_cache); 1141 out: 1142 return ret; 1143 } 1144 1145 static void __exit tcm_loop_fabric_exit(void) 1146 { 1147 target_unregister_template(&loop_ops); 1148 tcm_loop_release_core_bus(); 1149 kmem_cache_destroy(tcm_loop_cmd_cache); 1150 } 1151 1152 MODULE_DESCRIPTION("TCM loopback virtual Linux/SCSI fabric module"); 1153 MODULE_AUTHOR("Nicholas A. Bellinger <nab@risingtidesystems.com>"); 1154 MODULE_LICENSE("GPL"); 1155 module_init(tcm_loop_fabric_init); 1156 module_exit(tcm_loop_fabric_exit); 1157