* [RFC PATCH 18/19] Target_Core_Mod base and fabric_module includes
@ 2009-09-12 1:58 Nicholas A. Bellinger
0 siblings, 0 replies; 2+ messages in thread
From: Nicholas A. Bellinger @ 2009-09-12 1:58 UTC (permalink / raw)
To: LKML, linux-scsi
Cc: Andrew Morton, Greg KH, Douglas Gilbert, James Bottomley,
Hannes Reinecke, FUJITA Tomonori, Mike Christie, Joel Becker,
Martin K. Petersen, Christoph Hellwig, Linus Torvalds,
Alan Stern, Boaz Harrosh, Florian Haas, Philipp Reisner
[RFC PATCH 18/19] Target_Core_Mod base and fabric_module includes
This patch adds the core data instructures for target_core_mod and fabric module API for accessing
for TCM/ConfigFS enabled fabric modules.
Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
new file mode 100644
index 0000000..113ea3f
--- /dev/null
+++ b/include/target/target_core_base.h
@@ -0,0 +1,974 @@
+/****************************************************************************
+ * Filename: target_core_base.h
+ *
+ * This file contains definitions related to the Target Core Engine.
+ *
+ * Nicholas A. Bellinger <nab@kernel.org>
+ *
+ * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
+ * Copyright (c) 2005, 2006, 2007 SBE, Inc.
+ * Copyright (c) 2007-2009 Rising Tide Software, Inc.
+ * Copyright (c) 2008-2009 Linux-iSCSI.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ ****************************************************************************/
+
+
+#ifndef TARGET_CORE_BASE_H
+#define TARGET_CORE_BASE_H
+
+#include <linux/in.h>
+#include <linux/configfs.h>
+#include <net/sock.h>
+#include <net/tcp.h>
+#ifdef SNMP_SUPPORT
+#include <target/target_core_mib.h>
+#endif /* SNMP_SUPPORT */
+
+#define TARGET_CORE_MOD_VERSION "v3.2.0"
+#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
+
+/* SCSI Command Descriptor Block Size a la SCSI's MAX_COMMAND_SIZE */
+#define SCSI_CDB_SIZE 16
+#define TRANSPORT_IOV_DATA_BUFFER 5
+
+/* Maximum Number of LUNs per Target Portal Group */
+#define TRANSPORT_MAX_LUNS_PER_TPG 256
+
+/* From include/scsi/scsi_cmnd.h:SCSI_SENSE_BUFFERSIZE */
+#define TRANSPORT_SENSE_BUFFER SCSI_SENSE_BUFFERSIZE
+
+#define SPC_SENSE_KEY_OFFSET 2
+#define SPC_ASC_KEY_OFFSET 12
+#define SPC_ASCQ_KEY_OFFSET 13
+
+/* Currently same as ISCSI_IQN_LEN */
+#define TRANSPORT_IQN_LEN 224
+#define LU_GROUP_NAME_BUF 256
+#define TG_PT_GROUP_NAME_BUF 256
+/* Used to parse VPD into t10_vpd_t */
+#define VPD_TMP_BUF_SIZE 128
+/* Used for target_core-pscsi.c:pscsi_transport_complete() */
+#define VPD_BUF_LEN 256
+/* Used for se_subsystem_dev_t->se_dev_udev_path[], must be less than
+ PAGE_SIZE */
+#define SE_UDEV_PATH_LEN 512
+/* Used for se_dev_snap_attrib_t->contact */
+#define SNAP_CONTACT_LEN 128
+/* Used for se_dev_snap_attrib_t->lv_group */
+#define SNAP_GROUP_LEN 128
+/* Used for se_dev_snap_attrib->lvc_size */
+#define SNAP_LVC_LEN 32
+/* Used by t10_reservation_template_s->pr_[i,t]_port[] */
+#define PR_APTPL_MAX_IPORT_LEN 256
+#define PR_APTPL_MAX_TPORT_LEN 256
+/* Used by t10_reservation_template_s->pr_aptpl_buf_len */
+#define PR_APTPL_BUF_LEN 8192
+/* Used by t10_alua_tg_pt_gp_t->tg_pt_gp_md_buf_len */
+#define ALUA_MD_BUF_LEN 1024
+
+/* used by PSCSI and iBlock Transport drivers */
+#define READ_BLOCK_LEN 6
+#define READ_CAP_LEN 8
+#define READ_POSITION_LEN 20
+#define INQUIRY_LEN 36
+#define INQUIRY_VPD_SERIAL_LEN 254
+#define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN 254
+
+/* se_cmd_t->data_direction */
+#define SE_DIRECTION_NONE 0
+#define SE_DIRECTION_READ 1
+#define SE_DIRECTION_WRITE 2
+#define SE_DIRECTION_BIDI 3
+
+/* se_hba_t->hba_flags */
+#define HBA_FLAGS_INTERNAL_USE 0x00000001
+
+/* se_hba_t->hba_status and iscsi_tpg_hba->thba_status */
+#define HBA_STATUS_FREE 0x00000001
+#define HBA_STATUS_ACTIVE 0x00000002
+#define HBA_STATUS_INACTIVE 0x00000004
+#define HBA_STATUS_SHUTDOWN 0x00000008
+
+/* se_lun_t->lun_status */
+#define TRANSPORT_LUN_STATUS_FREE 0
+#define TRANSPORT_LUN_STATUS_ACTIVE 1
+
+/* se_lun_t->lun_type */
+#define TRANSPORT_LUN_TYPE_NONE 0
+#define TRANSPORT_LUN_TYPE_DEVICE 1
+
+/* se_portal_group_t->se_tpg_type */
+#define TRANSPORT_TPG_TYPE_NORMAL 0
+#define TRANSPORT_TPG_TYPE_DISCOVERY 1
+
+/* Used for se_node_acl->nodeacl_flags */
+#define NAF_DYNAMIC_NODE_ACL 0x01
+
+/* se_map_sg_t->map_flags */
+#define MAP_SG_KMAP 0x01
+
+/* Used for generate timer flags */
+#define TF_RUNNING 0x01
+#define TF_STOP 0x02
+
+/* Special transport agnostic se_cmd_t->t_states */
+#define TRANSPORT_NO_STATE 240
+#define TRANSPORT_NEW_CMD 241
+#define TRANSPORT_DEFERRED_CMD 242
+#define TRANSPORT_WRITE_PENDING 243
+#define TRANSPORT_PROCESS_WRITE 244
+#define TRANSPORT_PROCESSING 245
+#define TRANSPORT_COMPLETE_OK 246
+#define TRANSPORT_COMPLETE_FAILURE 247
+#define TRANSPORT_COMPLETE_TIMEOUT 248
+#define TRANSPORT_PROCESS_TMR 249
+#define TRANSPORT_TMR_COMPLETE 250
+#define TRANSPORT_ISTATE_PROCESSING 251
+#define TRANSPORT_ISTATE_PROCESSED 252
+#define TRANSPORT_KILL 253
+#define TRANSPORT_REMOVE 254
+#define TRANSPORT_FREE 255
+
+#define SCF_SUPPORTED_SAM_OPCODE 0x00000001
+#define SCF_TRANSPORT_TASK_SENSE 0x00000002
+#define SCF_EMULATED_TASK_SENSE 0x00000004
+#define SCF_SCSI_DATA_SG_IO_CDB 0x00000008
+#define SCF_SCSI_CONTROL_SG_IO_CDB 0x00000010
+#define SCF_SCSI_CONTROL_NONSG_IO_CDB 0x00000020
+#define SCF_SCSI_NON_DATA_CDB 0x00000040
+#define SCF_SCSI_CDB_EXCEPTION 0x00000080
+#define SCF_SCSI_RESERVATION_CONFLICT 0x00000100
+#define SCF_CMD_PASSTHROUGH 0x00000200
+#define SCF_CMD_PASSTHROUGH_NOALLOC 0x00000400
+#define SCF_SE_CMD_FAILED 0x00000800
+#define SCF_SE_LUN_CMD 0x00001000
+#define SCF_SE_ALLOW_EOO 0x00002000
+#define SCF_SE_DISABLE_ONLINE_CHECK 0x00004000
+#define SCF_SENT_CHECK_CONDITION 0x00008000
+#define SCF_OVERFLOW_BIT 0x00010000
+#define SCF_UNDERFLOW_BIT 0x00020000
+#define SCF_SENT_DELAYED_TAS 0x00040000
+#define SCF_ALUA_NON_OPTIMIZED 0x00080000
+#define SCF_DELAYED_CMD_FROM_SAM_ATTR 0x00100000
+
+/* se_device_t->type */
+#define PSCSI 1
+#define STGT 2
+#define PATA 3
+#define IBLOCK 4
+#define RAMDISK_DR 5
+#define RAMDISK_MCP 6
+#define FILEIO 7
+#define VROM 8
+#define VTAPE 9
+#define MEDIA_CHANGER 10
+
+/* se_dev_entry_t->lun_flags and se_lun_t->lun_access */
+#define TRANSPORT_LUNFLAGS_NO_ACCESS 0x00000000
+#define TRANSPORT_LUNFLAGS_INITIATOR_ACCESS 0x00000001
+#define TRANSPORT_LUNFLAGS_READ_ONLY 0x00000002
+#define TRANSPORT_LUNFLAGS_READ_WRITE 0x00000004
+
+/* se_device_t->dev_status */
+#define TRANSPORT_DEVICE_ACTIVATED 0x01
+#define TRANSPORT_DEVICE_DEACTIVATED 0x02
+#define TRANSPORT_DEVICE_QUEUE_FULL 0x04
+#define TRANSPORT_DEVICE_SHUTDOWN 0x08
+#define TRANSPORT_DEVICE_OFFLINE_ACTIVATED 0x10
+#define TRANSPORT_DEVICE_OFFLINE_DEACTIVATED 0x20
+
+#define DEV_STATUS_THR_TUR 1
+#define DEV_STATUS_THR_TAKE_ONLINE 2
+#define DEV_STATUS_THR_TAKE_OFFLINE 3
+#define DEV_STATUS_THR_SHUTDOWN 4
+
+/* se_dev_entry_t->deve_flags */
+#define DEF_PR_REGISTERED 0x01
+
+/* transport_send_check_condition_and_sense() */
+#define NON_EXISTENT_LUN 0x1
+#define UNSUPPORTED_SCSI_OPCODE 0x2
+#define INCORRECT_AMOUNT_OF_DATA 0x3
+#define UNEXPECTED_UNSOLICITED_DATA 0x4
+#define SERVICE_CRC_ERROR 0x5
+#define SNACK_REJECTED 0x6
+#define SECTOR_COUNT_TOO_MANY 0x7
+#define INVALID_CDB_FIELD 0x8
+#define INVALID_PARAMETER_LIST 0x9
+#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0xa
+#define UNKNOWN_MODE_PAGE 0xb
+#define WRITE_PROTECTED 0xc
+#define CHECK_CONDITION_ABORT_CMD 0xd
+#define CHECK_CONDITION_UNIT_ATTENTION 0xe
+#define CHECK_CONDITION_NOT_READY 0xf
+
+typedef struct se_obj_s {
+ atomic_t obj_access_count;
+} ____cacheline_aligned se_obj_t;
+
+typedef enum {
+ SPC_ALUA_PASSTHROUGH,
+ SPC2_ALUA_DISABLED,
+ SPC3_ALUA_EMULATED
+} t10_alua_index_t;
+
+typedef enum {
+ SAM_TASK_ATTR_PASSTHROUGH,
+ SAM_TASK_ATTR_UNTAGGED,
+ SAM_TASK_ATTR_EMULATED
+} t10_task_attr_index_t;
+
+struct se_cmd_s;
+
+typedef struct t10_alua_s {
+ t10_alua_index_t alua_type;
+ /* ALUA Target Port Group ID */
+ u16 alua_tg_pt_gps_counter;
+ u32 alua_tg_pt_gps_count;
+ spinlock_t tg_pt_gps_lock;
+ struct se_subsystem_dev_s *t10_sub_dev;
+ /* Used for default ALUA Target Port Group */
+ struct t10_alua_tg_pt_gp_s *default_tg_pt_gp;
+ /* Used for default ALUA Target Port Group ConfigFS group */
+ struct config_group alua_tg_pt_gps_group;
+ int (*alua_state_check)(struct se_cmd_s *, unsigned char *, u8 *);
+ struct list_head tg_pt_gps_list;
+} ____cacheline_aligned t10_alua_t;
+
+typedef struct t10_alua_lu_gp_s {
+ u16 lu_gp_id;
+ int lu_gp_valid_id;
+ u32 lu_gp_members;
+ atomic_t lu_gp_shutdown;
+ atomic_t lu_gp_ref_cnt;
+ spinlock_t lu_gp_lock;
+ struct config_group lu_gp_group;
+ struct list_head lu_gp_list;
+ struct list_head lu_gp_mem_list;
+} ____cacheline_aligned t10_alua_lu_gp_t;
+
+typedef struct t10_alua_lu_gp_member_s {
+ int lu_gp_assoc;
+ atomic_t lu_gp_mem_ref_cnt;
+ spinlock_t lu_gp_mem_lock;
+ t10_alua_lu_gp_t *lu_gp;
+ struct se_device_s *lu_gp_mem_dev;
+ struct list_head lu_gp_mem_list;
+} ____cacheline_aligned t10_alua_lu_gp_member_t;
+
+typedef struct t10_alua_tg_pt_gp_s {
+ u16 tg_pt_gp_id;
+ int tg_pt_gp_valid_id;
+ int tg_pt_gp_alua_access_status;
+ int tg_pt_gp_alua_access_type;
+ int tg_pt_gp_nonop_delay_msecs;
+ int tg_pt_gp_trans_delay_msecs;
+ int tg_pt_gp_pref;
+ int tg_pt_gp_write_metadata;
+ u32 tg_pt_gp_md_buf_len;
+ u32 tg_pt_gp_members;
+ atomic_t tg_pt_gp_alua_access_state;
+ atomic_t tg_pt_gp_ref_cnt;
+ spinlock_t tg_pt_gp_lock;
+ struct mutex tg_pt_gp_md_mutex;
+ struct se_subsystem_dev_s *tg_pt_gp_su_dev;
+ struct config_group tg_pt_gp_group;
+ struct list_head tg_pt_gp_list;
+ struct list_head tg_pt_gp_mem_list;
+} ____cacheline_aligned t10_alua_tg_pt_gp_t;
+
+typedef struct t10_alua_tg_pt_gp_member_s {
+ int tg_pt_gp_assoc;
+ atomic_t tg_pt_gp_mem_ref_cnt;
+ spinlock_t tg_pt_gp_mem_lock;
+ t10_alua_tg_pt_gp_t *tg_pt_gp;
+ struct se_port_s *tg_pt;
+ struct list_head tg_pt_gp_mem_list;
+} ____cacheline_aligned t10_alua_tg_pt_gp_member_t;
+
+typedef struct t10_vpd_s {
+ unsigned char device_identifier[INQUIRY_VPD_DEVICE_IDENTIFIER_LEN];
+ int protocol_identifier_set;
+ u32 protocol_identifier;
+ u32 device_identifier_code_set;
+ u32 association;
+ u32 device_identifier_type;
+ struct list_head vpd_list;
+} ____cacheline_aligned t10_vpd_t;
+
+typedef struct t10_wwn_s {
+ unsigned char vendor[8];
+ unsigned char model[16];
+ unsigned char revision[4];
+ unsigned char unit_serial[INQUIRY_VPD_SERIAL_LEN];
+ spinlock_t t10_vpd_lock;
+ struct se_subsystem_dev_s *t10_sub_dev;
+ struct config_group t10_wwn_group;
+ struct list_head t10_vpd_list;
+} ____cacheline_aligned t10_wwn_t;
+
+typedef enum {
+ SPC_PASSTHROUGH,
+ SPC2_RESERVATIONS,
+ SPC3_PERSISTENT_RESERVATIONS
+} t10_reservations_index_t;
+
+typedef struct t10_pr_registration_s {
+ unsigned char pr_iport[PR_APTPL_MAX_IPORT_LEN]; /* Used during APTPL metadata reading */
+ unsigned char pr_tport[PR_APTPL_MAX_TPORT_LEN]; /* Used during APTPL metadata reading */
+ unsigned char *pr_aptpl_buf; /* For writing out live meta data */
+ u16 pr_aptpl_rpti;
+ u16 pr_reg_tpgt;
+ int pr_reg_all_tg_pt; /* Reservation effects all target ports */
+ int pr_reg_aptpl; /* Activate Persistence across Target Power Loss */
+ int pr_res_holder;
+ int pr_res_type;
+ int pr_res_scope;
+ u32 pr_res_mapped_lun;
+ u32 pr_aptpl_target_lun;
+ u32 pr_res_generation;
+ u64 pr_res_key;
+ atomic_t pr_res_holders;
+ struct se_node_acl_s *pr_reg_nacl;
+ struct se_dev_entry_s *pr_reg_deve;
+ struct se_lun_s *pr_reg_tg_pt_lun;
+ struct list_head pr_reg_list;
+ struct list_head pr_reg_abort_list;
+ struct list_head pr_reg_aptpl_list;
+} ____cacheline_aligned t10_pr_registration_t;
+
+typedef struct t10_reservation_template_s {
+ /* Reservation effects all target ports */
+ int pr_all_tg_pt;
+ /* Activate Persistence across Target Power Loss enabled for SCSI device */
+ int pr_aptpl_active;
+ u32 pr_aptpl_buf_len;
+ u32 pr_generation;
+ t10_reservations_index_t res_type;
+ spinlock_t registration_lock;
+ spinlock_t aptpl_reg_lock;
+ /* Reservation holder when pr_all_tg_pt=1 */
+ struct se_node_acl_s *pr_res_holder;
+ struct list_head registration_list;
+ struct list_head aptpl_reg_list;
+ int (*t10_reservation_check)(struct se_cmd_s *, u32 *);
+ int (*t10_reserve)(struct se_cmd_s *);
+ int (*t10_release)(struct se_cmd_s *);
+ int (*t10_seq_non_holder)(struct se_cmd_s *, unsigned char *, u32);
+ int (*t10_pr_register)(struct se_cmd_s *);
+ int (*t10_pr_clear)(struct se_cmd_s *);
+} ____cacheline_aligned t10_reservation_template_t;
+
+typedef struct se_queue_req_s {
+ int state;
+ void *queue_se_obj_ptr;
+ void *cmd;
+ struct se_obj_lun_type_s *queue_se_obj_api;
+ struct list_head qr_list;
+} ____cacheline_aligned se_queue_req_t;
+
+typedef struct se_queue_obj_s {
+ atomic_t queue_cnt;
+ spinlock_t cmd_queue_lock;
+ struct list_head qobj_list;
+ wait_queue_head_t thread_wq;
+ struct semaphore thread_create_sem;
+ struct semaphore thread_done_sem;
+} ____cacheline_aligned se_queue_obj_t;
+
+typedef struct se_transport_task_s {
+ unsigned char t_task_cdb[SCSI_CDB_SIZE];
+ unsigned long long t_task_lba;
+ int t_tasks_failed;
+ u32 t_task_cdbs;
+ u32 t_task_check;
+ u32 t_task_no;
+ u32 t_task_sectors;
+ u32 t_task_se_num;
+ atomic_t t_fe_count;
+ atomic_t t_se_count;
+ atomic_t t_task_cdbs_left;
+ atomic_t t_task_cdbs_ex_left;
+ atomic_t t_task_cdbs_timeout_left;
+ atomic_t t_task_cdbs_sent;
+ atomic_t t_transport_aborted;
+ atomic_t t_transport_active;
+ atomic_t t_transport_complete;
+ atomic_t t_transport_queue_active;
+ atomic_t t_transport_sent;
+ atomic_t t_transport_stop;
+ atomic_t t_transport_timeout;
+ atomic_t transport_lun_active;
+ atomic_t transport_lun_fe_stop;
+ atomic_t transport_lun_stop;
+ spinlock_t t_state_lock;
+ struct semaphore t_transport_stop_sem;
+ struct semaphore t_transport_passthrough_sem;
+ struct semaphore t_transport_passthrough_wsem;
+ struct semaphore transport_lun_fe_stop_sem;
+ struct semaphore transport_lun_stop_sem;
+ void *t_task_buf;
+ void *t_task_pt_buf;
+ struct list_head t_task_list;
+ struct list_head *t_mem_list;
+} ____cacheline_aligned se_transport_task_t;
+
+typedef struct se_task_s {
+ unsigned char task_sense;
+ struct scatterlist *task_sg;
+ void *transport_req;
+ u8 task_scsi_status;
+ u8 task_flags;
+ int task_error_status;
+ int task_state_flags;
+ unsigned long long task_lba;
+ u32 task_no;
+ u32 task_sectors;
+ u32 task_size;
+ u32 task_sg_num;
+ u32 task_sg_offset;
+ struct se_cmd_s *task_se_cmd;
+ struct se_device_s *se_dev;
+ struct semaphore task_stop_sem;
+ atomic_t task_active;
+ atomic_t task_execute_queue;
+ atomic_t task_timeout;
+ atomic_t task_sent;
+ atomic_t task_stop;
+ atomic_t task_state_active;
+ struct timer_list task_timer;
+ int (*transport_map_task)(struct se_task_s *, u32);
+ void *se_obj_ptr;
+ struct se_obj_lun_type_s *se_obj_api;
+ struct list_head t_list;
+ struct list_head t_execute_list;
+ struct list_head t_state_list;
+} ____cacheline_aligned se_task_t;
+
+#define TASK_CMD(task) ((struct se_cmd_s *)task->task_se_cmd)
+#define TASK_DEV(task) ((struct se_device_s *)task->se_dev)
+
+typedef struct se_transform_info_s {
+ int ti_set_counts;
+ u32 ti_data_length;
+ unsigned long long ti_lba;
+ struct se_cmd_s *ti_se_cmd;
+ struct se_device_s *ti_dev;
+ void *se_obj_ptr;
+ void *ti_obj_ptr;
+ struct se_obj_lun_type_s *se_obj_api;
+ struct se_obj_lun_type_s *ti_obj_api;
+} ____cacheline_aligned se_transform_info_t;
+
+typedef struct se_offset_map_s {
+ int map_reset;
+ u32 iovec_length;
+ u32 iscsi_offset;
+ u32 current_offset;
+ u32 orig_offset;
+ u32 sg_count;
+ u32 sg_current;
+ u32 sg_length;
+ struct page *sg_page;
+ struct se_mem_s *map_se_mem;
+ struct se_mem_s *map_orig_se_mem;
+ void *iovec_base;
+} ____cacheline_aligned se_offset_map_t;
+
+typedef struct se_map_sg_s {
+ int map_flags;
+ u32 data_length;
+ u32 data_offset;
+ void *fabric_cmd;
+ struct se_cmd_s *se_cmd;
+ struct iovec *iov;
+} ____cacheline_aligned se_map_sg_t;
+
+typedef struct se_unmap_sg_s {
+ u32 data_length;
+ u32 sg_count;
+ u32 sg_offset;
+ u32 padding;
+ u32 t_offset;
+ void *fabric_cmd;
+ struct se_cmd_s *se_cmd;
+ se_offset_map_t lmap;
+ struct se_mem_s *cur_se_mem;
+} ____cacheline_aligned se_unmap_sg_t;
+
+typedef struct se_cmd_s {
+ /* SAM response code being sent to initiator */
+ u8 scsi_status;
+ u8 scsi_asc;
+ u8 scsi_ascq;
+ u8 scsi_sense_reason;
+ u16 scsi_sense_length;
+ /* Delay for ALUA Active/NonOptimized state access in milliseconds */
+ int alua_nonop_delay;
+ int data_direction;
+ /* For SAM Task Attribute */
+ int sam_task_attr;
+ /* Transport protocol dependent state */
+ int t_state;
+ /* Transport protocol dependent state for out of order CmdSNs */
+ int deferred_t_state;
+ /* Transport specific error status */
+ int transport_error_status;
+ u32 se_cmd_flags;
+ u32 se_ordered_id;
+ /* Total size in bytes associated with command */
+ u32 data_length;
+ /* SCSI Presented Data Transfer Length */
+ u32 cmd_spdtl;
+ u32 residual_count;
+ u32 orig_fe_lun;
+ /* Number of iovecs iovecs used for IP stack calls */
+ u32 iov_data_count;
+ /* Number of iovecs allocated for iscsi_cmd_t->iov_data */
+ u32 orig_iov_data_count;
+ /* Persistent Reservation key */
+ u64 pr_res_key;
+ atomic_t transport_sent;
+ /* Used for sense data */
+ void *sense_buffer;
+ /* Used with sockets based fabric plugins */
+ struct iovec *iov_data;
+ struct list_head se_delayed_list;
+ struct list_head se_ordered_list;
+ struct list_head se_lun_list;
+ struct se_device_s *se_dev;
+ struct se_dev_entry_s *se_deve;
+ struct se_lun_s *se_lun;
+ struct se_obj_lun_type_s *se_obj_api;
+ void *se_obj_ptr;
+ struct se_obj_lun_type_s *se_orig_obj_api;
+ void *se_orig_obj_ptr;
+ void *se_fabric_cmd_ptr;
+ struct se_session_s *se_sess;
+ struct se_tmr_req_s *se_tmr_req;
+ struct se_transport_task_s *t_task;
+ struct target_core_fabric_ops *se_tfo;
+ int (*transport_add_cmd_to_queue)(struct se_cmd_s *, u8);
+ int (*transport_allocate_iovecs)(struct se_cmd_s *);
+ int (*transport_allocate_resources)(struct se_cmd_s *, u32, u32);
+ int (*transport_cdb_transform)(struct se_cmd_s *,
+ struct se_transform_info_s *);
+ int (*transport_do_transform)(struct se_cmd_s *,
+ struct se_transform_info_s *);
+ int (*transport_emulate_cdb)(struct se_cmd_s *);
+ void (*transport_free_resources)(struct se_cmd_s *);
+ u32 (*transport_get_lba)(unsigned char *);
+ unsigned long long (*transport_get_long_lba)(unsigned char *);
+ struct se_task_s *(*transport_get_task)(struct se_transform_info_s *,
+ struct se_cmd_s *, void *,
+ struct se_obj_lun_type_s *);
+ int (*transport_map_buffers_to_tasks)(struct se_cmd_s *);
+ void (*transport_map_SG_segments)(struct se_unmap_sg_s *);
+ void (*transport_passthrough_done)(struct se_cmd_s *);
+ void (*transport_unmap_SG_segments)(struct se_unmap_sg_s *);
+ int (*transport_set_iovec_ptrs)(struct se_map_sg_s *,
+ struct se_unmap_sg_s *);
+ void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *);
+ void (*transport_wait_for_tasks)(struct se_cmd_s *, int, int);
+ void (*callback)(struct se_cmd_s *cmd, void *callback_arg,
+ int complete_status);
+ void *callback_arg;
+} ____cacheline_aligned se_cmd_t;
+
+#define T_TASK(cmd) ((se_transport_task_t *)(cmd->t_task))
+#define CMD_OBJ_API(cmd) ((struct se_obj_lun_type_s *)(cmd->se_obj_api))
+#define CMD_ORIG_OBJ_API(cmd) ((struct se_obj_lun_type_s *) \
+ (cmd->se_orig_obj_api))
+#define CMD_TFO(cmd) ((struct target_core_fabric_ops *)cmd->se_tfo)
+
+typedef struct se_tmr_req_s {
+ /* Task Management function to be preformed */
+ u8 function;
+ /* Task Management response to send */
+ u8 response;
+ int call_transport;
+ /* Reference to ITT that Task Mgmt should be preformed */
+ u32 ref_task_tag;
+ /* 64-bit encoded SAM LUN from $FABRIC_MOD TMR header */
+ u64 ref_task_lun;
+ void *fabric_tmr_ptr;
+ se_cmd_t *task_cmd;
+ se_cmd_t *ref_cmd;
+ struct se_device_s *tmr_dev;
+ struct se_lun_s *tmr_lun;
+ struct list_head tmr_list;
+} ____cacheline_aligned se_tmr_req_t;
+
+typedef struct se_ua_s {
+ u8 ua_asc;
+ u8 ua_ascq;
+ struct se_node_acl_s *ua_nacl;
+ struct list_head ua_dev_list;
+ struct list_head ua_nacl_list;
+} ____cacheline_aligned se_ua_t;
+
+typedef struct se_node_acl_s {
+ char initiatorname[TRANSPORT_IQN_LEN];
+ int nodeacl_flags;
+ u32 queue_depth;
+#ifdef SNMP_SUPPORT
+ u32 acl_index;
+ u64 num_cmds;
+ u64 read_bytes;
+ u64 write_bytes;
+ spinlock_t stats_lock;
+#endif /* SNMP_SUPPORT */
+ struct se_dev_entry_s *device_list;
+ struct se_session_s *nacl_sess;
+ struct se_portal_group_s *se_tpg;
+ void *fabric_acl_ptr;
+ spinlock_t device_list_lock;
+ spinlock_t nacl_sess_lock;
+ struct config_group acl_group;
+ struct config_group acl_param_group;
+ struct list_head acl_list;
+} ____cacheline_aligned se_node_acl_t;
+
+typedef struct se_session_s {
+ struct se_node_acl_s *se_node_acl;
+ struct se_portal_group_s *se_tpg;
+ void *fabric_sess_ptr;
+ struct list_head sess_list;
+} ____cacheline_aligned se_session_t;
+
+#define SE_SESS(cmd) ((struct se_session_s *)(cmd)->se_sess)
+#define SE_NODE_ACL(sess) ((struct se_node_acl_s *)(sess)->se_node_acl)
+
+struct se_device_s;
+struct se_transform_info_s;
+struct se_obj_lun_type_s;
+struct scatterlist;
+
+typedef struct se_lun_acl_s {
+ char initiatorname[TRANSPORT_IQN_LEN];
+ u32 mapped_lun;
+ struct se_node_acl_s *se_lun_nacl;
+ struct se_lun_s *se_lun;
+ struct list_head lacl_list;
+ struct config_group se_lun_group;
+} ____cacheline_aligned se_lun_acl_t;
+
+typedef struct se_dev_entry_s {
+ u32 lun_flags;
+ u32 deve_cmds;
+ u32 deve_flags;
+ u32 mapped_lun;
+ u32 average_bytes;
+ u32 last_byte_count;
+ u32 total_cmds;
+ u32 total_bytes;
+ u64 pr_res_key;
+#ifdef SNMP_SUPPORT
+ u64 creation_time;
+ u32 attach_count;
+ u64 read_bytes;
+ u64 write_bytes;
+#endif /* SNMP_SUPPORT */
+ atomic_t ua_count;
+ se_lun_acl_t *se_lun_acl;
+ spinlock_t ua_lock;
+ struct se_lun_s *se_lun;
+ struct list_head alua_port_list;
+ struct list_head ua_list;
+} ____cacheline_aligned se_dev_entry_t;
+
+typedef struct se_dev_attrib_s {
+ int emulate_ua_intlck_ctrl;
+ int emulate_tas;
+ int emulate_reservations;
+ int emulate_alua;
+ u32 hw_block_size;
+ u32 block_size;
+ u32 hw_max_sectors;
+ u32 max_sectors;
+ u32 hw_queue_depth;
+ u32 queue_depth;
+ u32 task_timeout;
+ struct se_subsystem_dev_s *da_sub_dev;
+ struct config_group da_group;
+} ____cacheline_aligned se_dev_attrib_t;
+
+typedef struct se_dev_snap_attrib_s {
+ unsigned char contact[SNAP_CONTACT_LEN];
+ unsigned char lv_group[SNAP_GROUP_LEN];
+ unsigned char lvc_size[SNAP_LVC_LEN]; /* in lvcreate --size shorthand */
+ pid_t pid;
+ int enabled;
+ int permissions;
+ int max_snapshots;
+ int max_warn;
+ int check_interval;
+ int create_interval;
+ int usage;
+ int usage_warn;
+ int vgs_usage_warn;
+} se_dev_snap_attrib_t;
+
+typedef struct se_subsystem_dev_s {
+ unsigned char se_dev_udev_path[SE_UDEV_PATH_LEN];
+ u32 su_dev_flags;
+ struct se_hba_s *se_dev_hba;
+ struct se_device_s *se_dev_ptr;
+ se_dev_attrib_t se_dev_attrib;
+ se_dev_snap_attrib_t se_snap_attrib;
+ /* T10 Asymmetric Logical Unit Assignment for Target Ports */
+ t10_alua_t t10_alua;
+ /* T10 Inquiry and VPD WWN Information */
+ t10_wwn_t t10_wwn;
+ /* T10 SPC-2 + SPC-3 Reservations */
+ t10_reservation_template_t t10_reservation;
+ spinlock_t se_dev_lock;
+ void *se_dev_su_ptr;
+ struct list_head g_se_dev_list;
+ struct config_group se_dev_group;
+ /* For T10 Reservations */
+ struct config_group se_dev_pr_group;
+ /* For userspace lvm utils */
+ struct config_group se_dev_snap_group;
+} ____cacheline_aligned se_subsystem_dev_t;
+
+#define SE_DEV_SNAP(su_dev) (&(su_dev)->se_snap_attrib)
+#define T10_ALUA(su_dev) (&(su_dev)->t10_alua)
+#define T10_RES(su_dev) (&(su_dev)->t10_reservation)
+
+typedef struct se_device_s {
+ /* Type of disk transport used for device */
+ u8 type;
+ /* Set to 1 if thread is NOT sleeping on thread_sem */
+ u8 thread_active;
+ u8 dev_status_timer_flags;
+ /* RELATIVE TARGET PORT IDENTIFER Counter */
+ u16 dev_rpti_counter;
+ /* Used for SAM Task Attribute ordering */
+ u32 dev_cur_ordered_id;
+ u32 dev_flags;
+ u32 dev_port_count;
+ u32 dev_status;
+ u32 dev_tcq_window_closed;
+ /* Physical device queue depth */
+ u32 queue_depth;
+ t10_task_attr_index_t dev_task_attr_type;
+ unsigned long long dev_sectors_total;
+ /* Pointer to transport specific device structure */
+ void *dev_ptr;
+#ifdef SNMP_SUPPORT
+ u32 dev_index;
+ u64 creation_time;
+ u32 num_resets;
+ u64 num_cmds;
+ u64 read_bytes;
+ u64 write_bytes;
+ spinlock_t stats_lock;
+#endif /* SNMP_SUPPORT */
+ /* Active commands on this virtual SE device */
+ atomic_t active_cmds;
+ atomic_t simple_cmds;
+ atomic_t depth_left;
+ atomic_t dev_ordered_id;
+ atomic_t dev_tur_active;
+ atomic_t execute_tasks;
+ atomic_t dev_status_thr_count;
+ atomic_t dev_hoq_count;
+ atomic_t dev_ordered_sync;
+ struct se_obj_s dev_obj;
+ struct se_obj_s dev_access_obj;
+ struct se_obj_s dev_export_obj;
+ struct se_obj_s dev_feature_obj;
+ se_queue_obj_t *dev_queue_obj;
+ se_queue_obj_t *dev_status_queue_obj;
+ spinlock_t delayed_cmd_lock;
+ spinlock_t ordered_cmd_lock;
+ spinlock_t execute_task_lock;
+ spinlock_t state_task_lock;
+ spinlock_t dev_alua_lock;
+ spinlock_t dev_reservation_lock;
+ spinlock_t dev_state_lock;
+ spinlock_t dev_status_lock;
+ spinlock_t dev_status_thr_lock;
+ spinlock_t se_port_lock;
+ spinlock_t se_tmr_lock;
+ /* Used for legacy SPC-2 reservationsa */
+ struct se_node_acl_s *dev_reserved_node_acl;
+ /* Used for ALUA Logical Unit Group membership */
+ struct t10_alua_lu_gp_member_s *dev_alua_lu_gp_mem;
+ /* Used for SPC-3 Persistent Reservations */
+ struct t10_pr_registration_s *dev_pr_res_holder;
+ struct list_head dev_sep_list;
+ struct list_head dev_tmr_list;
+ struct timer_list dev_status_timer;
+ /* Pointer to descriptor for processing thread */
+ struct task_struct *process_thread;
+ pid_t process_thread_pid;
+ struct task_struct *dev_mgmt_thread;
+ int (*write_pending)(struct se_task_s *);
+ void (*dev_generate_cdb)(unsigned long long, u32 *,
+ unsigned char *, int);
+ struct se_obj_lun_type_s *dev_obj_api;
+ struct list_head delayed_cmd_list;
+ struct list_head ordered_cmd_list;
+ struct list_head execute_task_list;
+ struct list_head state_task_list;
+ /* Pointer to associated SE HBA */
+ struct se_hba_s *se_hba;
+ struct se_subsystem_dev_s *se_sub_dev;
+ /* Pointer to template of function pointers for transport */
+ struct se_subsystem_api_s *transport;
+ /* Linked list for se_hba_t se_device_t list */
+ struct list_head dev_list;
+ /* Linked list for se_global_t->g_se_dev_list */
+ struct list_head g_se_dev_list;
+} ____cacheline_aligned se_device_t;
+
+#define SE_DEV(cmd) ((se_device_t *)(cmd)->se_lun->se_dev)
+#define SU_DEV(dev) ((se_subsystem_dev_t *)(dev)->se_sub_dev)
+#define ISCSI_DEV(cmd) SE_DEV(cmd)
+#define DEV_ATTRIB(dev) (&(dev)->se_sub_dev->se_dev_attrib)
+#define DEV_T10_WWN(dev) (&(dev)->se_sub_dev->t10_wwn)
+#define DEV_OBJ_API(dev) ((struct se_obj_lun_type_s *)(dev)->dev_obj_api)
+
+typedef struct se_hba_s {
+ /* Type of disk transport used for HBA. */
+ u8 type;
+ u16 hba_tpgt;
+ u32 hba_status;
+ u32 hba_id;
+ u32 hba_flags;
+ /* Virtual iSCSI devices attached. */
+ u32 dev_count;
+#ifdef SNMP_SUPPORT
+ u32 hba_index;
+#endif
+ atomic_t dev_mib_access_count;
+ atomic_t load_balance_queue;
+ atomic_t left_queue_depth;
+ /* Maximum queue depth the HBA can handle. */
+ atomic_t max_queue_depth;
+ /* Pointer to transport specific host structure. */
+ void *hba_ptr;
+ /* Linked list for se_device_t */
+ struct list_head hba_dev_list;
+ struct list_head hba_list;
+ spinlock_t device_lock;
+ spinlock_t hba_queue_lock;
+ struct config_group hba_group;
+ struct semaphore hba_access_sem;
+ struct se_subsystem_api_s *transport;
+} ____cacheline_aligned se_hba_t;
+
+#define ISCSI_HBA(d) ((se_hba_t *)(d)->se_hba)
+/* Using SE_HBA() for new code */
+#define SE_HBA(d) ((se_hba_t *)(d)->se_hba)
+
+typedef struct se_lun_s {
+ int lun_type;
+ int lun_status;
+ u32 lun_access;
+ u32 lun_flags;
+ u32 unpacked_lun;
+ atomic_t lun_acl_count;
+ spinlock_t lun_acl_lock;
+ spinlock_t lun_cmd_lock;
+ spinlock_t lun_sep_lock;
+ struct list_head lun_cmd_list;
+ struct list_head lun_acl_list;
+ se_device_t *se_dev;
+ void *lun_type_ptr;
+ struct config_group lun_group;
+ struct se_obj_lun_type_s *lun_obj_api;
+ struct se_port_s *lun_sep;
+} ____cacheline_aligned se_lun_t;
+
+#define SE_LUN(c) ((se_lun_t *)(c)->se_lun)
+#define ISCSI_LUN(c) SE_LUN(c)
+#define LUN_OBJ_API(lun) ((struct se_obj_lun_type_s *)(lun)->lun_obj_api)
+
+typedef struct se_port_s {
+ /* RELATIVE TARGET PORT IDENTIFER */
+ u16 sep_rtpi;
+ int sep_tg_pt_secondary_stat;
+ int sep_tg_pt_secondary_write_md;
+#ifdef SNMP_SUPPORT
+ u32 sep_index;
+ scsi_port_stats_t sep_stats;
+#endif
+ /* Used for ALUA Target Port Groups membership */
+ atomic_t sep_tg_pt_gp_active;
+ atomic_t sep_tg_pt_secondary_offline;
+ spinlock_t sep_alua_lock;
+ struct mutex sep_tg_pt_md_mutex;
+ struct t10_alua_tg_pt_gp_member_s *sep_alua_tg_pt_gp_mem;
+ struct se_lun_s *sep_lun;
+ struct se_portal_group_s *sep_tpg;
+ struct list_head sep_alua_list;
+ struct list_head sep_list;
+} ____cacheline_aligned se_port_t;
+
+typedef struct se_portal_group_s {
+ /* Type of target portal group */
+ int se_tpg_type;
+ /* Number of ACLed Initiator Nodes for this TPG */
+ u32 num_node_acls;
+ /* Spinlock for adding/removing ACLed Nodes */
+ spinlock_t acl_node_lock;
+ /* Spinlock for adding/removing sessions */
+ spinlock_t session_lock;
+ spinlock_t tpg_lun_lock;
+ /* Pointer to $FABRIC_MOD portal group */
+ void *se_tpg_fabric_ptr;
+ struct list_head se_tpg_list;
+ /* linked list for initiator ACL list */
+ struct list_head acl_node_list;
+ struct se_lun_s *tpg_lun_list;
+ /* List of TCM sessions assoicated wth this TPG */
+ struct list_head tpg_sess_list;
+ /* Pointer to $FABRIC_MOD dependent code */
+ struct target_core_fabric_ops *se_tpg_tfo;
+ struct config_group tpg_group;
+} ____cacheline_aligned se_portal_group_t;
+
+#define TPG_TFO(se_tpg) ((struct target_core_fabric_ops *)(se_tpg)->se_tpg_tfo)
+
+typedef struct se_global_s {
+ u16 alua_lu_gps_counter;
+ u32 in_shutdown;
+ u32 alua_lu_gps_count;
+ u32 g_hba_id_counter;
+ struct config_group target_core_hbagroup;
+ struct config_group alua_group;
+ struct config_group alua_lu_gps_group;
+ struct list_head g_lu_gps_list;
+ struct list_head g_se_tpg_list;
+ struct list_head g_hba_list;
+ struct list_head g_se_dev_list;
+ struct se_plugin_class_s *plugin_class_list;
+ t10_alua_lu_gp_t *default_lu_gp;
+ spinlock_t g_device_lock;
+ spinlock_t hba_lock;
+ spinlock_t se_tpg_lock;
+ spinlock_t lu_gps_lock;
+ spinlock_t plugin_class_lock;
+#ifdef DEBUG_DEV
+ spinlock_t debug_dev_lock;
+#endif
+} ____cacheline_aligned se_global_t;
+
+#endif /* TARGET_CORE_BASE_H */
diff --git a/include/target/target_core_fabric_ops.h b/include/target/target_core_fabric_ops.h
new file mode 100644
index 0000000..b23a860
--- /dev/null
+++ b/include/target/target_core_fabric_ops.h
@@ -0,0 +1,48 @@
+struct target_core_fabric_ops {
+ struct configfs_subsystem *tf_subsys;
+ char *(*get_fabric_name)(void);
+ u8 (*get_fabric_proto_ident)(void);
+ char *(*tpg_get_wwn)(struct se_portal_group_s *);
+ u16 (*tpg_get_tag)(struct se_portal_group_s *);
+ u32 (*tpg_get_default_depth)(struct se_portal_group_s *);
+ u32 (*tpg_get_pr_transport_id)(struct se_portal_group_s *,
+ struct se_node_acl_s *, int *, unsigned char *);
+ u32 (*tpg_get_pr_transport_id_len)(struct se_portal_group_s *,
+ struct se_node_acl_s *, int *);
+ char *(*tpg_parse_pr_out_transport_id)(const char *, u32 *, char **);
+ int (*tpg_check_demo_mode)(struct se_portal_group_s *);
+ int (*tpg_check_demo_mode_cache)(struct se_portal_group_s *);
+ int (*tpg_check_demo_mode_write_protect)(struct se_portal_group_s *);
+ void *(*tpg_alloc_fabric_acl)(struct se_portal_group_s *,
+ struct se_node_acl_s *);
+ void (*tpg_release_fabric_acl)(struct se_portal_group_s *,
+ struct se_node_acl_s *);
+ u32 (*tpg_get_inst_index)(struct se_portal_group_s *);
+ void (*release_cmd_to_pool)(struct se_cmd_s *);
+ void (*release_cmd_direct)(struct se_cmd_s *);
+ int (*dev_del_lun)(struct se_portal_group_s *, u32);
+ /*
+ * Called with spin_lock_bh(se_portal_group_t->session_lock held.
+ */
+ int (*shutdown_session)(struct se_session_s *);
+ void (*close_session)(struct se_session_s *);
+ void (*stop_session)(struct se_session_s *, int, int);
+ void (*fall_back_to_erl0)(struct se_session_s *);
+ int (*sess_logged_in)(struct se_session_s *);
+ u32 (*sess_get_index)(struct se_session_s *);
+ u32 (*sess_get_initiator_wwn)(struct se_session_s *,
+ unsigned char *, u32);
+ int (*write_pending)(struct se_cmd_s *);
+ int (*write_pending_status)(struct se_cmd_s *);
+ void (*set_default_node_attributes)(struct se_node_acl_s *);
+ u32 (*get_task_tag)(struct se_cmd_s *);
+ int (*get_cmd_state)(struct se_cmd_s *);
+ void (*new_cmd_failure)(struct se_cmd_s *);
+ int (*queue_data_in)(struct se_cmd_s *);
+ int (*queue_status)(struct se_cmd_s *);
+ int (*queue_tm_rsp)(struct se_cmd_s *);
+ u16 (*set_fabric_sense_len)(struct se_cmd_s *, u32);
+ u16 (*get_fabric_sense_len)(void);
+ int (*is_state_remove)(struct se_cmd_s *);
+ u64 (*pack_lun)(unsigned int);
+};
^ permalink raw reply [flat|nested] 2+ messages in thread* [RFC PATCH 18/19] Target_Core_Mod base and fabric_module includes
@ 2009-09-18 22:09 Nicholas A. Bellinger
0 siblings, 0 replies; 2+ messages in thread
From: Nicholas A. Bellinger @ 2009-09-18 22:09 UTC (permalink / raw)
To: LKML, linux-scsi
Cc: Andrew Morton, Greg KH, Douglas Gilbert, James Bottomley,
Hannes Reinecke, FUJITA Tomonori, Mike Christie, Joel Becker,
Martin K. Petersen, Christoph Hellwig, Linus Torvalds,
Alan Stern, Boaz Harrosh, Florian Haas, Philipp Reisner,
Lars Ellenberg, Daniel Walker
[RFC PATCH 18/19] Target_Core_Mod base and fabric_module includes
This patch adds the core data instructures for target_core_mod and fabric module API for accessing
for TCM/ConfigFS enabled fabric modules.
Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
new file mode 100644
index 0000000..ee456c1
--- /dev/null
+++ b/include/target/target_core_base.h
@@ -0,0 +1,974 @@
+/****************************************************************************
+ * Filename: target_core_base.h
+ *
+ * This file contains definitions related to the Target Core Engine.
+ *
+ * Nicholas A. Bellinger <nab@kernel.org>
+ *
+ * Copyright (c) 2003, 2004, 2005 PyX Technologies, Inc.
+ * Copyright (c) 2005, 2006, 2007 SBE, Inc.
+ * Copyright (c) 2007-2009 Rising Tide Software, Inc.
+ * Copyright (c) 2008-2009 Linux-iSCSI.org
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ ****************************************************************************/
+
+
+#ifndef TARGET_CORE_BASE_H
+#define TARGET_CORE_BASE_H
+
+#include <linux/in.h>
+#include <linux/configfs.h>
+#include <net/sock.h>
+#include <net/tcp.h>
+#ifdef SNMP_SUPPORT
+#include <target/target_core_mib.h>
+#endif /* SNMP_SUPPORT */
+
+#define TARGET_CORE_MOD_VERSION "v3.2.0"
+#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
+
+/* SCSI Command Descriptor Block Size a la SCSI's MAX_COMMAND_SIZE */
+#define SCSI_CDB_SIZE 16
+#define TRANSPORT_IOV_DATA_BUFFER 5
+
+/* Maximum Number of LUNs per Target Portal Group */
+#define TRANSPORT_MAX_LUNS_PER_TPG 256
+
+/* From include/scsi/scsi_cmnd.h:SCSI_SENSE_BUFFERSIZE */
+#define TRANSPORT_SENSE_BUFFER SCSI_SENSE_BUFFERSIZE
+
+#define SPC_SENSE_KEY_OFFSET 2
+#define SPC_ASC_KEY_OFFSET 12
+#define SPC_ASCQ_KEY_OFFSET 13
+
+/* Currently same as ISCSI_IQN_LEN */
+#define TRANSPORT_IQN_LEN 224
+#define LU_GROUP_NAME_BUF 256
+#define TG_PT_GROUP_NAME_BUF 256
+/* Used to parse VPD into t10_vpd_t */
+#define VPD_TMP_BUF_SIZE 128
+/* Used for target_core-pscsi.c:pscsi_transport_complete() */
+#define VPD_BUF_LEN 256
+/* Used for se_subsystem_dev_t->se_dev_udev_path[], must be less than
+ PAGE_SIZE */
+#define SE_UDEV_PATH_LEN 512
+/* Used for se_dev_snap_attrib_t->contact */
+#define SNAP_CONTACT_LEN 128
+/* Used for se_dev_snap_attrib_t->lv_group */
+#define SNAP_GROUP_LEN 128
+/* Used for se_dev_snap_attrib->lvc_size */
+#define SNAP_LVC_LEN 32
+/* Used by t10_reservation_template_s->pr_[i,t]_port[] */
+#define PR_APTPL_MAX_IPORT_LEN 256
+#define PR_APTPL_MAX_TPORT_LEN 256
+/* Used by t10_reservation_template_s->pr_aptpl_buf_len */
+#define PR_APTPL_BUF_LEN 8192
+/* Used by t10_alua_tg_pt_gp_t->tg_pt_gp_md_buf_len */
+#define ALUA_MD_BUF_LEN 1024
+
+/* used by PSCSI and iBlock Transport drivers */
+#define READ_BLOCK_LEN 6
+#define READ_CAP_LEN 8
+#define READ_POSITION_LEN 20
+#define INQUIRY_LEN 36
+#define INQUIRY_VPD_SERIAL_LEN 254
+#define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN 254
+
+/* se_cmd_t->data_direction */
+#define SE_DIRECTION_NONE 0
+#define SE_DIRECTION_READ 1
+#define SE_DIRECTION_WRITE 2
+#define SE_DIRECTION_BIDI 3
+
+/* se_hba_t->hba_flags */
+#define HBA_FLAGS_INTERNAL_USE 0x00000001
+
+/* se_hba_t->hba_status and iscsi_tpg_hba->thba_status */
+#define HBA_STATUS_FREE 0x00000001
+#define HBA_STATUS_ACTIVE 0x00000002
+#define HBA_STATUS_INACTIVE 0x00000004
+#define HBA_STATUS_SHUTDOWN 0x00000008
+
+/* se_lun_t->lun_status */
+#define TRANSPORT_LUN_STATUS_FREE 0
+#define TRANSPORT_LUN_STATUS_ACTIVE 1
+
+/* se_lun_t->lun_type */
+#define TRANSPORT_LUN_TYPE_NONE 0
+#define TRANSPORT_LUN_TYPE_DEVICE 1
+
+/* se_portal_group_t->se_tpg_type */
+#define TRANSPORT_TPG_TYPE_NORMAL 0
+#define TRANSPORT_TPG_TYPE_DISCOVERY 1
+
+/* Used for se_node_acl->nodeacl_flags */
+#define NAF_DYNAMIC_NODE_ACL 0x01
+
+/* se_map_sg_t->map_flags */
+#define MAP_SG_KMAP 0x01
+
+/* Used for generate timer flags */
+#define TF_RUNNING 0x01
+#define TF_STOP 0x02
+
+/* Special transport agnostic se_cmd_t->t_states */
+#define TRANSPORT_NO_STATE 240
+#define TRANSPORT_NEW_CMD 241
+#define TRANSPORT_DEFERRED_CMD 242
+#define TRANSPORT_WRITE_PENDING 243
+#define TRANSPORT_PROCESS_WRITE 244
+#define TRANSPORT_PROCESSING 245
+#define TRANSPORT_COMPLETE_OK 246
+#define TRANSPORT_COMPLETE_FAILURE 247
+#define TRANSPORT_COMPLETE_TIMEOUT 248
+#define TRANSPORT_PROCESS_TMR 249
+#define TRANSPORT_TMR_COMPLETE 250
+#define TRANSPORT_ISTATE_PROCESSING 251
+#define TRANSPORT_ISTATE_PROCESSED 252
+#define TRANSPORT_KILL 253
+#define TRANSPORT_REMOVE 254
+#define TRANSPORT_FREE 255
+
+#define SCF_SUPPORTED_SAM_OPCODE 0x00000001
+#define SCF_TRANSPORT_TASK_SENSE 0x00000002
+#define SCF_EMULATED_TASK_SENSE 0x00000004
+#define SCF_SCSI_DATA_SG_IO_CDB 0x00000008
+#define SCF_SCSI_CONTROL_SG_IO_CDB 0x00000010
+#define SCF_SCSI_CONTROL_NONSG_IO_CDB 0x00000020
+#define SCF_SCSI_NON_DATA_CDB 0x00000040
+#define SCF_SCSI_CDB_EXCEPTION 0x00000080
+#define SCF_SCSI_RESERVATION_CONFLICT 0x00000100
+#define SCF_CMD_PASSTHROUGH 0x00000200
+#define SCF_CMD_PASSTHROUGH_NOALLOC 0x00000400
+#define SCF_SE_CMD_FAILED 0x00000800
+#define SCF_SE_LUN_CMD 0x00001000
+#define SCF_SE_ALLOW_EOO 0x00002000
+#define SCF_SE_DISABLE_ONLINE_CHECK 0x00004000
+#define SCF_SENT_CHECK_CONDITION 0x00008000
+#define SCF_OVERFLOW_BIT 0x00010000
+#define SCF_UNDERFLOW_BIT 0x00020000
+#define SCF_SENT_DELAYED_TAS 0x00040000
+#define SCF_ALUA_NON_OPTIMIZED 0x00080000
+#define SCF_DELAYED_CMD_FROM_SAM_ATTR 0x00100000
+
+/* se_device_t->type */
+#define PSCSI 1
+#define STGT 2
+#define PATA 3
+#define IBLOCK 4
+#define RAMDISK_DR 5
+#define RAMDISK_MCP 6
+#define FILEIO 7
+#define VROM 8
+#define VTAPE 9
+#define MEDIA_CHANGER 10
+
+/* se_dev_entry_t->lun_flags and se_lun_t->lun_access */
+#define TRANSPORT_LUNFLAGS_NO_ACCESS 0x00000000
+#define TRANSPORT_LUNFLAGS_INITIATOR_ACCESS 0x00000001
+#define TRANSPORT_LUNFLAGS_READ_ONLY 0x00000002
+#define TRANSPORT_LUNFLAGS_READ_WRITE 0x00000004
+
+/* se_device_t->dev_status */
+#define TRANSPORT_DEVICE_ACTIVATED 0x01
+#define TRANSPORT_DEVICE_DEACTIVATED 0x02
+#define TRANSPORT_DEVICE_QUEUE_FULL 0x04
+#define TRANSPORT_DEVICE_SHUTDOWN 0x08
+#define TRANSPORT_DEVICE_OFFLINE_ACTIVATED 0x10
+#define TRANSPORT_DEVICE_OFFLINE_DEACTIVATED 0x20
+
+#define DEV_STATUS_THR_TUR 1
+#define DEV_STATUS_THR_TAKE_ONLINE 2
+#define DEV_STATUS_THR_TAKE_OFFLINE 3
+#define DEV_STATUS_THR_SHUTDOWN 4
+
+/* se_dev_entry_t->deve_flags */
+#define DEF_PR_REGISTERED 0x01
+
+/* transport_send_check_condition_and_sense() */
+#define NON_EXISTENT_LUN 0x1
+#define UNSUPPORTED_SCSI_OPCODE 0x2
+#define INCORRECT_AMOUNT_OF_DATA 0x3
+#define UNEXPECTED_UNSOLICITED_DATA 0x4
+#define SERVICE_CRC_ERROR 0x5
+#define SNACK_REJECTED 0x6
+#define SECTOR_COUNT_TOO_MANY 0x7
+#define INVALID_CDB_FIELD 0x8
+#define INVALID_PARAMETER_LIST 0x9
+#define LOGICAL_UNIT_COMMUNICATION_FAILURE 0xa
+#define UNKNOWN_MODE_PAGE 0xb
+#define WRITE_PROTECTED 0xc
+#define CHECK_CONDITION_ABORT_CMD 0xd
+#define CHECK_CONDITION_UNIT_ATTENTION 0xe
+#define CHECK_CONDITION_NOT_READY 0xf
+
+typedef struct se_obj_s {
+ atomic_t obj_access_count;
+} ____cacheline_aligned se_obj_t;
+
+typedef enum {
+ SPC_ALUA_PASSTHROUGH,
+ SPC2_ALUA_DISABLED,
+ SPC3_ALUA_EMULATED
+} t10_alua_index_t;
+
+typedef enum {
+ SAM_TASK_ATTR_PASSTHROUGH,
+ SAM_TASK_ATTR_UNTAGGED,
+ SAM_TASK_ATTR_EMULATED
+} t10_task_attr_index_t;
+
+struct se_cmd_s;
+
+typedef struct t10_alua_s {
+ t10_alua_index_t alua_type;
+ /* ALUA Target Port Group ID */
+ u16 alua_tg_pt_gps_counter;
+ u32 alua_tg_pt_gps_count;
+ spinlock_t tg_pt_gps_lock;
+ struct se_subsystem_dev_s *t10_sub_dev;
+ /* Used for default ALUA Target Port Group */
+ struct t10_alua_tg_pt_gp_s *default_tg_pt_gp;
+ /* Used for default ALUA Target Port Group ConfigFS group */
+ struct config_group alua_tg_pt_gps_group;
+ int (*alua_state_check)(struct se_cmd_s *, unsigned char *, u8 *);
+ struct list_head tg_pt_gps_list;
+} ____cacheline_aligned t10_alua_t;
+
+typedef struct t10_alua_lu_gp_s {
+ u16 lu_gp_id;
+ int lu_gp_valid_id;
+ u32 lu_gp_members;
+ atomic_t lu_gp_shutdown;
+ atomic_t lu_gp_ref_cnt;
+ spinlock_t lu_gp_lock;
+ struct config_group lu_gp_group;
+ struct list_head lu_gp_list;
+ struct list_head lu_gp_mem_list;
+} ____cacheline_aligned t10_alua_lu_gp_t;
+
+typedef struct t10_alua_lu_gp_member_s {
+ int lu_gp_assoc;
+ atomic_t lu_gp_mem_ref_cnt;
+ spinlock_t lu_gp_mem_lock;
+ t10_alua_lu_gp_t *lu_gp;
+ struct se_device_s *lu_gp_mem_dev;
+ struct list_head lu_gp_mem_list;
+} ____cacheline_aligned t10_alua_lu_gp_member_t;
+
+typedef struct t10_alua_tg_pt_gp_s {
+ u16 tg_pt_gp_id;
+ int tg_pt_gp_valid_id;
+ int tg_pt_gp_alua_access_status;
+ int tg_pt_gp_alua_access_type;
+ int tg_pt_gp_nonop_delay_msecs;
+ int tg_pt_gp_trans_delay_msecs;
+ int tg_pt_gp_pref;
+ int tg_pt_gp_write_metadata;
+ u32 tg_pt_gp_md_buf_len;
+ u32 tg_pt_gp_members;
+ atomic_t tg_pt_gp_alua_access_state;
+ atomic_t tg_pt_gp_ref_cnt;
+ spinlock_t tg_pt_gp_lock;
+ struct mutex tg_pt_gp_md_mutex;
+ struct se_subsystem_dev_s *tg_pt_gp_su_dev;
+ struct config_group tg_pt_gp_group;
+ struct list_head tg_pt_gp_list;
+ struct list_head tg_pt_gp_mem_list;
+} ____cacheline_aligned t10_alua_tg_pt_gp_t;
+
+typedef struct t10_alua_tg_pt_gp_member_s {
+ int tg_pt_gp_assoc;
+ atomic_t tg_pt_gp_mem_ref_cnt;
+ spinlock_t tg_pt_gp_mem_lock;
+ t10_alua_tg_pt_gp_t *tg_pt_gp;
+ struct se_port_s *tg_pt;
+ struct list_head tg_pt_gp_mem_list;
+} ____cacheline_aligned t10_alua_tg_pt_gp_member_t;
+
+typedef struct t10_vpd_s {
+ unsigned char device_identifier[INQUIRY_VPD_DEVICE_IDENTIFIER_LEN];
+ int protocol_identifier_set;
+ u32 protocol_identifier;
+ u32 device_identifier_code_set;
+ u32 association;
+ u32 device_identifier_type;
+ struct list_head vpd_list;
+} ____cacheline_aligned t10_vpd_t;
+
+typedef struct t10_wwn_s {
+ unsigned char vendor[8];
+ unsigned char model[16];
+ unsigned char revision[4];
+ unsigned char unit_serial[INQUIRY_VPD_SERIAL_LEN];
+ spinlock_t t10_vpd_lock;
+ struct se_subsystem_dev_s *t10_sub_dev;
+ struct config_group t10_wwn_group;
+ struct list_head t10_vpd_list;
+} ____cacheline_aligned t10_wwn_t;
+
+typedef enum {
+ SPC_PASSTHROUGH,
+ SPC2_RESERVATIONS,
+ SPC3_PERSISTENT_RESERVATIONS
+} t10_reservations_index_t;
+
+typedef struct t10_pr_registration_s {
+ unsigned char pr_iport[PR_APTPL_MAX_IPORT_LEN]; /* Used during APTPL metadata reading */
+ unsigned char pr_tport[PR_APTPL_MAX_TPORT_LEN]; /* Used during APTPL metadata reading */
+ unsigned char *pr_aptpl_buf; /* For writing out live meta data */
+ u16 pr_aptpl_rpti;
+ u16 pr_reg_tpgt;
+ int pr_reg_all_tg_pt; /* Reservation effects all target ports */
+ int pr_reg_aptpl; /* Activate Persistence across Target Power Loss */
+ int pr_res_holder;
+ int pr_res_type;
+ int pr_res_scope;
+ u32 pr_res_mapped_lun;
+ u32 pr_aptpl_target_lun;
+ u32 pr_res_generation;
+ u64 pr_res_key;
+ atomic_t pr_res_holders;
+ struct se_node_acl_s *pr_reg_nacl;
+ struct se_dev_entry_s *pr_reg_deve;
+ struct se_lun_s *pr_reg_tg_pt_lun;
+ struct list_head pr_reg_list;
+ struct list_head pr_reg_abort_list;
+ struct list_head pr_reg_aptpl_list;
+} ____cacheline_aligned t10_pr_registration_t;
+
+typedef struct t10_reservation_template_s {
+ /* Reservation effects all target ports */
+ int pr_all_tg_pt;
+ /* Activate Persistence across Target Power Loss enabled for SCSI device */
+ int pr_aptpl_active;
+ u32 pr_aptpl_buf_len;
+ u32 pr_generation;
+ t10_reservations_index_t res_type;
+ spinlock_t registration_lock;
+ spinlock_t aptpl_reg_lock;
+ /* Reservation holder when pr_all_tg_pt=1 */
+ struct se_node_acl_s *pr_res_holder;
+ struct list_head registration_list;
+ struct list_head aptpl_reg_list;
+ int (*t10_reservation_check)(struct se_cmd_s *, u32 *);
+ int (*t10_reserve)(struct se_cmd_s *);
+ int (*t10_release)(struct se_cmd_s *);
+ int (*t10_seq_non_holder)(struct se_cmd_s *, unsigned char *, u32);
+ int (*t10_pr_register)(struct se_cmd_s *);
+ int (*t10_pr_clear)(struct se_cmd_s *);
+} ____cacheline_aligned t10_reservation_template_t;
+
+typedef struct se_queue_req_s {
+ int state;
+ void *queue_se_obj_ptr;
+ void *cmd;
+ struct se_obj_lun_type_s *queue_se_obj_api;
+ struct list_head qr_list;
+} ____cacheline_aligned se_queue_req_t;
+
+typedef struct se_queue_obj_s {
+ atomic_t queue_cnt;
+ spinlock_t cmd_queue_lock;
+ struct list_head qobj_list;
+ wait_queue_head_t thread_wq;
+ struct completion thread_create_comp;
+ struct completion thread_done_comp;
+} ____cacheline_aligned se_queue_obj_t;
+
+typedef struct se_transport_task_s {
+ unsigned char t_task_cdb[SCSI_CDB_SIZE];
+ unsigned long long t_task_lba;
+ int t_tasks_failed;
+ u32 t_task_cdbs;
+ u32 t_task_check;
+ u32 t_task_no;
+ u32 t_task_sectors;
+ u32 t_task_se_num;
+ atomic_t t_fe_count;
+ atomic_t t_se_count;
+ atomic_t t_task_cdbs_left;
+ atomic_t t_task_cdbs_ex_left;
+ atomic_t t_task_cdbs_timeout_left;
+ atomic_t t_task_cdbs_sent;
+ atomic_t t_transport_aborted;
+ atomic_t t_transport_active;
+ atomic_t t_transport_complete;
+ atomic_t t_transport_queue_active;
+ atomic_t t_transport_sent;
+ atomic_t t_transport_stop;
+ atomic_t t_transport_timeout;
+ atomic_t transport_lun_active;
+ atomic_t transport_lun_fe_stop;
+ atomic_t transport_lun_stop;
+ spinlock_t t_state_lock;
+ struct completion t_transport_stop_comp;
+ struct completion t_transport_passthrough_comp;
+ struct completion t_transport_passthrough_wcomp;
+ struct completion transport_lun_fe_stop_comp;
+ struct completion transport_lun_stop_comp;
+ void *t_task_buf;
+ void *t_task_pt_buf;
+ struct list_head t_task_list;
+ struct list_head *t_mem_list;
+} ____cacheline_aligned se_transport_task_t;
+
+typedef struct se_task_s {
+ unsigned char task_sense;
+ struct scatterlist *task_sg;
+ void *transport_req;
+ u8 task_scsi_status;
+ u8 task_flags;
+ int task_error_status;
+ int task_state_flags;
+ unsigned long long task_lba;
+ u32 task_no;
+ u32 task_sectors;
+ u32 task_size;
+ u32 task_sg_num;
+ u32 task_sg_offset;
+ struct se_cmd_s *task_se_cmd;
+ struct se_device_s *se_dev;
+ struct completion task_stop_comp;
+ atomic_t task_active;
+ atomic_t task_execute_queue;
+ atomic_t task_timeout;
+ atomic_t task_sent;
+ atomic_t task_stop;
+ atomic_t task_state_active;
+ struct timer_list task_timer;
+ int (*transport_map_task)(struct se_task_s *, u32);
+ void *se_obj_ptr;
+ struct se_obj_lun_type_s *se_obj_api;
+ struct list_head t_list;
+ struct list_head t_execute_list;
+ struct list_head t_state_list;
+} ____cacheline_aligned se_task_t;
+
+#define TASK_CMD(task) ((struct se_cmd_s *)task->task_se_cmd)
+#define TASK_DEV(task) ((struct se_device_s *)task->se_dev)
+
+typedef struct se_transform_info_s {
+ int ti_set_counts;
+ u32 ti_data_length;
+ unsigned long long ti_lba;
+ struct se_cmd_s *ti_se_cmd;
+ struct se_device_s *ti_dev;
+ void *se_obj_ptr;
+ void *ti_obj_ptr;
+ struct se_obj_lun_type_s *se_obj_api;
+ struct se_obj_lun_type_s *ti_obj_api;
+} ____cacheline_aligned se_transform_info_t;
+
+typedef struct se_offset_map_s {
+ int map_reset;
+ u32 iovec_length;
+ u32 iscsi_offset;
+ u32 current_offset;
+ u32 orig_offset;
+ u32 sg_count;
+ u32 sg_current;
+ u32 sg_length;
+ struct page *sg_page;
+ struct se_mem_s *map_se_mem;
+ struct se_mem_s *map_orig_se_mem;
+ void *iovec_base;
+} ____cacheline_aligned se_offset_map_t;
+
+typedef struct se_map_sg_s {
+ int map_flags;
+ u32 data_length;
+ u32 data_offset;
+ void *fabric_cmd;
+ struct se_cmd_s *se_cmd;
+ struct iovec *iov;
+} ____cacheline_aligned se_map_sg_t;
+
+typedef struct se_unmap_sg_s {
+ u32 data_length;
+ u32 sg_count;
+ u32 sg_offset;
+ u32 padding;
+ u32 t_offset;
+ void *fabric_cmd;
+ struct se_cmd_s *se_cmd;
+ se_offset_map_t lmap;
+ struct se_mem_s *cur_se_mem;
+} ____cacheline_aligned se_unmap_sg_t;
+
+typedef struct se_cmd_s {
+ /* SAM response code being sent to initiator */
+ u8 scsi_status;
+ u8 scsi_asc;
+ u8 scsi_ascq;
+ u8 scsi_sense_reason;
+ u16 scsi_sense_length;
+ /* Delay for ALUA Active/NonOptimized state access in milliseconds */
+ int alua_nonop_delay;
+ int data_direction;
+ /* For SAM Task Attribute */
+ int sam_task_attr;
+ /* Transport protocol dependent state */
+ int t_state;
+ /* Transport protocol dependent state for out of order CmdSNs */
+ int deferred_t_state;
+ /* Transport specific error status */
+ int transport_error_status;
+ u32 se_cmd_flags;
+ u32 se_ordered_id;
+ /* Total size in bytes associated with command */
+ u32 data_length;
+ /* SCSI Presented Data Transfer Length */
+ u32 cmd_spdtl;
+ u32 residual_count;
+ u32 orig_fe_lun;
+ /* Number of iovecs iovecs used for IP stack calls */
+ u32 iov_data_count;
+ /* Number of iovecs allocated for iscsi_cmd_t->iov_data */
+ u32 orig_iov_data_count;
+ /* Persistent Reservation key */
+ u64 pr_res_key;
+ atomic_t transport_sent;
+ /* Used for sense data */
+ void *sense_buffer;
+ /* Used with sockets based fabric plugins */
+ struct iovec *iov_data;
+ struct list_head se_delayed_list;
+ struct list_head se_ordered_list;
+ struct list_head se_lun_list;
+ struct se_device_s *se_dev;
+ struct se_dev_entry_s *se_deve;
+ struct se_lun_s *se_lun;
+ struct se_obj_lun_type_s *se_obj_api;
+ void *se_obj_ptr;
+ struct se_obj_lun_type_s *se_orig_obj_api;
+ void *se_orig_obj_ptr;
+ void *se_fabric_cmd_ptr;
+ struct se_session_s *se_sess;
+ struct se_tmr_req_s *se_tmr_req;
+ struct se_transport_task_s *t_task;
+ struct target_core_fabric_ops *se_tfo;
+ int (*transport_add_cmd_to_queue)(struct se_cmd_s *, u8);
+ int (*transport_allocate_iovecs)(struct se_cmd_s *);
+ int (*transport_allocate_resources)(struct se_cmd_s *, u32, u32);
+ int (*transport_cdb_transform)(struct se_cmd_s *,
+ struct se_transform_info_s *);
+ int (*transport_do_transform)(struct se_cmd_s *,
+ struct se_transform_info_s *);
+ int (*transport_emulate_cdb)(struct se_cmd_s *);
+ void (*transport_free_resources)(struct se_cmd_s *);
+ u32 (*transport_get_lba)(unsigned char *);
+ unsigned long long (*transport_get_long_lba)(unsigned char *);
+ struct se_task_s *(*transport_get_task)(struct se_transform_info_s *,
+ struct se_cmd_s *, void *,
+ struct se_obj_lun_type_s *);
+ int (*transport_map_buffers_to_tasks)(struct se_cmd_s *);
+ void (*transport_map_SG_segments)(struct se_unmap_sg_s *);
+ void (*transport_passthrough_done)(struct se_cmd_s *);
+ void (*transport_unmap_SG_segments)(struct se_unmap_sg_s *);
+ int (*transport_set_iovec_ptrs)(struct se_map_sg_s *,
+ struct se_unmap_sg_s *);
+ void (*transport_split_cdb)(unsigned long long, u32 *, unsigned char *);
+ void (*transport_wait_for_tasks)(struct se_cmd_s *, int, int);
+ void (*callback)(struct se_cmd_s *cmd, void *callback_arg,
+ int complete_status);
+ void *callback_arg;
+} ____cacheline_aligned se_cmd_t;
+
+#define T_TASK(cmd) ((se_transport_task_t *)(cmd->t_task))
+#define CMD_OBJ_API(cmd) ((struct se_obj_lun_type_s *)(cmd->se_obj_api))
+#define CMD_ORIG_OBJ_API(cmd) ((struct se_obj_lun_type_s *) \
+ (cmd->se_orig_obj_api))
+#define CMD_TFO(cmd) ((struct target_core_fabric_ops *)cmd->se_tfo)
+
+typedef struct se_tmr_req_s {
+ /* Task Management function to be preformed */
+ u8 function;
+ /* Task Management response to send */
+ u8 response;
+ int call_transport;
+ /* Reference to ITT that Task Mgmt should be preformed */
+ u32 ref_task_tag;
+ /* 64-bit encoded SAM LUN from $FABRIC_MOD TMR header */
+ u64 ref_task_lun;
+ void *fabric_tmr_ptr;
+ se_cmd_t *task_cmd;
+ se_cmd_t *ref_cmd;
+ struct se_device_s *tmr_dev;
+ struct se_lun_s *tmr_lun;
+ struct list_head tmr_list;
+} ____cacheline_aligned se_tmr_req_t;
+
+typedef struct se_ua_s {
+ u8 ua_asc;
+ u8 ua_ascq;
+ struct se_node_acl_s *ua_nacl;
+ struct list_head ua_dev_list;
+ struct list_head ua_nacl_list;
+} ____cacheline_aligned se_ua_t;
+
+typedef struct se_node_acl_s {
+ char initiatorname[TRANSPORT_IQN_LEN];
+ int nodeacl_flags;
+ u32 queue_depth;
+#ifdef SNMP_SUPPORT
+ u32 acl_index;
+ u64 num_cmds;
+ u64 read_bytes;
+ u64 write_bytes;
+ spinlock_t stats_lock;
+#endif /* SNMP_SUPPORT */
+ struct se_dev_entry_s *device_list;
+ struct se_session_s *nacl_sess;
+ struct se_portal_group_s *se_tpg;
+ void *fabric_acl_ptr;
+ spinlock_t device_list_lock;
+ spinlock_t nacl_sess_lock;
+ struct config_group acl_group;
+ struct config_group acl_param_group;
+ struct list_head acl_list;
+} ____cacheline_aligned se_node_acl_t;
+
+typedef struct se_session_s {
+ struct se_node_acl_s *se_node_acl;
+ struct se_portal_group_s *se_tpg;
+ void *fabric_sess_ptr;
+ struct list_head sess_list;
+} ____cacheline_aligned se_session_t;
+
+#define SE_SESS(cmd) ((struct se_session_s *)(cmd)->se_sess)
+#define SE_NODE_ACL(sess) ((struct se_node_acl_s *)(sess)->se_node_acl)
+
+struct se_device_s;
+struct se_transform_info_s;
+struct se_obj_lun_type_s;
+struct scatterlist;
+
+typedef struct se_lun_acl_s {
+ char initiatorname[TRANSPORT_IQN_LEN];
+ u32 mapped_lun;
+ struct se_node_acl_s *se_lun_nacl;
+ struct se_lun_s *se_lun;
+ struct list_head lacl_list;
+ struct config_group se_lun_group;
+} ____cacheline_aligned se_lun_acl_t;
+
+typedef struct se_dev_entry_s {
+ u32 lun_flags;
+ u32 deve_cmds;
+ u32 deve_flags;
+ u32 mapped_lun;
+ u32 average_bytes;
+ u32 last_byte_count;
+ u32 total_cmds;
+ u32 total_bytes;
+ u64 pr_res_key;
+#ifdef SNMP_SUPPORT
+ u64 creation_time;
+ u32 attach_count;
+ u64 read_bytes;
+ u64 write_bytes;
+#endif /* SNMP_SUPPORT */
+ atomic_t ua_count;
+ se_lun_acl_t *se_lun_acl;
+ spinlock_t ua_lock;
+ struct se_lun_s *se_lun;
+ struct list_head alua_port_list;
+ struct list_head ua_list;
+} ____cacheline_aligned se_dev_entry_t;
+
+typedef struct se_dev_attrib_s {
+ int emulate_ua_intlck_ctrl;
+ int emulate_tas;
+ int emulate_reservations;
+ int emulate_alua;
+ u32 hw_block_size;
+ u32 block_size;
+ u32 hw_max_sectors;
+ u32 max_sectors;
+ u32 hw_queue_depth;
+ u32 queue_depth;
+ u32 task_timeout;
+ struct se_subsystem_dev_s *da_sub_dev;
+ struct config_group da_group;
+} ____cacheline_aligned se_dev_attrib_t;
+
+typedef struct se_dev_snap_attrib_s {
+ unsigned char contact[SNAP_CONTACT_LEN];
+ unsigned char lv_group[SNAP_GROUP_LEN];
+ unsigned char lvc_size[SNAP_LVC_LEN]; /* in lvcreate --size shorthand */
+ pid_t pid;
+ int enabled;
+ int permissions;
+ int max_snapshots;
+ int max_warn;
+ int check_interval;
+ int create_interval;
+ int usage;
+ int usage_warn;
+ int vgs_usage_warn;
+} se_dev_snap_attrib_t;
+
+typedef struct se_subsystem_dev_s {
+ unsigned char se_dev_udev_path[SE_UDEV_PATH_LEN];
+ u32 su_dev_flags;
+ struct se_hba_s *se_dev_hba;
+ struct se_device_s *se_dev_ptr;
+ se_dev_attrib_t se_dev_attrib;
+ se_dev_snap_attrib_t se_snap_attrib;
+ /* T10 Asymmetric Logical Unit Assignment for Target Ports */
+ t10_alua_t t10_alua;
+ /* T10 Inquiry and VPD WWN Information */
+ t10_wwn_t t10_wwn;
+ /* T10 SPC-2 + SPC-3 Reservations */
+ t10_reservation_template_t t10_reservation;
+ spinlock_t se_dev_lock;
+ void *se_dev_su_ptr;
+ struct list_head g_se_dev_list;
+ struct config_group se_dev_group;
+ /* For T10 Reservations */
+ struct config_group se_dev_pr_group;
+ /* For userspace lvm utils */
+ struct config_group se_dev_snap_group;
+} ____cacheline_aligned se_subsystem_dev_t;
+
+#define SE_DEV_SNAP(su_dev) (&(su_dev)->se_snap_attrib)
+#define T10_ALUA(su_dev) (&(su_dev)->t10_alua)
+#define T10_RES(su_dev) (&(su_dev)->t10_reservation)
+
+typedef struct se_device_s {
+ /* Type of disk transport used for device */
+ u8 type;
+ /* Set to 1 if thread is NOT sleeping on thread_sem */
+ u8 thread_active;
+ u8 dev_status_timer_flags;
+ /* RELATIVE TARGET PORT IDENTIFER Counter */
+ u16 dev_rpti_counter;
+ /* Used for SAM Task Attribute ordering */
+ u32 dev_cur_ordered_id;
+ u32 dev_flags;
+ u32 dev_port_count;
+ u32 dev_status;
+ u32 dev_tcq_window_closed;
+ /* Physical device queue depth */
+ u32 queue_depth;
+ t10_task_attr_index_t dev_task_attr_type;
+ unsigned long long dev_sectors_total;
+ /* Pointer to transport specific device structure */
+ void *dev_ptr;
+#ifdef SNMP_SUPPORT
+ u32 dev_index;
+ u64 creation_time;
+ u32 num_resets;
+ u64 num_cmds;
+ u64 read_bytes;
+ u64 write_bytes;
+ spinlock_t stats_lock;
+#endif /* SNMP_SUPPORT */
+ /* Active commands on this virtual SE device */
+ atomic_t active_cmds;
+ atomic_t simple_cmds;
+ atomic_t depth_left;
+ atomic_t dev_ordered_id;
+ atomic_t dev_tur_active;
+ atomic_t execute_tasks;
+ atomic_t dev_status_thr_count;
+ atomic_t dev_hoq_count;
+ atomic_t dev_ordered_sync;
+ struct se_obj_s dev_obj;
+ struct se_obj_s dev_access_obj;
+ struct se_obj_s dev_export_obj;
+ struct se_obj_s dev_feature_obj;
+ se_queue_obj_t *dev_queue_obj;
+ se_queue_obj_t *dev_status_queue_obj;
+ spinlock_t delayed_cmd_lock;
+ spinlock_t ordered_cmd_lock;
+ spinlock_t execute_task_lock;
+ spinlock_t state_task_lock;
+ spinlock_t dev_alua_lock;
+ spinlock_t dev_reservation_lock;
+ spinlock_t dev_state_lock;
+ spinlock_t dev_status_lock;
+ spinlock_t dev_status_thr_lock;
+ spinlock_t se_port_lock;
+ spinlock_t se_tmr_lock;
+ /* Used for legacy SPC-2 reservationsa */
+ struct se_node_acl_s *dev_reserved_node_acl;
+ /* Used for ALUA Logical Unit Group membership */
+ struct t10_alua_lu_gp_member_s *dev_alua_lu_gp_mem;
+ /* Used for SPC-3 Persistent Reservations */
+ struct t10_pr_registration_s *dev_pr_res_holder;
+ struct list_head dev_sep_list;
+ struct list_head dev_tmr_list;
+ struct timer_list dev_status_timer;
+ /* Pointer to descriptor for processing thread */
+ struct task_struct *process_thread;
+ pid_t process_thread_pid;
+ struct task_struct *dev_mgmt_thread;
+ int (*write_pending)(struct se_task_s *);
+ void (*dev_generate_cdb)(unsigned long long, u32 *,
+ unsigned char *, int);
+ struct se_obj_lun_type_s *dev_obj_api;
+ struct list_head delayed_cmd_list;
+ struct list_head ordered_cmd_list;
+ struct list_head execute_task_list;
+ struct list_head state_task_list;
+ /* Pointer to associated SE HBA */
+ struct se_hba_s *se_hba;
+ struct se_subsystem_dev_s *se_sub_dev;
+ /* Pointer to template of function pointers for transport */
+ struct se_subsystem_api_s *transport;
+ /* Linked list for se_hba_t se_device_t list */
+ struct list_head dev_list;
+ /* Linked list for se_global_t->g_se_dev_list */
+ struct list_head g_se_dev_list;
+} ____cacheline_aligned se_device_t;
+
+#define SE_DEV(cmd) ((se_device_t *)(cmd)->se_lun->se_dev)
+#define SU_DEV(dev) ((se_subsystem_dev_t *)(dev)->se_sub_dev)
+#define ISCSI_DEV(cmd) SE_DEV(cmd)
+#define DEV_ATTRIB(dev) (&(dev)->se_sub_dev->se_dev_attrib)
+#define DEV_T10_WWN(dev) (&(dev)->se_sub_dev->t10_wwn)
+#define DEV_OBJ_API(dev) ((struct se_obj_lun_type_s *)(dev)->dev_obj_api)
+
+typedef struct se_hba_s {
+ /* Type of disk transport used for HBA. */
+ u8 type;
+ u16 hba_tpgt;
+ u32 hba_status;
+ u32 hba_id;
+ u32 hba_flags;
+ /* Virtual iSCSI devices attached. */
+ u32 dev_count;
+#ifdef SNMP_SUPPORT
+ u32 hba_index;
+#endif
+ atomic_t dev_mib_access_count;
+ atomic_t load_balance_queue;
+ atomic_t left_queue_depth;
+ /* Maximum queue depth the HBA can handle. */
+ atomic_t max_queue_depth;
+ /* Pointer to transport specific host structure. */
+ void *hba_ptr;
+ /* Linked list for se_device_t */
+ struct list_head hba_dev_list;
+ struct list_head hba_list;
+ spinlock_t device_lock;
+ spinlock_t hba_queue_lock;
+ struct config_group hba_group;
+ struct mutex hba_access_mutex;
+ struct se_subsystem_api_s *transport;
+} ____cacheline_aligned se_hba_t;
+
+#define ISCSI_HBA(d) ((se_hba_t *)(d)->se_hba)
+/* Using SE_HBA() for new code */
+#define SE_HBA(d) ((se_hba_t *)(d)->se_hba)
+
+typedef struct se_lun_s {
+ int lun_type;
+ int lun_status;
+ u32 lun_access;
+ u32 lun_flags;
+ u32 unpacked_lun;
+ atomic_t lun_acl_count;
+ spinlock_t lun_acl_lock;
+ spinlock_t lun_cmd_lock;
+ spinlock_t lun_sep_lock;
+ struct list_head lun_cmd_list;
+ struct list_head lun_acl_list;
+ se_device_t *se_dev;
+ void *lun_type_ptr;
+ struct config_group lun_group;
+ struct se_obj_lun_type_s *lun_obj_api;
+ struct se_port_s *lun_sep;
+} ____cacheline_aligned se_lun_t;
+
+#define SE_LUN(c) ((se_lun_t *)(c)->se_lun)
+#define ISCSI_LUN(c) SE_LUN(c)
+#define LUN_OBJ_API(lun) ((struct se_obj_lun_type_s *)(lun)->lun_obj_api)
+
+typedef struct se_port_s {
+ /* RELATIVE TARGET PORT IDENTIFER */
+ u16 sep_rtpi;
+ int sep_tg_pt_secondary_stat;
+ int sep_tg_pt_secondary_write_md;
+#ifdef SNMP_SUPPORT
+ u32 sep_index;
+ scsi_port_stats_t sep_stats;
+#endif
+ /* Used for ALUA Target Port Groups membership */
+ atomic_t sep_tg_pt_gp_active;
+ atomic_t sep_tg_pt_secondary_offline;
+ spinlock_t sep_alua_lock;
+ struct mutex sep_tg_pt_md_mutex;
+ struct t10_alua_tg_pt_gp_member_s *sep_alua_tg_pt_gp_mem;
+ struct se_lun_s *sep_lun;
+ struct se_portal_group_s *sep_tpg;
+ struct list_head sep_alua_list;
+ struct list_head sep_list;
+} ____cacheline_aligned se_port_t;
+
+typedef struct se_portal_group_s {
+ /* Type of target portal group */
+ int se_tpg_type;
+ /* Number of ACLed Initiator Nodes for this TPG */
+ u32 num_node_acls;
+ /* Spinlock for adding/removing ACLed Nodes */
+ spinlock_t acl_node_lock;
+ /* Spinlock for adding/removing sessions */
+ spinlock_t session_lock;
+ spinlock_t tpg_lun_lock;
+ /* Pointer to $FABRIC_MOD portal group */
+ void *se_tpg_fabric_ptr;
+ struct list_head se_tpg_list;
+ /* linked list for initiator ACL list */
+ struct list_head acl_node_list;
+ struct se_lun_s *tpg_lun_list;
+ /* List of TCM sessions assoicated wth this TPG */
+ struct list_head tpg_sess_list;
+ /* Pointer to $FABRIC_MOD dependent code */
+ struct target_core_fabric_ops *se_tpg_tfo;
+ struct config_group tpg_group;
+} ____cacheline_aligned se_portal_group_t;
+
+#define TPG_TFO(se_tpg) ((struct target_core_fabric_ops *)(se_tpg)->se_tpg_tfo)
+
+typedef struct se_global_s {
+ u16 alua_lu_gps_counter;
+ u32 in_shutdown;
+ u32 alua_lu_gps_count;
+ u32 g_hba_id_counter;
+ struct config_group target_core_hbagroup;
+ struct config_group alua_group;
+ struct config_group alua_lu_gps_group;
+ struct list_head g_lu_gps_list;
+ struct list_head g_se_tpg_list;
+ struct list_head g_hba_list;
+ struct list_head g_se_dev_list;
+ struct se_plugin_class_s *plugin_class_list;
+ t10_alua_lu_gp_t *default_lu_gp;
+ spinlock_t g_device_lock;
+ spinlock_t hba_lock;
+ spinlock_t se_tpg_lock;
+ spinlock_t lu_gps_lock;
+ spinlock_t plugin_class_lock;
+#ifdef DEBUG_DEV
+ spinlock_t debug_dev_lock;
+#endif
+} ____cacheline_aligned se_global_t;
+
+#endif /* TARGET_CORE_BASE_H */
diff --git a/include/target/target_core_fabric_ops.h b/include/target/target_core_fabric_ops.h
new file mode 100644
index 0000000..b23a860
--- /dev/null
+++ b/include/target/target_core_fabric_ops.h
@@ -0,0 +1,48 @@
+struct target_core_fabric_ops {
+ struct configfs_subsystem *tf_subsys;
+ char *(*get_fabric_name)(void);
+ u8 (*get_fabric_proto_ident)(void);
+ char *(*tpg_get_wwn)(struct se_portal_group_s *);
+ u16 (*tpg_get_tag)(struct se_portal_group_s *);
+ u32 (*tpg_get_default_depth)(struct se_portal_group_s *);
+ u32 (*tpg_get_pr_transport_id)(struct se_portal_group_s *,
+ struct se_node_acl_s *, int *, unsigned char *);
+ u32 (*tpg_get_pr_transport_id_len)(struct se_portal_group_s *,
+ struct se_node_acl_s *, int *);
+ char *(*tpg_parse_pr_out_transport_id)(const char *, u32 *, char **);
+ int (*tpg_check_demo_mode)(struct se_portal_group_s *);
+ int (*tpg_check_demo_mode_cache)(struct se_portal_group_s *);
+ int (*tpg_check_demo_mode_write_protect)(struct se_portal_group_s *);
+ void *(*tpg_alloc_fabric_acl)(struct se_portal_group_s *,
+ struct se_node_acl_s *);
+ void (*tpg_release_fabric_acl)(struct se_portal_group_s *,
+ struct se_node_acl_s *);
+ u32 (*tpg_get_inst_index)(struct se_portal_group_s *);
+ void (*release_cmd_to_pool)(struct se_cmd_s *);
+ void (*release_cmd_direct)(struct se_cmd_s *);
+ int (*dev_del_lun)(struct se_portal_group_s *, u32);
+ /*
+ * Called with spin_lock_bh(se_portal_group_t->session_lock held.
+ */
+ int (*shutdown_session)(struct se_session_s *);
+ void (*close_session)(struct se_session_s *);
+ void (*stop_session)(struct se_session_s *, int, int);
+ void (*fall_back_to_erl0)(struct se_session_s *);
+ int (*sess_logged_in)(struct se_session_s *);
+ u32 (*sess_get_index)(struct se_session_s *);
+ u32 (*sess_get_initiator_wwn)(struct se_session_s *,
+ unsigned char *, u32);
+ int (*write_pending)(struct se_cmd_s *);
+ int (*write_pending_status)(struct se_cmd_s *);
+ void (*set_default_node_attributes)(struct se_node_acl_s *);
+ u32 (*get_task_tag)(struct se_cmd_s *);
+ int (*get_cmd_state)(struct se_cmd_s *);
+ void (*new_cmd_failure)(struct se_cmd_s *);
+ int (*queue_data_in)(struct se_cmd_s *);
+ int (*queue_status)(struct se_cmd_s *);
+ int (*queue_tm_rsp)(struct se_cmd_s *);
+ u16 (*set_fabric_sense_len)(struct se_cmd_s *, u32);
+ u16 (*get_fabric_sense_len)(void);
+ int (*is_state_remove)(struct se_cmd_s *);
+ u64 (*pack_lun)(unsigned int);
+};
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2009-09-18 22:14 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-09-12 1:58 [RFC PATCH 18/19] Target_Core_Mod base and fabric_module includes Nicholas A. Bellinger
2009-09-18 22:09 Nicholas A. Bellinger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®