Commit 3703b2c5 authored by Nicholas Bellinger's avatar Nicholas Bellinger Committed by James Bottomley

[SCSI] tcm_loop: Add multi-fabric Linux/SCSI LLD fabric module

This patch adds the TCM_Loop Linux/SCSI LLD fabric module for
accessing TCM device backstores as locally accessable SCSI LUNs in
virtual SAS, FC, and iSCSI Target ports using the generic fabric
TransportID and Target Port WWN naming handlers from TCM's
target_core_fabric_lib.c The TCM_Loop module uses the generic fabric
configfs infratructure provided by target_core_fabric_configfs.c and
adds a module dependent attribute for the creation/release of the
virtual I_T Nexus connected the TCM_Loop Target and Initiator Ports.

TCM_Loop can also be used with scsi-generic and BSG drivers so that
STGT userspace fabric modules, QEMU-KVM and other hypervisor SCSI
passthrough support can access TCM device backstore and control CDB

For more information please see:

[jejb: fixed up checkpatch stuff]
Signed-off-by: default avatarNicholas A. Bellinger <>
Reviewed-by: default avatarChristoph Hellwig <>
Signed-off-by: default avatarJames Bottomley <>
parent 5fa8b573
......@@ -29,4 +29,6 @@ config TCM_PSCSI
Say Y here to enable the TCM/pSCSI subsystem plugin for non-buffered
passthrough access to Linux/SCSI device
source "drivers/target/loopback/Kconfig"
......@@ -21,3 +21,6 @@ obj-$(CONFIG_TARGET_CORE) += target_core_mod.o
obj-$(CONFIG_TCM_IBLOCK) += target_core_iblock.o
obj-$(CONFIG_TCM_FILEIO) += target_core_file.o
obj-$(CONFIG_TCM_PSCSI) += target_core_pscsi.o
# Fabric modules
obj-$(CONFIG_LOOPBACK_TARGET) += loopback/
tristate "TCM Virtual SAS target and Linux/SCSI LDD fabric loopback module"
Say Y here to enable the TCM Virtual SAS target and Linux/SCSI LLD
fabric loopback module.
bool "TCM loopback fabric module CDB debug code"
Say Y here to enable the TCM loopback fabric module CDB debug code
obj-$(CONFIG_LOOPBACK_TARGET) += tcm_loop.o
This diff is collapsed.
#define TCM_LOOP_VERSION "v2.1-rc1"
#define TL_WWN_ADDR_LEN 256
#define TL_TPGS_PER_HBA 32
* Defaults for struct scsi_host_template tcm_loop_driver_template
* We use large can_queue and cmd_per_lun here and let TCM enforce
* the underlying se_device_t->queue_depth.
#define TL_SCSI_CAN_QUEUE 1024
#define TL_SCSI_CMD_PER_LUN 1024
#define TL_SCSI_MAX_SECTORS 1024
* Used in tcm_loop_driver_probe() for struct Scsi_Host->max_cmd_len
#define TL_SCSI_MAX_CMD_LEN 32
# define TL_CDB_DEBUG(x...) printk(KERN_INFO x)
# define TL_CDB_DEBUG(x...)
struct tcm_loop_cmd {
/* State of Linux/SCSI CDB+Data descriptor */
u32 sc_cmd_state;
/* Pointer to the CDB+Data descriptor from Linux/SCSI subsystem */
struct scsi_cmnd *sc;
struct list_head *tl_cmd_list;
/* The TCM I/O descriptor that is accessed via container_of() */
struct se_cmd tl_se_cmd;
/* Sense buffer that will be mapped into outgoing status */
unsigned char tl_sense_buf[TRANSPORT_SENSE_BUFFER];
struct tcm_loop_tmr {
atomic_t tmr_complete;
wait_queue_head_t tl_tmr_wait;
struct tcm_loop_nexus {
int it_nexus_active;
* Pointer to Linux/SCSI HBA from linux/include/scsi_host.h
struct scsi_host *sh;
* Pointer to TCM session for I_T Nexus
struct se_session *se_sess;
struct tcm_loop_nacl {
struct se_node_acl se_node_acl;
struct tcm_loop_tpg {
unsigned short tl_tpgt;
atomic_t tl_tpg_port_count;
struct se_portal_group tl_se_tpg;
struct tcm_loop_hba *tl_hba;
struct tcm_loop_hba {
u8 tl_proto_id;
unsigned char tl_wwn_address[TL_WWN_ADDR_LEN];
struct se_hba_s *se_hba;
struct se_lun *tl_hba_lun;
struct se_port *tl_hba_lun_sep;
struct se_device_s *se_dev_hba_ptr;
struct tcm_loop_nexus *tl_nexus;
struct device dev;
struct Scsi_Host *sh;
struct tcm_loop_tpg tl_hba_tpgs[TL_TPGS_PER_HBA];
struct se_wwn tl_hba_wwn;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment