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