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 #include <target/target_core_fabric_configfs.h> 38 #include <target/target_core_configfs.h> 39 40 #include "tcm_loop.h" 41 42 #define to_tcm_loop_hba(hba) container_of(hba, struct tcm_loop_hba, dev) 43 44 /* Local pointer to allocated TCM configfs fabric module */ 45 static struct target_fabric_configfs *tcm_loop_fabric_configfs; 46 47 static struct workqueue_struct *tcm_loop_workqueue; 48 static struct kmem_cache *tcm_loop_cmd_cache; 49 50 static int tcm_loop_hba_no_cnt; 51 52 static int tcm_loop_queue_status(struct se_cmd *se_cmd); 53 54 /* 55 * Called from struct target_core_fabric_ops->check_stop_free() 56 */ 57 static int tcm_loop_check_stop_free(struct se_cmd *se_cmd) 58 { 59 /* 60 * Do not release struct se_cmd's containing a valid TMR 61 * pointer. These will be released directly in tcm_loop_device_reset() 62 * with transport_generic_free_cmd(). 63 */ 64 if (se_cmd->se_cmd_flags & SCF_SCSI_TMR_CDB) 65 return 0; 66 /* 67 * Release the struct se_cmd, which will make a callback to release 68 * struct tcm_loop_cmd * in tcm_loop_deallocate_core_cmd() 69 */ 70 transport_generic_free_cmd(se_cmd, 0); 71 return 1; 72 } 73 74 static void tcm_loop_release_cmd(struct se_cmd *se_cmd) 75 { 76 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 77 struct tcm_loop_cmd, tl_se_cmd); 78 79 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 80 } 81 82 static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host) 83 { 84 seq_printf(m, "tcm_loop_proc_info()\n"); 85 return 0; 86 } 87 88 static int tcm_loop_driver_probe(struct device *); 89 static int tcm_loop_driver_remove(struct device *); 90 91 static int pseudo_lld_bus_match(struct device *dev, 92 struct device_driver *dev_driver) 93 { 94 return 1; 95 } 96 97 static struct bus_type tcm_loop_lld_bus = { 98 .name = "tcm_loop_bus", 99 .match = pseudo_lld_bus_match, 100 .probe = tcm_loop_driver_probe, 101 .remove = tcm_loop_driver_remove, 102 }; 103 104 static struct device_driver tcm_loop_driverfs = { 105 .name = "tcm_loop", 106 .bus = &tcm_loop_lld_bus, 107 }; 108 /* 109 * Used with root_device_register() in tcm_loop_alloc_core_bus() below 110 */ 111 struct device *tcm_loop_primary; 112 113 static void tcm_loop_submission_work(struct work_struct *work) 114 { 115 struct tcm_loop_cmd *tl_cmd = 116 container_of(work, struct tcm_loop_cmd, work); 117 struct se_cmd *se_cmd = &tl_cmd->tl_se_cmd; 118 struct scsi_cmnd *sc = tl_cmd->sc; 119 struct tcm_loop_nexus *tl_nexus; 120 struct tcm_loop_hba *tl_hba; 121 struct tcm_loop_tpg *tl_tpg; 122 struct scatterlist *sgl_bidi = NULL; 123 u32 sgl_bidi_count = 0, transfer_length; 124 int rc; 125 126 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 127 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 128 129 /* 130 * Ensure that this tl_tpg reference from the incoming sc->device->id 131 * has already been configured via tcm_loop_make_naa_tpg(). 132 */ 133 if (!tl_tpg->tl_hba) { 134 set_host_byte(sc, DID_NO_CONNECT); 135 goto out_done; 136 } 137 if (tl_tpg->tl_transport_status == TCM_TRANSPORT_OFFLINE) { 138 set_host_byte(sc, DID_TRANSPORT_DISRUPTED); 139 goto out_done; 140 } 141 tl_nexus = tl_tpg->tl_nexus; 142 if (!tl_nexus) { 143 scmd_printk(KERN_ERR, sc, "TCM_Loop I_T Nexus" 144 " does not exist\n"); 145 set_host_byte(sc, DID_ERROR); 146 goto out_done; 147 } 148 if (scsi_bidi_cmnd(sc)) { 149 struct scsi_data_buffer *sdb = scsi_in(sc); 150 151 sgl_bidi = sdb->table.sgl; 152 sgl_bidi_count = sdb->table.nents; 153 se_cmd->se_cmd_flags |= SCF_BIDI; 154 155 } 156 157 transfer_length = scsi_transfer_length(sc); 158 if (!scsi_prot_sg_count(sc) && 159 scsi_get_prot_op(sc) != SCSI_PROT_NORMAL) { 160 se_cmd->prot_pto = true; 161 /* 162 * loopback transport doesn't support 163 * WRITE_GENERATE, READ_STRIP protection 164 * information operations, go ahead unprotected. 165 */ 166 transfer_length = scsi_bufflen(sc); 167 } 168 169 rc = target_submit_cmd_map_sgls(se_cmd, tl_nexus->se_sess, sc->cmnd, 170 &tl_cmd->tl_sense_buf[0], tl_cmd->sc->device->lun, 171 transfer_length, TCM_SIMPLE_TAG, 172 sc->sc_data_direction, 0, 173 scsi_sglist(sc), scsi_sg_count(sc), 174 sgl_bidi, sgl_bidi_count, 175 scsi_prot_sglist(sc), scsi_prot_sg_count(sc)); 176 if (rc < 0) { 177 set_host_byte(sc, DID_NO_CONNECT); 178 goto out_done; 179 } 180 return; 181 182 out_done: 183 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 184 sc->scsi_done(sc); 185 return; 186 } 187 188 /* 189 * ->queuecommand can be and usually is called from interrupt context, so 190 * defer the actual submission to a workqueue. 191 */ 192 static int tcm_loop_queuecommand(struct Scsi_Host *sh, struct scsi_cmnd *sc) 193 { 194 struct tcm_loop_cmd *tl_cmd; 195 196 pr_debug("tcm_loop_queuecommand() %d:%d:%d:%llu got CDB: 0x%02x" 197 " scsi_buf_len: %u\n", sc->device->host->host_no, 198 sc->device->id, sc->device->channel, sc->device->lun, 199 sc->cmnd[0], scsi_bufflen(sc)); 200 201 tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_ATOMIC); 202 if (!tl_cmd) { 203 pr_err("Unable to allocate struct tcm_loop_cmd\n"); 204 set_host_byte(sc, DID_ERROR); 205 sc->scsi_done(sc); 206 return 0; 207 } 208 209 tl_cmd->sc = sc; 210 tl_cmd->sc_cmd_tag = sc->request->tag; 211 INIT_WORK(&tl_cmd->work, tcm_loop_submission_work); 212 queue_work(tcm_loop_workqueue, &tl_cmd->work); 213 return 0; 214 } 215 216 /* 217 * Called from SCSI EH process context to issue a LUN_RESET TMR 218 * to struct scsi_device 219 */ 220 static int tcm_loop_issue_tmr(struct tcm_loop_tpg *tl_tpg, 221 int lun, int task, enum tcm_tmreq_table tmr) 222 { 223 struct se_cmd *se_cmd = NULL; 224 struct se_session *se_sess; 225 struct se_portal_group *se_tpg; 226 struct tcm_loop_nexus *tl_nexus; 227 struct tcm_loop_cmd *tl_cmd = NULL; 228 struct tcm_loop_tmr *tl_tmr = NULL; 229 int ret = TMR_FUNCTION_FAILED, rc; 230 231 /* 232 * Locate the tl_nexus and se_sess pointers 233 */ 234 tl_nexus = tl_tpg->tl_nexus; 235 if (!tl_nexus) { 236 pr_err("Unable to perform device reset without" 237 " active I_T Nexus\n"); 238 return ret; 239 } 240 241 tl_cmd = kmem_cache_zalloc(tcm_loop_cmd_cache, GFP_KERNEL); 242 if (!tl_cmd) { 243 pr_err("Unable to allocate memory for tl_cmd\n"); 244 return ret; 245 } 246 247 tl_tmr = kzalloc(sizeof(struct tcm_loop_tmr), GFP_KERNEL); 248 if (!tl_tmr) { 249 pr_err("Unable to allocate memory for tl_tmr\n"); 250 goto release; 251 } 252 init_waitqueue_head(&tl_tmr->tl_tmr_wait); 253 254 se_cmd = &tl_cmd->tl_se_cmd; 255 se_tpg = &tl_tpg->tl_se_tpg; 256 se_sess = tl_tpg->tl_nexus->se_sess; 257 /* 258 * Initialize struct se_cmd descriptor from target_core_mod infrastructure 259 */ 260 transport_init_se_cmd(se_cmd, se_tpg->se_tpg_tfo, se_sess, 0, 261 DMA_NONE, TCM_SIMPLE_TAG, 262 &tl_cmd->tl_sense_buf[0]); 263 264 rc = core_tmr_alloc_req(se_cmd, tl_tmr, tmr, GFP_KERNEL); 265 if (rc < 0) 266 goto release; 267 268 if (tmr == TMR_ABORT_TASK) 269 se_cmd->se_tmr_req->ref_task_tag = task; 270 271 /* 272 * Locate the underlying TCM struct se_lun 273 */ 274 if (transport_lookup_tmr_lun(se_cmd, lun) < 0) { 275 ret = TMR_LUN_DOES_NOT_EXIST; 276 goto release; 277 } 278 /* 279 * Queue the TMR to TCM Core and sleep waiting for 280 * tcm_loop_queue_tm_rsp() to wake us up. 281 */ 282 transport_generic_handle_tmr(se_cmd); 283 wait_event(tl_tmr->tl_tmr_wait, atomic_read(&tl_tmr->tmr_complete)); 284 /* 285 * The TMR LUN_RESET has completed, check the response status and 286 * then release allocations. 287 */ 288 ret = se_cmd->se_tmr_req->response; 289 release: 290 if (se_cmd) 291 transport_generic_free_cmd(se_cmd, 1); 292 else 293 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 294 kfree(tl_tmr); 295 return ret; 296 } 297 298 static int tcm_loop_abort_task(struct scsi_cmnd *sc) 299 { 300 struct tcm_loop_hba *tl_hba; 301 struct tcm_loop_tpg *tl_tpg; 302 int ret = FAILED; 303 304 /* 305 * Locate the tcm_loop_hba_t pointer 306 */ 307 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 308 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 309 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, 310 sc->request->tag, TMR_ABORT_TASK); 311 return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; 312 } 313 314 /* 315 * Called from SCSI EH process context to issue a LUN_RESET TMR 316 * to struct scsi_device 317 */ 318 static int tcm_loop_device_reset(struct scsi_cmnd *sc) 319 { 320 struct tcm_loop_hba *tl_hba; 321 struct tcm_loop_tpg *tl_tpg; 322 int ret = FAILED; 323 324 /* 325 * Locate the tcm_loop_hba_t pointer 326 */ 327 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 328 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 329 330 ret = tcm_loop_issue_tmr(tl_tpg, sc->device->lun, 331 0, TMR_LUN_RESET); 332 return (ret == TMR_FUNCTION_COMPLETE) ? SUCCESS : FAILED; 333 } 334 335 static int tcm_loop_target_reset(struct scsi_cmnd *sc) 336 { 337 struct tcm_loop_hba *tl_hba; 338 struct tcm_loop_tpg *tl_tpg; 339 340 /* 341 * Locate the tcm_loop_hba_t pointer 342 */ 343 tl_hba = *(struct tcm_loop_hba **)shost_priv(sc->device->host); 344 if (!tl_hba) { 345 pr_err("Unable to perform device reset without" 346 " active I_T Nexus\n"); 347 return FAILED; 348 } 349 /* 350 * Locate the tl_tpg pointer from TargetID in sc->device->id 351 */ 352 tl_tpg = &tl_hba->tl_hba_tpgs[sc->device->id]; 353 if (tl_tpg) { 354 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; 355 return SUCCESS; 356 } 357 return FAILED; 358 } 359 360 static int tcm_loop_slave_alloc(struct scsi_device *sd) 361 { 362 set_bit(QUEUE_FLAG_BIDI, &sd->request_queue->queue_flags); 363 return 0; 364 } 365 366 static struct scsi_host_template tcm_loop_driver_template = { 367 .show_info = tcm_loop_show_info, 368 .proc_name = "tcm_loopback", 369 .name = "TCM_Loopback", 370 .queuecommand = tcm_loop_queuecommand, 371 .change_queue_depth = scsi_change_queue_depth, 372 .eh_abort_handler = tcm_loop_abort_task, 373 .eh_device_reset_handler = tcm_loop_device_reset, 374 .eh_target_reset_handler = tcm_loop_target_reset, 375 .can_queue = 1024, 376 .this_id = -1, 377 .sg_tablesize = 256, 378 .cmd_per_lun = 1024, 379 .max_sectors = 0xFFFF, 380 .use_clustering = DISABLE_CLUSTERING, 381 .slave_alloc = tcm_loop_slave_alloc, 382 .module = THIS_MODULE, 383 .use_blk_tags = 1, 384 .track_queue_depth = 1, 385 }; 386 387 static int tcm_loop_driver_probe(struct device *dev) 388 { 389 struct tcm_loop_hba *tl_hba; 390 struct Scsi_Host *sh; 391 int error, host_prot; 392 393 tl_hba = to_tcm_loop_hba(dev); 394 395 sh = scsi_host_alloc(&tcm_loop_driver_template, 396 sizeof(struct tcm_loop_hba)); 397 if (!sh) { 398 pr_err("Unable to allocate struct scsi_host\n"); 399 return -ENODEV; 400 } 401 tl_hba->sh = sh; 402 403 /* 404 * Assign the struct tcm_loop_hba pointer to struct Scsi_Host->hostdata 405 */ 406 *((struct tcm_loop_hba **)sh->hostdata) = tl_hba; 407 /* 408 * Setup single ID, Channel and LUN for now.. 409 */ 410 sh->max_id = 2; 411 sh->max_lun = 0; 412 sh->max_channel = 0; 413 sh->max_cmd_len = TL_SCSI_MAX_CMD_LEN; 414 415 host_prot = SHOST_DIF_TYPE1_PROTECTION | SHOST_DIF_TYPE2_PROTECTION | 416 SHOST_DIF_TYPE3_PROTECTION | SHOST_DIX_TYPE1_PROTECTION | 417 SHOST_DIX_TYPE2_PROTECTION | SHOST_DIX_TYPE3_PROTECTION; 418 419 scsi_host_set_prot(sh, host_prot); 420 scsi_host_set_guard(sh, SHOST_DIX_GUARD_CRC); 421 422 error = scsi_add_host(sh, &tl_hba->dev); 423 if (error) { 424 pr_err("%s: scsi_add_host failed\n", __func__); 425 scsi_host_put(sh); 426 return -ENODEV; 427 } 428 return 0; 429 } 430 431 static int tcm_loop_driver_remove(struct device *dev) 432 { 433 struct tcm_loop_hba *tl_hba; 434 struct Scsi_Host *sh; 435 436 tl_hba = to_tcm_loop_hba(dev); 437 sh = tl_hba->sh; 438 439 scsi_remove_host(sh); 440 scsi_host_put(sh); 441 return 0; 442 } 443 444 static void tcm_loop_release_adapter(struct device *dev) 445 { 446 struct tcm_loop_hba *tl_hba = to_tcm_loop_hba(dev); 447 448 kfree(tl_hba); 449 } 450 451 /* 452 * Called from tcm_loop_make_scsi_hba() in tcm_loop_configfs.c 453 */ 454 static int tcm_loop_setup_hba_bus(struct tcm_loop_hba *tl_hba, int tcm_loop_host_id) 455 { 456 int ret; 457 458 tl_hba->dev.bus = &tcm_loop_lld_bus; 459 tl_hba->dev.parent = tcm_loop_primary; 460 tl_hba->dev.release = &tcm_loop_release_adapter; 461 dev_set_name(&tl_hba->dev, "tcm_loop_adapter_%d", tcm_loop_host_id); 462 463 ret = device_register(&tl_hba->dev); 464 if (ret) { 465 pr_err("device_register() failed for" 466 " tl_hba->dev: %d\n", ret); 467 return -ENODEV; 468 } 469 470 return 0; 471 } 472 473 /* 474 * Called from tcm_loop_fabric_init() in tcl_loop_fabric.c to load the emulated 475 * tcm_loop SCSI bus. 476 */ 477 static int tcm_loop_alloc_core_bus(void) 478 { 479 int ret; 480 481 tcm_loop_primary = root_device_register("tcm_loop_0"); 482 if (IS_ERR(tcm_loop_primary)) { 483 pr_err("Unable to allocate tcm_loop_primary\n"); 484 return PTR_ERR(tcm_loop_primary); 485 } 486 487 ret = bus_register(&tcm_loop_lld_bus); 488 if (ret) { 489 pr_err("bus_register() failed for tcm_loop_lld_bus\n"); 490 goto dev_unreg; 491 } 492 493 ret = driver_register(&tcm_loop_driverfs); 494 if (ret) { 495 pr_err("driver_register() failed for" 496 "tcm_loop_driverfs\n"); 497 goto bus_unreg; 498 } 499 500 pr_debug("Initialized TCM Loop Core Bus\n"); 501 return ret; 502 503 bus_unreg: 504 bus_unregister(&tcm_loop_lld_bus); 505 dev_unreg: 506 root_device_unregister(tcm_loop_primary); 507 return ret; 508 } 509 510 static void tcm_loop_release_core_bus(void) 511 { 512 driver_unregister(&tcm_loop_driverfs); 513 bus_unregister(&tcm_loop_lld_bus); 514 root_device_unregister(tcm_loop_primary); 515 516 pr_debug("Releasing TCM Loop Core BUS\n"); 517 } 518 519 static char *tcm_loop_get_fabric_name(void) 520 { 521 return "loopback"; 522 } 523 524 static u8 tcm_loop_get_fabric_proto_ident(struct se_portal_group *se_tpg) 525 { 526 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 527 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 528 /* 529 * tl_proto_id is set at tcm_loop_configfs.c:tcm_loop_make_scsi_hba() 530 * time based on the protocol dependent prefix of the passed configfs group. 531 * 532 * Based upon tl_proto_id, TCM_Loop emulates the requested fabric 533 * ProtocolID using target_core_fabric_lib.c symbols. 534 */ 535 switch (tl_hba->tl_proto_id) { 536 case SCSI_PROTOCOL_SAS: 537 return sas_get_fabric_proto_ident(se_tpg); 538 case SCSI_PROTOCOL_FCP: 539 return fc_get_fabric_proto_ident(se_tpg); 540 case SCSI_PROTOCOL_ISCSI: 541 return iscsi_get_fabric_proto_ident(se_tpg); 542 default: 543 pr_err("Unknown tl_proto_id: 0x%02x, using" 544 " SAS emulation\n", tl_hba->tl_proto_id); 545 break; 546 } 547 548 return sas_get_fabric_proto_ident(se_tpg); 549 } 550 551 static char *tcm_loop_get_endpoint_wwn(struct se_portal_group *se_tpg) 552 { 553 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 554 /* 555 * Return the passed NAA identifier for the SAS Target Port 556 */ 557 return &tl_tpg->tl_hba->tl_wwn_address[0]; 558 } 559 560 static u16 tcm_loop_get_tag(struct se_portal_group *se_tpg) 561 { 562 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 563 /* 564 * This Tag is used when forming SCSI Name identifier in EVPD=1 0x83 565 * to represent the SCSI Target Port. 566 */ 567 return tl_tpg->tl_tpgt; 568 } 569 570 static u32 tcm_loop_get_default_depth(struct se_portal_group *se_tpg) 571 { 572 return 1; 573 } 574 575 static u32 tcm_loop_get_pr_transport_id( 576 struct se_portal_group *se_tpg, 577 struct se_node_acl *se_nacl, 578 struct t10_pr_registration *pr_reg, 579 int *format_code, 580 unsigned char *buf) 581 { 582 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 583 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 584 585 switch (tl_hba->tl_proto_id) { 586 case SCSI_PROTOCOL_SAS: 587 return sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg, 588 format_code, buf); 589 case SCSI_PROTOCOL_FCP: 590 return fc_get_pr_transport_id(se_tpg, se_nacl, pr_reg, 591 format_code, buf); 592 case SCSI_PROTOCOL_ISCSI: 593 return iscsi_get_pr_transport_id(se_tpg, se_nacl, pr_reg, 594 format_code, buf); 595 default: 596 pr_err("Unknown tl_proto_id: 0x%02x, using" 597 " SAS emulation\n", tl_hba->tl_proto_id); 598 break; 599 } 600 601 return sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg, 602 format_code, buf); 603 } 604 605 static u32 tcm_loop_get_pr_transport_id_len( 606 struct se_portal_group *se_tpg, 607 struct se_node_acl *se_nacl, 608 struct t10_pr_registration *pr_reg, 609 int *format_code) 610 { 611 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 612 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 613 614 switch (tl_hba->tl_proto_id) { 615 case SCSI_PROTOCOL_SAS: 616 return sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg, 617 format_code); 618 case SCSI_PROTOCOL_FCP: 619 return fc_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg, 620 format_code); 621 case SCSI_PROTOCOL_ISCSI: 622 return iscsi_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg, 623 format_code); 624 default: 625 pr_err("Unknown tl_proto_id: 0x%02x, using" 626 " SAS emulation\n", tl_hba->tl_proto_id); 627 break; 628 } 629 630 return sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg, 631 format_code); 632 } 633 634 /* 635 * Used for handling SCSI fabric dependent TransportIDs in SPC-3 and above 636 * Persistent Reservation SPEC_I_PT=1 and PROUT REGISTER_AND_MOVE operations. 637 */ 638 static char *tcm_loop_parse_pr_out_transport_id( 639 struct se_portal_group *se_tpg, 640 const char *buf, 641 u32 *out_tid_len, 642 char **port_nexus_ptr) 643 { 644 struct tcm_loop_tpg *tl_tpg = se_tpg->se_tpg_fabric_ptr; 645 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 646 647 switch (tl_hba->tl_proto_id) { 648 case SCSI_PROTOCOL_SAS: 649 return sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len, 650 port_nexus_ptr); 651 case SCSI_PROTOCOL_FCP: 652 return fc_parse_pr_out_transport_id(se_tpg, buf, out_tid_len, 653 port_nexus_ptr); 654 case SCSI_PROTOCOL_ISCSI: 655 return iscsi_parse_pr_out_transport_id(se_tpg, buf, out_tid_len, 656 port_nexus_ptr); 657 default: 658 pr_err("Unknown tl_proto_id: 0x%02x, using" 659 " SAS emulation\n", tl_hba->tl_proto_id); 660 break; 661 } 662 663 return sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len, 664 port_nexus_ptr); 665 } 666 667 /* 668 * Returning (1) here allows for target_core_mod struct se_node_acl to be generated 669 * based upon the incoming fabric dependent SCSI Initiator Port 670 */ 671 static int tcm_loop_check_demo_mode(struct se_portal_group *se_tpg) 672 { 673 return 1; 674 } 675 676 static int tcm_loop_check_demo_mode_cache(struct se_portal_group *se_tpg) 677 { 678 return 0; 679 } 680 681 /* 682 * Allow I_T Nexus full READ-WRITE access without explict Initiator Node ACLs for 683 * local virtual Linux/SCSI LLD passthrough into VM hypervisor guest 684 */ 685 static int tcm_loop_check_demo_mode_write_protect(struct se_portal_group *se_tpg) 686 { 687 return 0; 688 } 689 690 /* 691 * Because TCM_Loop does not use explict ACLs and MappedLUNs, this will 692 * never be called for TCM_Loop by target_core_fabric_configfs.c code. 693 * It has been added here as a nop for target_fabric_tf_ops_check() 694 */ 695 static int tcm_loop_check_prod_mode_write_protect(struct se_portal_group *se_tpg) 696 { 697 return 0; 698 } 699 700 static struct se_node_acl *tcm_loop_tpg_alloc_fabric_acl( 701 struct se_portal_group *se_tpg) 702 { 703 struct tcm_loop_nacl *tl_nacl; 704 705 tl_nacl = kzalloc(sizeof(struct tcm_loop_nacl), GFP_KERNEL); 706 if (!tl_nacl) { 707 pr_err("Unable to allocate struct tcm_loop_nacl\n"); 708 return NULL; 709 } 710 711 return &tl_nacl->se_node_acl; 712 } 713 714 static void tcm_loop_tpg_release_fabric_acl( 715 struct se_portal_group *se_tpg, 716 struct se_node_acl *se_nacl) 717 { 718 struct tcm_loop_nacl *tl_nacl = container_of(se_nacl, 719 struct tcm_loop_nacl, se_node_acl); 720 721 kfree(tl_nacl); 722 } 723 724 static u32 tcm_loop_get_inst_index(struct se_portal_group *se_tpg) 725 { 726 return 1; 727 } 728 729 static u32 tcm_loop_sess_get_index(struct se_session *se_sess) 730 { 731 return 1; 732 } 733 734 static void tcm_loop_set_default_node_attributes(struct se_node_acl *se_acl) 735 { 736 return; 737 } 738 739 static u32 tcm_loop_get_task_tag(struct se_cmd *se_cmd) 740 { 741 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 742 struct tcm_loop_cmd, tl_se_cmd); 743 744 return tl_cmd->sc_cmd_tag; 745 } 746 747 static int tcm_loop_get_cmd_state(struct se_cmd *se_cmd) 748 { 749 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 750 struct tcm_loop_cmd, tl_se_cmd); 751 752 return tl_cmd->sc_cmd_state; 753 } 754 755 static int tcm_loop_shutdown_session(struct se_session *se_sess) 756 { 757 return 0; 758 } 759 760 static void tcm_loop_close_session(struct se_session *se_sess) 761 { 762 return; 763 }; 764 765 static int tcm_loop_write_pending(struct se_cmd *se_cmd) 766 { 767 /* 768 * Since Linux/SCSI has already sent down a struct scsi_cmnd 769 * sc->sc_data_direction of DMA_TO_DEVICE with struct scatterlist array 770 * memory, and memory has already been mapped to struct se_cmd->t_mem_list 771 * format with transport_generic_map_mem_to_cmd(). 772 * 773 * We now tell TCM to add this WRITE CDB directly into the TCM storage 774 * object execution queue. 775 */ 776 target_execute_cmd(se_cmd); 777 return 0; 778 } 779 780 static int tcm_loop_write_pending_status(struct se_cmd *se_cmd) 781 { 782 return 0; 783 } 784 785 static int tcm_loop_queue_data_in(struct se_cmd *se_cmd) 786 { 787 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 788 struct tcm_loop_cmd, tl_se_cmd); 789 struct scsi_cmnd *sc = tl_cmd->sc; 790 791 pr_debug("tcm_loop_queue_data_in() called for scsi_cmnd: %p" 792 " cdb: 0x%02x\n", sc, sc->cmnd[0]); 793 794 sc->result = SAM_STAT_GOOD; 795 set_host_byte(sc, DID_OK); 796 if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || 797 (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) 798 scsi_set_resid(sc, se_cmd->residual_count); 799 sc->scsi_done(sc); 800 return 0; 801 } 802 803 static int tcm_loop_queue_status(struct se_cmd *se_cmd) 804 { 805 struct tcm_loop_cmd *tl_cmd = container_of(se_cmd, 806 struct tcm_loop_cmd, tl_se_cmd); 807 struct scsi_cmnd *sc = tl_cmd->sc; 808 809 pr_debug("tcm_loop_queue_status() called for scsi_cmnd: %p" 810 " cdb: 0x%02x\n", sc, sc->cmnd[0]); 811 812 if (se_cmd->sense_buffer && 813 ((se_cmd->se_cmd_flags & SCF_TRANSPORT_TASK_SENSE) || 814 (se_cmd->se_cmd_flags & SCF_EMULATED_TASK_SENSE))) { 815 816 memcpy(sc->sense_buffer, se_cmd->sense_buffer, 817 SCSI_SENSE_BUFFERSIZE); 818 sc->result = SAM_STAT_CHECK_CONDITION; 819 set_driver_byte(sc, DRIVER_SENSE); 820 } else 821 sc->result = se_cmd->scsi_status; 822 823 set_host_byte(sc, DID_OK); 824 if ((se_cmd->se_cmd_flags & SCF_OVERFLOW_BIT) || 825 (se_cmd->se_cmd_flags & SCF_UNDERFLOW_BIT)) 826 scsi_set_resid(sc, se_cmd->residual_count); 827 sc->scsi_done(sc); 828 return 0; 829 } 830 831 static void tcm_loop_queue_tm_rsp(struct se_cmd *se_cmd) 832 { 833 struct se_tmr_req *se_tmr = se_cmd->se_tmr_req; 834 struct tcm_loop_tmr *tl_tmr = se_tmr->fabric_tmr_ptr; 835 /* 836 * The SCSI EH thread will be sleeping on se_tmr->tl_tmr_wait, go ahead 837 * and wake up the wait_queue_head_t in tcm_loop_device_reset() 838 */ 839 atomic_set(&tl_tmr->tmr_complete, 1); 840 wake_up(&tl_tmr->tl_tmr_wait); 841 } 842 843 static void tcm_loop_aborted_task(struct se_cmd *se_cmd) 844 { 845 return; 846 } 847 848 static char *tcm_loop_dump_proto_id(struct tcm_loop_hba *tl_hba) 849 { 850 switch (tl_hba->tl_proto_id) { 851 case SCSI_PROTOCOL_SAS: 852 return "SAS"; 853 case SCSI_PROTOCOL_FCP: 854 return "FCP"; 855 case SCSI_PROTOCOL_ISCSI: 856 return "iSCSI"; 857 default: 858 break; 859 } 860 861 return "Unknown"; 862 } 863 864 /* Start items for tcm_loop_port_cit */ 865 866 static int tcm_loop_port_link( 867 struct se_portal_group *se_tpg, 868 struct se_lun *lun) 869 { 870 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 871 struct tcm_loop_tpg, tl_se_tpg); 872 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 873 874 atomic_inc_mb(&tl_tpg->tl_tpg_port_count); 875 /* 876 * Add Linux/SCSI struct scsi_device by HCTL 877 */ 878 scsi_add_device(tl_hba->sh, 0, tl_tpg->tl_tpgt, lun->unpacked_lun); 879 880 pr_debug("TCM_Loop_ConfigFS: Port Link Successful\n"); 881 return 0; 882 } 883 884 static void tcm_loop_port_unlink( 885 struct se_portal_group *se_tpg, 886 struct se_lun *se_lun) 887 { 888 struct scsi_device *sd; 889 struct tcm_loop_hba *tl_hba; 890 struct tcm_loop_tpg *tl_tpg; 891 892 tl_tpg = container_of(se_tpg, struct tcm_loop_tpg, tl_se_tpg); 893 tl_hba = tl_tpg->tl_hba; 894 895 sd = scsi_device_lookup(tl_hba->sh, 0, tl_tpg->tl_tpgt, 896 se_lun->unpacked_lun); 897 if (!sd) { 898 pr_err("Unable to locate struct scsi_device for %d:%d:" 899 "%d\n", 0, tl_tpg->tl_tpgt, se_lun->unpacked_lun); 900 return; 901 } 902 /* 903 * Remove Linux/SCSI struct scsi_device by HCTL 904 */ 905 scsi_remove_device(sd); 906 scsi_device_put(sd); 907 908 atomic_dec_mb(&tl_tpg->tl_tpg_port_count); 909 910 pr_debug("TCM_Loop_ConfigFS: Port Unlink Successful\n"); 911 } 912 913 /* End items for tcm_loop_port_cit */ 914 915 /* Start items for tcm_loop_nexus_cit */ 916 917 static int tcm_loop_make_nexus( 918 struct tcm_loop_tpg *tl_tpg, 919 const char *name) 920 { 921 struct se_portal_group *se_tpg; 922 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 923 struct tcm_loop_nexus *tl_nexus; 924 int ret = -ENOMEM; 925 926 if (tl_tpg->tl_nexus) { 927 pr_debug("tl_tpg->tl_nexus already exists\n"); 928 return -EEXIST; 929 } 930 se_tpg = &tl_tpg->tl_se_tpg; 931 932 tl_nexus = kzalloc(sizeof(struct tcm_loop_nexus), GFP_KERNEL); 933 if (!tl_nexus) { 934 pr_err("Unable to allocate struct tcm_loop_nexus\n"); 935 return -ENOMEM; 936 } 937 /* 938 * Initialize the struct se_session pointer 939 */ 940 tl_nexus->se_sess = transport_init_session(TARGET_PROT_ALL); 941 if (IS_ERR(tl_nexus->se_sess)) { 942 ret = PTR_ERR(tl_nexus->se_sess); 943 goto out; 944 } 945 /* 946 * Since we are running in 'demo mode' this call with generate a 947 * struct se_node_acl for the tcm_loop struct se_portal_group with the SCSI 948 * Initiator port name of the passed configfs group 'name'. 949 */ 950 tl_nexus->se_sess->se_node_acl = core_tpg_check_initiator_node_acl( 951 se_tpg, (unsigned char *)name); 952 if (!tl_nexus->se_sess->se_node_acl) { 953 transport_free_session(tl_nexus->se_sess); 954 goto out; 955 } 956 /* 957 * Now, register the SAS I_T Nexus as active with the call to 958 * transport_register_session() 959 */ 960 __transport_register_session(se_tpg, tl_nexus->se_sess->se_node_acl, 961 tl_nexus->se_sess, tl_nexus); 962 tl_tpg->tl_nexus = tl_nexus; 963 pr_debug("TCM_Loop_ConfigFS: Established I_T Nexus to emulated" 964 " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tl_hba), 965 name); 966 return 0; 967 968 out: 969 kfree(tl_nexus); 970 return ret; 971 } 972 973 static int tcm_loop_drop_nexus( 974 struct tcm_loop_tpg *tpg) 975 { 976 struct se_session *se_sess; 977 struct tcm_loop_nexus *tl_nexus; 978 979 tl_nexus = tpg->tl_nexus; 980 if (!tl_nexus) 981 return -ENODEV; 982 983 se_sess = tl_nexus->se_sess; 984 if (!se_sess) 985 return -ENODEV; 986 987 if (atomic_read(&tpg->tl_tpg_port_count)) { 988 pr_err("Unable to remove TCM_Loop I_T Nexus with" 989 " active TPG port count: %d\n", 990 atomic_read(&tpg->tl_tpg_port_count)); 991 return -EPERM; 992 } 993 994 pr_debug("TCM_Loop_ConfigFS: Removing I_T Nexus to emulated" 995 " %s Initiator Port: %s\n", tcm_loop_dump_proto_id(tpg->tl_hba), 996 tl_nexus->se_sess->se_node_acl->initiatorname); 997 /* 998 * Release the SCSI I_T Nexus to the emulated SAS Target Port 999 */ 1000 transport_deregister_session(tl_nexus->se_sess); 1001 tpg->tl_nexus = NULL; 1002 kfree(tl_nexus); 1003 return 0; 1004 } 1005 1006 /* End items for tcm_loop_nexus_cit */ 1007 1008 static ssize_t tcm_loop_tpg_show_nexus( 1009 struct se_portal_group *se_tpg, 1010 char *page) 1011 { 1012 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 1013 struct tcm_loop_tpg, tl_se_tpg); 1014 struct tcm_loop_nexus *tl_nexus; 1015 ssize_t ret; 1016 1017 tl_nexus = tl_tpg->tl_nexus; 1018 if (!tl_nexus) 1019 return -ENODEV; 1020 1021 ret = snprintf(page, PAGE_SIZE, "%s\n", 1022 tl_nexus->se_sess->se_node_acl->initiatorname); 1023 1024 return ret; 1025 } 1026 1027 static ssize_t tcm_loop_tpg_store_nexus( 1028 struct se_portal_group *se_tpg, 1029 const char *page, 1030 size_t count) 1031 { 1032 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 1033 struct tcm_loop_tpg, tl_se_tpg); 1034 struct tcm_loop_hba *tl_hba = tl_tpg->tl_hba; 1035 unsigned char i_port[TL_WWN_ADDR_LEN], *ptr, *port_ptr; 1036 int ret; 1037 /* 1038 * Shutdown the active I_T nexus if 'NULL' is passed.. 1039 */ 1040 if (!strncmp(page, "NULL", 4)) { 1041 ret = tcm_loop_drop_nexus(tl_tpg); 1042 return (!ret) ? count : ret; 1043 } 1044 /* 1045 * Otherwise make sure the passed virtual Initiator port WWN matches 1046 * the fabric protocol_id set in tcm_loop_make_scsi_hba(), and call 1047 * tcm_loop_make_nexus() 1048 */ 1049 if (strlen(page) >= TL_WWN_ADDR_LEN) { 1050 pr_err("Emulated NAA Sas Address: %s, exceeds" 1051 " max: %d\n", page, TL_WWN_ADDR_LEN); 1052 return -EINVAL; 1053 } 1054 snprintf(&i_port[0], TL_WWN_ADDR_LEN, "%s", page); 1055 1056 ptr = strstr(i_port, "naa."); 1057 if (ptr) { 1058 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_SAS) { 1059 pr_err("Passed SAS Initiator Port %s does not" 1060 " match target port protoid: %s\n", i_port, 1061 tcm_loop_dump_proto_id(tl_hba)); 1062 return -EINVAL; 1063 } 1064 port_ptr = &i_port[0]; 1065 goto check_newline; 1066 } 1067 ptr = strstr(i_port, "fc."); 1068 if (ptr) { 1069 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_FCP) { 1070 pr_err("Passed FCP Initiator Port %s does not" 1071 " match target port protoid: %s\n", i_port, 1072 tcm_loop_dump_proto_id(tl_hba)); 1073 return -EINVAL; 1074 } 1075 port_ptr = &i_port[3]; /* Skip over "fc." */ 1076 goto check_newline; 1077 } 1078 ptr = strstr(i_port, "iqn."); 1079 if (ptr) { 1080 if (tl_hba->tl_proto_id != SCSI_PROTOCOL_ISCSI) { 1081 pr_err("Passed iSCSI Initiator Port %s does not" 1082 " match target port protoid: %s\n", i_port, 1083 tcm_loop_dump_proto_id(tl_hba)); 1084 return -EINVAL; 1085 } 1086 port_ptr = &i_port[0]; 1087 goto check_newline; 1088 } 1089 pr_err("Unable to locate prefix for emulated Initiator Port:" 1090 " %s\n", i_port); 1091 return -EINVAL; 1092 /* 1093 * Clear any trailing newline for the NAA WWN 1094 */ 1095 check_newline: 1096 if (i_port[strlen(i_port)-1] == '\n') 1097 i_port[strlen(i_port)-1] = '\0'; 1098 1099 ret = tcm_loop_make_nexus(tl_tpg, port_ptr); 1100 if (ret < 0) 1101 return ret; 1102 1103 return count; 1104 } 1105 1106 TF_TPG_BASE_ATTR(tcm_loop, nexus, S_IRUGO | S_IWUSR); 1107 1108 static ssize_t tcm_loop_tpg_show_transport_status( 1109 struct se_portal_group *se_tpg, 1110 char *page) 1111 { 1112 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 1113 struct tcm_loop_tpg, tl_se_tpg); 1114 const char *status = NULL; 1115 ssize_t ret = -EINVAL; 1116 1117 switch (tl_tpg->tl_transport_status) { 1118 case TCM_TRANSPORT_ONLINE: 1119 status = "online"; 1120 break; 1121 case TCM_TRANSPORT_OFFLINE: 1122 status = "offline"; 1123 break; 1124 default: 1125 break; 1126 } 1127 1128 if (status) 1129 ret = snprintf(page, PAGE_SIZE, "%s\n", status); 1130 1131 return ret; 1132 } 1133 1134 static ssize_t tcm_loop_tpg_store_transport_status( 1135 struct se_portal_group *se_tpg, 1136 const char *page, 1137 size_t count) 1138 { 1139 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 1140 struct tcm_loop_tpg, tl_se_tpg); 1141 1142 if (!strncmp(page, "online", 6)) { 1143 tl_tpg->tl_transport_status = TCM_TRANSPORT_ONLINE; 1144 return count; 1145 } 1146 if (!strncmp(page, "offline", 7)) { 1147 tl_tpg->tl_transport_status = TCM_TRANSPORT_OFFLINE; 1148 return count; 1149 } 1150 return -EINVAL; 1151 } 1152 1153 TF_TPG_BASE_ATTR(tcm_loop, transport_status, S_IRUGO | S_IWUSR); 1154 1155 static struct configfs_attribute *tcm_loop_tpg_attrs[] = { 1156 &tcm_loop_tpg_nexus.attr, 1157 &tcm_loop_tpg_transport_status.attr, 1158 NULL, 1159 }; 1160 1161 /* Start items for tcm_loop_naa_cit */ 1162 1163 static struct se_portal_group *tcm_loop_make_naa_tpg( 1164 struct se_wwn *wwn, 1165 struct config_group *group, 1166 const char *name) 1167 { 1168 struct tcm_loop_hba *tl_hba = container_of(wwn, 1169 struct tcm_loop_hba, tl_hba_wwn); 1170 struct tcm_loop_tpg *tl_tpg; 1171 char *tpgt_str, *end_ptr; 1172 int ret; 1173 unsigned short int tpgt; 1174 1175 tpgt_str = strstr(name, "tpgt_"); 1176 if (!tpgt_str) { 1177 pr_err("Unable to locate \"tpgt_#\" directory" 1178 " group\n"); 1179 return ERR_PTR(-EINVAL); 1180 } 1181 tpgt_str += 5; /* Skip ahead of "tpgt_" */ 1182 tpgt = (unsigned short int) simple_strtoul(tpgt_str, &end_ptr, 0); 1183 1184 if (tpgt >= TL_TPGS_PER_HBA) { 1185 pr_err("Passed tpgt: %hu exceeds TL_TPGS_PER_HBA:" 1186 " %u\n", tpgt, TL_TPGS_PER_HBA); 1187 return ERR_PTR(-EINVAL); 1188 } 1189 tl_tpg = &tl_hba->tl_hba_tpgs[tpgt]; 1190 tl_tpg->tl_hba = tl_hba; 1191 tl_tpg->tl_tpgt = tpgt; 1192 /* 1193 * Register the tl_tpg as a emulated SAS TCM Target Endpoint 1194 */ 1195 ret = core_tpg_register(&tcm_loop_fabric_configfs->tf_ops, 1196 wwn, &tl_tpg->tl_se_tpg, tl_tpg, 1197 TRANSPORT_TPG_TYPE_NORMAL); 1198 if (ret < 0) 1199 return ERR_PTR(-ENOMEM); 1200 1201 pr_debug("TCM_Loop_ConfigFS: Allocated Emulated %s" 1202 " Target Port %s,t,0x%04x\n", tcm_loop_dump_proto_id(tl_hba), 1203 config_item_name(&wwn->wwn_group.cg_item), tpgt); 1204 1205 return &tl_tpg->tl_se_tpg; 1206 } 1207 1208 static void tcm_loop_drop_naa_tpg( 1209 struct se_portal_group *se_tpg) 1210 { 1211 struct se_wwn *wwn = se_tpg->se_tpg_wwn; 1212 struct tcm_loop_tpg *tl_tpg = container_of(se_tpg, 1213 struct tcm_loop_tpg, tl_se_tpg); 1214 struct tcm_loop_hba *tl_hba; 1215 unsigned short tpgt; 1216 1217 tl_hba = tl_tpg->tl_hba; 1218 tpgt = tl_tpg->tl_tpgt; 1219 /* 1220 * Release the I_T Nexus for the Virtual SAS link if present 1221 */ 1222 tcm_loop_drop_nexus(tl_tpg); 1223 /* 1224 * Deregister the tl_tpg as a emulated SAS TCM Target Endpoint 1225 */ 1226 core_tpg_deregister(se_tpg); 1227 1228 tl_tpg->tl_hba = NULL; 1229 tl_tpg->tl_tpgt = 0; 1230 1231 pr_debug("TCM_Loop_ConfigFS: Deallocated Emulated %s" 1232 " Target Port %s,t,0x%04x\n", tcm_loop_dump_proto_id(tl_hba), 1233 config_item_name(&wwn->wwn_group.cg_item), tpgt); 1234 } 1235 1236 /* End items for tcm_loop_naa_cit */ 1237 1238 /* Start items for tcm_loop_cit */ 1239 1240 static struct se_wwn *tcm_loop_make_scsi_hba( 1241 struct target_fabric_configfs *tf, 1242 struct config_group *group, 1243 const char *name) 1244 { 1245 struct tcm_loop_hba *tl_hba; 1246 struct Scsi_Host *sh; 1247 char *ptr; 1248 int ret, off = 0; 1249 1250 tl_hba = kzalloc(sizeof(struct tcm_loop_hba), GFP_KERNEL); 1251 if (!tl_hba) { 1252 pr_err("Unable to allocate struct tcm_loop_hba\n"); 1253 return ERR_PTR(-ENOMEM); 1254 } 1255 /* 1256 * Determine the emulated Protocol Identifier and Target Port Name 1257 * based on the incoming configfs directory name. 1258 */ 1259 ptr = strstr(name, "naa."); 1260 if (ptr) { 1261 tl_hba->tl_proto_id = SCSI_PROTOCOL_SAS; 1262 goto check_len; 1263 } 1264 ptr = strstr(name, "fc."); 1265 if (ptr) { 1266 tl_hba->tl_proto_id = SCSI_PROTOCOL_FCP; 1267 off = 3; /* Skip over "fc." */ 1268 goto check_len; 1269 } 1270 ptr = strstr(name, "iqn."); 1271 if (!ptr) { 1272 pr_err("Unable to locate prefix for emulated Target " 1273 "Port: %s\n", name); 1274 ret = -EINVAL; 1275 goto out; 1276 } 1277 tl_hba->tl_proto_id = SCSI_PROTOCOL_ISCSI; 1278 1279 check_len: 1280 if (strlen(name) >= TL_WWN_ADDR_LEN) { 1281 pr_err("Emulated NAA %s Address: %s, exceeds" 1282 " max: %d\n", name, tcm_loop_dump_proto_id(tl_hba), 1283 TL_WWN_ADDR_LEN); 1284 ret = -EINVAL; 1285 goto out; 1286 } 1287 snprintf(&tl_hba->tl_wwn_address[0], TL_WWN_ADDR_LEN, "%s", &name[off]); 1288 1289 /* 1290 * Call device_register(tl_hba->dev) to register the emulated 1291 * Linux/SCSI LLD of type struct Scsi_Host at tl_hba->sh after 1292 * device_register() callbacks in tcm_loop_driver_probe() 1293 */ 1294 ret = tcm_loop_setup_hba_bus(tl_hba, tcm_loop_hba_no_cnt); 1295 if (ret) 1296 goto out; 1297 1298 sh = tl_hba->sh; 1299 tcm_loop_hba_no_cnt++; 1300 pr_debug("TCM_Loop_ConfigFS: Allocated emulated Target" 1301 " %s Address: %s at Linux/SCSI Host ID: %d\n", 1302 tcm_loop_dump_proto_id(tl_hba), name, sh->host_no); 1303 1304 return &tl_hba->tl_hba_wwn; 1305 out: 1306 kfree(tl_hba); 1307 return ERR_PTR(ret); 1308 } 1309 1310 static void tcm_loop_drop_scsi_hba( 1311 struct se_wwn *wwn) 1312 { 1313 struct tcm_loop_hba *tl_hba = container_of(wwn, 1314 struct tcm_loop_hba, tl_hba_wwn); 1315 1316 pr_debug("TCM_Loop_ConfigFS: Deallocating emulated Target" 1317 " SAS Address: %s at Linux/SCSI Host ID: %d\n", 1318 tl_hba->tl_wwn_address, tl_hba->sh->host_no); 1319 /* 1320 * Call device_unregister() on the original tl_hba->dev. 1321 * tcm_loop_fabric_scsi.c:tcm_loop_release_adapter() will 1322 * release *tl_hba; 1323 */ 1324 device_unregister(&tl_hba->dev); 1325 } 1326 1327 /* Start items for tcm_loop_cit */ 1328 static ssize_t tcm_loop_wwn_show_attr_version( 1329 struct target_fabric_configfs *tf, 1330 char *page) 1331 { 1332 return sprintf(page, "TCM Loopback Fabric module %s\n", TCM_LOOP_VERSION); 1333 } 1334 1335 TF_WWN_ATTR_RO(tcm_loop, version); 1336 1337 static struct configfs_attribute *tcm_loop_wwn_attrs[] = { 1338 &tcm_loop_wwn_version.attr, 1339 NULL, 1340 }; 1341 1342 /* End items for tcm_loop_cit */ 1343 1344 static int tcm_loop_register_configfs(void) 1345 { 1346 struct target_fabric_configfs *fabric; 1347 int ret; 1348 /* 1349 * Set the TCM Loop HBA counter to zero 1350 */ 1351 tcm_loop_hba_no_cnt = 0; 1352 /* 1353 * Register the top level struct config_item_type with TCM core 1354 */ 1355 fabric = target_fabric_configfs_init(THIS_MODULE, "loopback"); 1356 if (IS_ERR(fabric)) { 1357 pr_err("tcm_loop_register_configfs() failed!\n"); 1358 return PTR_ERR(fabric); 1359 } 1360 /* 1361 * Setup the fabric API of function pointers used by target_core_mod 1362 */ 1363 fabric->tf_ops.get_fabric_name = &tcm_loop_get_fabric_name; 1364 fabric->tf_ops.get_fabric_proto_ident = &tcm_loop_get_fabric_proto_ident; 1365 fabric->tf_ops.tpg_get_wwn = &tcm_loop_get_endpoint_wwn; 1366 fabric->tf_ops.tpg_get_tag = &tcm_loop_get_tag; 1367 fabric->tf_ops.tpg_get_default_depth = &tcm_loop_get_default_depth; 1368 fabric->tf_ops.tpg_get_pr_transport_id = &tcm_loop_get_pr_transport_id; 1369 fabric->tf_ops.tpg_get_pr_transport_id_len = 1370 &tcm_loop_get_pr_transport_id_len; 1371 fabric->tf_ops.tpg_parse_pr_out_transport_id = 1372 &tcm_loop_parse_pr_out_transport_id; 1373 fabric->tf_ops.tpg_check_demo_mode = &tcm_loop_check_demo_mode; 1374 fabric->tf_ops.tpg_check_demo_mode_cache = 1375 &tcm_loop_check_demo_mode_cache; 1376 fabric->tf_ops.tpg_check_demo_mode_write_protect = 1377 &tcm_loop_check_demo_mode_write_protect; 1378 fabric->tf_ops.tpg_check_prod_mode_write_protect = 1379 &tcm_loop_check_prod_mode_write_protect; 1380 /* 1381 * The TCM loopback fabric module runs in demo-mode to a local 1382 * virtual SCSI device, so fabric dependent initator ACLs are 1383 * not required. 1384 */ 1385 fabric->tf_ops.tpg_alloc_fabric_acl = &tcm_loop_tpg_alloc_fabric_acl; 1386 fabric->tf_ops.tpg_release_fabric_acl = 1387 &tcm_loop_tpg_release_fabric_acl; 1388 fabric->tf_ops.tpg_get_inst_index = &tcm_loop_get_inst_index; 1389 /* 1390 * Used for setting up remaining TCM resources in process context 1391 */ 1392 fabric->tf_ops.check_stop_free = &tcm_loop_check_stop_free; 1393 fabric->tf_ops.release_cmd = &tcm_loop_release_cmd; 1394 fabric->tf_ops.shutdown_session = &tcm_loop_shutdown_session; 1395 fabric->tf_ops.close_session = &tcm_loop_close_session; 1396 fabric->tf_ops.sess_get_index = &tcm_loop_sess_get_index; 1397 fabric->tf_ops.sess_get_initiator_sid = NULL; 1398 fabric->tf_ops.write_pending = &tcm_loop_write_pending; 1399 fabric->tf_ops.write_pending_status = &tcm_loop_write_pending_status; 1400 /* 1401 * Not used for TCM loopback 1402 */ 1403 fabric->tf_ops.set_default_node_attributes = 1404 &tcm_loop_set_default_node_attributes; 1405 fabric->tf_ops.get_task_tag = &tcm_loop_get_task_tag; 1406 fabric->tf_ops.get_cmd_state = &tcm_loop_get_cmd_state; 1407 fabric->tf_ops.queue_data_in = &tcm_loop_queue_data_in; 1408 fabric->tf_ops.queue_status = &tcm_loop_queue_status; 1409 fabric->tf_ops.queue_tm_rsp = &tcm_loop_queue_tm_rsp; 1410 fabric->tf_ops.aborted_task = &tcm_loop_aborted_task; 1411 1412 /* 1413 * Setup function pointers for generic logic in target_core_fabric_configfs.c 1414 */ 1415 fabric->tf_ops.fabric_make_wwn = &tcm_loop_make_scsi_hba; 1416 fabric->tf_ops.fabric_drop_wwn = &tcm_loop_drop_scsi_hba; 1417 fabric->tf_ops.fabric_make_tpg = &tcm_loop_make_naa_tpg; 1418 fabric->tf_ops.fabric_drop_tpg = &tcm_loop_drop_naa_tpg; 1419 /* 1420 * fabric_post_link() and fabric_pre_unlink() are used for 1421 * registration and release of TCM Loop Virtual SCSI LUNs. 1422 */ 1423 fabric->tf_ops.fabric_post_link = &tcm_loop_port_link; 1424 fabric->tf_ops.fabric_pre_unlink = &tcm_loop_port_unlink; 1425 fabric->tf_ops.fabric_make_np = NULL; 1426 fabric->tf_ops.fabric_drop_np = NULL; 1427 /* 1428 * Setup default attribute lists for various fabric->tf_cit_tmpl 1429 */ 1430 fabric->tf_cit_tmpl.tfc_wwn_cit.ct_attrs = tcm_loop_wwn_attrs; 1431 fabric->tf_cit_tmpl.tfc_tpg_base_cit.ct_attrs = tcm_loop_tpg_attrs; 1432 fabric->tf_cit_tmpl.tfc_tpg_attrib_cit.ct_attrs = NULL; 1433 fabric->tf_cit_tmpl.tfc_tpg_param_cit.ct_attrs = NULL; 1434 fabric->tf_cit_tmpl.tfc_tpg_np_base_cit.ct_attrs = NULL; 1435 /* 1436 * Once fabric->tf_ops has been setup, now register the fabric for 1437 * use within TCM 1438 */ 1439 ret = target_fabric_configfs_register(fabric); 1440 if (ret < 0) { 1441 pr_err("target_fabric_configfs_register() for" 1442 " TCM_Loop failed!\n"); 1443 target_fabric_configfs_free(fabric); 1444 return -1; 1445 } 1446 /* 1447 * Setup our local pointer to *fabric. 1448 */ 1449 tcm_loop_fabric_configfs = fabric; 1450 pr_debug("TCM_LOOP[0] - Set fabric ->" 1451 " tcm_loop_fabric_configfs\n"); 1452 return 0; 1453 } 1454 1455 static void tcm_loop_deregister_configfs(void) 1456 { 1457 if (!tcm_loop_fabric_configfs) 1458 return; 1459 1460 target_fabric_configfs_deregister(tcm_loop_fabric_configfs); 1461 tcm_loop_fabric_configfs = NULL; 1462 pr_debug("TCM_LOOP[0] - Cleared" 1463 " tcm_loop_fabric_configfs\n"); 1464 } 1465 1466 static int __init tcm_loop_fabric_init(void) 1467 { 1468 int ret = -ENOMEM; 1469 1470 tcm_loop_workqueue = alloc_workqueue("tcm_loop", 0, 0); 1471 if (!tcm_loop_workqueue) 1472 goto out; 1473 1474 tcm_loop_cmd_cache = kmem_cache_create("tcm_loop_cmd_cache", 1475 sizeof(struct tcm_loop_cmd), 1476 __alignof__(struct tcm_loop_cmd), 1477 0, NULL); 1478 if (!tcm_loop_cmd_cache) { 1479 pr_debug("kmem_cache_create() for" 1480 " tcm_loop_cmd_cache failed\n"); 1481 goto out_destroy_workqueue; 1482 } 1483 1484 ret = tcm_loop_alloc_core_bus(); 1485 if (ret) 1486 goto out_destroy_cache; 1487 1488 ret = tcm_loop_register_configfs(); 1489 if (ret) 1490 goto out_release_core_bus; 1491 1492 return 0; 1493 1494 out_release_core_bus: 1495 tcm_loop_release_core_bus(); 1496 out_destroy_cache: 1497 kmem_cache_destroy(tcm_loop_cmd_cache); 1498 out_destroy_workqueue: 1499 destroy_workqueue(tcm_loop_workqueue); 1500 out: 1501 return ret; 1502 } 1503 1504 static void __exit tcm_loop_fabric_exit(void) 1505 { 1506 tcm_loop_deregister_configfs(); 1507 tcm_loop_release_core_bus(); 1508 kmem_cache_destroy(tcm_loop_cmd_cache); 1509 destroy_workqueue(tcm_loop_workqueue); 1510 } 1511 1512 MODULE_DESCRIPTION("TCM loopback virtual Linux/SCSI fabric module"); 1513 MODULE_AUTHOR("Nicholas A. Bellinger <nab@risingtidesystems.com>"); 1514 MODULE_LICENSE("GPL"); 1515 module_init(tcm_loop_fabric_init); 1516 module_exit(tcm_loop_fabric_exit); 1517