linux/include/target/target_core_base.h
<<
>>
Prefs
   1#ifndef TARGET_CORE_BASE_H
   2#define TARGET_CORE_BASE_H
   3
   4#include <linux/in.h>
   5#include <linux/configfs.h>
   6#include <linux/dma-mapping.h>
   7#include <linux/blkdev.h>
   8#include <scsi/scsi_cmnd.h>
   9#include <net/sock.h>
  10#include <net/tcp.h>
  11
  12#define TARGET_CORE_MOD_VERSION         "v4.1.0-rc2-ml"
  13#define TARGET_CORE_VERSION             TARGET_CORE_MOD_VERSION
  14
  15/* Maximum Number of LUNs per Target Portal Group */
  16/* Don't raise above 511 or REPORT_LUNS needs to handle >1 page */
  17#define TRANSPORT_MAX_LUNS_PER_TPG              256
  18/*
  19 * By default we use 32-byte CDBs in TCM Core and subsystem plugin code.
  20 *
  21 * Note that both include/scsi/scsi_cmnd.h:MAX_COMMAND_SIZE and
  22 * include/linux/blkdev.h:BLOCK_MAX_CDB as of v2.6.36-rc4 still use
  23 * 16-byte CDBs by default and require an extra allocation for
  24 * 32-byte CDBs to because of legacy issues.
  25 *
  26 * Within TCM Core there are no such legacy limitiations, so we go ahead
  27 * use 32-byte CDBs by default and use include/scsi/scsi.h:scsi_command_size()
  28 * within all TCM Core and subsystem plugin code.
  29 */
  30#define TCM_MAX_COMMAND_SIZE                    32
  31/*
  32 * From include/scsi/scsi_cmnd.h:SCSI_SENSE_BUFFERSIZE, currently
  33 * defined 96, but the real limit is 252 (or 260 including the header)
  34 */
  35#define TRANSPORT_SENSE_BUFFER                  SCSI_SENSE_BUFFERSIZE
  36/* Used by transport_send_check_condition_and_sense() */
  37#define SPC_SENSE_KEY_OFFSET                    2
  38#define SPC_ADD_SENSE_LEN_OFFSET                7
  39#define SPC_ASC_KEY_OFFSET                      12
  40#define SPC_ASCQ_KEY_OFFSET                     13
  41#define TRANSPORT_IQN_LEN                       224
  42/* Used by target_core_store_alua_lu_gp() and target_core_alua_lu_gp_show_attr_members() */
  43#define LU_GROUP_NAME_BUF                       256
  44/* Used by core_alua_store_tg_pt_gp_info() and target_core_alua_tg_pt_gp_show_attr_members() */
  45#define TG_PT_GROUP_NAME_BUF                    256
  46/* Used to parse VPD into struct t10_vpd */
  47#define VPD_TMP_BUF_SIZE                        128
  48/* Used by transport_generic_cmd_sequencer() */
  49#define READ_BLOCK_LEN                          6
  50#define READ_CAP_LEN                            8
  51#define READ_POSITION_LEN                       20
  52#define INQUIRY_LEN                             36
  53/* Used by transport_get_inquiry_vpd_serial() */
  54#define INQUIRY_VPD_SERIAL_LEN                  254
  55/* Used by transport_get_inquiry_vpd_device_ident() */
  56#define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN       254
  57
  58/* Attempts before moving from SHORT to LONG */
  59#define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD   3
  60#define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT  3  /* In milliseconds */
  61#define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG   10 /* In milliseconds */
  62
  63#define PYX_TRANSPORT_STATUS_INTERVAL           5 /* In seconds */
  64
  65/*
  66 * struct se_subsystem_dev->su_dev_flags
  67*/
  68#define SDF_FIRMWARE_VPD_UNIT_SERIAL            0x00000001
  69#define SDF_EMULATED_VPD_UNIT_SERIAL            0x00000002
  70#define SDF_USING_UDEV_PATH                     0x00000004
  71#define SDF_USING_ALIAS                         0x00000008
  72
  73/*
  74 * struct se_device->dev_flags
  75 */
  76#define DF_SPC2_RESERVATIONS                    0x00000001
  77#define DF_SPC2_RESERVATIONS_WITH_ISID          0x00000002
  78
  79/* struct se_dev_attrib sanity values */
  80/* Default max_unmap_lba_count */
  81#define DA_MAX_UNMAP_LBA_COUNT                  0
  82/* Default max_unmap_block_desc_count */
  83#define DA_MAX_UNMAP_BLOCK_DESC_COUNT           0
  84/* Default unmap_granularity */
  85#define DA_UNMAP_GRANULARITY_DEFAULT            0
  86/* Default unmap_granularity_alignment */
  87#define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT  0
  88/* Default max transfer length */
  89#define DA_FABRIC_MAX_SECTORS                   8192
  90/* Emulation for Direct Page Out */
  91#define DA_EMULATE_DPO                          0
  92/* Emulation for Forced Unit Access WRITEs */
  93#define DA_EMULATE_FUA_WRITE                    1
  94/* Emulation for Forced Unit Access READs */
  95#define DA_EMULATE_FUA_READ                     0
  96/* Emulation for WriteCache and SYNCHRONIZE_CACHE */
  97#define DA_EMULATE_WRITE_CACHE                  0
  98/* Emulation for UNIT ATTENTION Interlock Control */
  99#define DA_EMULATE_UA_INTLLCK_CTRL              0
 100/* Emulation for TASK_ABORTED status (TAS) by default */
 101#define DA_EMULATE_TAS                          1
 102/* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */
 103#define DA_EMULATE_TPU                          0
 104/*
 105 * Emulation for Thin Provisioning WRITE_SAME w/ UNMAP=1 bit using
 106 * block/blk-lib.c:blkdev_issue_discard()
 107 */
 108#define DA_EMULATE_TPWS                         0
 109/* No Emulation for PSCSI by default */
 110#define DA_EMULATE_RESERVATIONS                 0
 111/* No Emulation for PSCSI by default */
 112#define DA_EMULATE_ALUA                         0
 113/* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */
 114#define DA_ENFORCE_PR_ISIDS                     1
 115#define DA_STATUS_MAX_SECTORS_MIN               16
 116#define DA_STATUS_MAX_SECTORS_MAX               8192
 117/* By default don't report non-rotating (solid state) medium */
 118#define DA_IS_NONROT                            0
 119/* Queue Algorithm Modifier default for restricted reordering in control mode page */
 120#define DA_EMULATE_REST_REORD                   0
 121
 122#define SE_INQUIRY_BUF                          512
 123#define SE_MODE_PAGE_BUF                        512
 124#define SE_SENSE_BUF                            96
 125
 126/* struct se_hba->hba_flags */
 127enum hba_flags_table {
 128        HBA_FLAGS_INTERNAL_USE  = 0x01,
 129        HBA_FLAGS_PSCSI_MODE    = 0x02,
 130};
 131
 132/* struct se_lun->lun_status */
 133enum transport_lun_status_table {
 134        TRANSPORT_LUN_STATUS_FREE = 0,
 135        TRANSPORT_LUN_STATUS_ACTIVE = 1,
 136};
 137
 138/* struct se_portal_group->se_tpg_type */
 139enum transport_tpg_type_table {
 140        TRANSPORT_TPG_TYPE_NORMAL = 0,
 141        TRANSPORT_TPG_TYPE_DISCOVERY = 1,
 142};
 143
 144/* Special transport agnostic struct se_cmd->t_states */
 145enum transport_state_table {
 146        TRANSPORT_NO_STATE      = 0,
 147        TRANSPORT_NEW_CMD       = 1,
 148        TRANSPORT_WRITE_PENDING = 3,
 149        TRANSPORT_PROCESSING    = 5,
 150        TRANSPORT_COMPLETE      = 6,
 151        TRANSPORT_ISTATE_PROCESSING = 11,
 152        TRANSPORT_COMPLETE_QF_WP = 18,
 153        TRANSPORT_COMPLETE_QF_OK = 19,
 154};
 155
 156/* Used for struct se_cmd->se_cmd_flags */
 157enum se_cmd_flags_table {
 158        SCF_SUPPORTED_SAM_OPCODE        = 0x00000001,
 159        SCF_TRANSPORT_TASK_SENSE        = 0x00000002,
 160        SCF_EMULATED_TASK_SENSE         = 0x00000004,
 161        SCF_SCSI_DATA_CDB               = 0x00000008,
 162        SCF_SCSI_TMR_CDB                = 0x00000010,
 163        SCF_SCSI_CDB_EXCEPTION          = 0x00000020,
 164        SCF_SCSI_RESERVATION_CONFLICT   = 0x00000040,
 165        SCF_FUA                         = 0x00000080,
 166        SCF_SE_LUN_CMD                  = 0x00000100,
 167        SCF_BIDI                        = 0x00000400,
 168        SCF_SENT_CHECK_CONDITION        = 0x00000800,
 169        SCF_OVERFLOW_BIT                = 0x00001000,
 170        SCF_UNDERFLOW_BIT               = 0x00002000,
 171        SCF_SENT_DELAYED_TAS            = 0x00004000,
 172        SCF_ALUA_NON_OPTIMIZED          = 0x00008000,
 173        SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00020000,
 174        SCF_ACK_KREF                    = 0x00040000,
 175};
 176
 177/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */
 178enum transport_lunflags_table {
 179        TRANSPORT_LUNFLAGS_NO_ACCESS            = 0x00,
 180        TRANSPORT_LUNFLAGS_INITIATOR_ACCESS     = 0x01,
 181        TRANSPORT_LUNFLAGS_READ_ONLY            = 0x02,
 182        TRANSPORT_LUNFLAGS_READ_WRITE           = 0x04,
 183};
 184
 185/* struct se_device->dev_status */
 186enum transport_device_status_table {
 187        TRANSPORT_DEVICE_ACTIVATED              = 0x01,
 188        TRANSPORT_DEVICE_DEACTIVATED            = 0x02,
 189        TRANSPORT_DEVICE_QUEUE_FULL             = 0x04,
 190        TRANSPORT_DEVICE_SHUTDOWN               = 0x08,
 191        TRANSPORT_DEVICE_OFFLINE_ACTIVATED      = 0x10,
 192        TRANSPORT_DEVICE_OFFLINE_DEACTIVATED    = 0x20,
 193};
 194
 195/*
 196 * Used by transport_send_check_condition_and_sense() and se_cmd->scsi_sense_reason
 197 * to signal which ASC/ASCQ sense payload should be built.
 198 */
 199enum tcm_sense_reason_table {
 200        TCM_NON_EXISTENT_LUN                    = 0x01,
 201        TCM_UNSUPPORTED_SCSI_OPCODE             = 0x02,
 202        TCM_INCORRECT_AMOUNT_OF_DATA            = 0x03,
 203        TCM_UNEXPECTED_UNSOLICITED_DATA         = 0x04,
 204        TCM_SERVICE_CRC_ERROR                   = 0x05,
 205        TCM_SNACK_REJECTED                      = 0x06,
 206        TCM_SECTOR_COUNT_TOO_MANY               = 0x07,
 207        TCM_INVALID_CDB_FIELD                   = 0x08,
 208        TCM_INVALID_PARAMETER_LIST              = 0x09,
 209        TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE  = 0x0a,
 210        TCM_UNKNOWN_MODE_PAGE                   = 0x0b,
 211        TCM_WRITE_PROTECTED                     = 0x0c,
 212        TCM_CHECK_CONDITION_ABORT_CMD           = 0x0d,
 213        TCM_CHECK_CONDITION_UNIT_ATTENTION      = 0x0e,
 214        TCM_CHECK_CONDITION_NOT_READY           = 0x0f,
 215        TCM_RESERVATION_CONFLICT                = 0x10,
 216        TCM_ADDRESS_OUT_OF_RANGE                = 0x11,
 217};
 218
 219enum target_sc_flags_table {
 220        TARGET_SCF_BIDI_OP              = 0x01,
 221        TARGET_SCF_ACK_KREF             = 0x02,
 222        TARGET_SCF_UNKNOWN_SIZE         = 0x04,
 223};
 224
 225/* fabric independent task management function values */
 226enum tcm_tmreq_table {
 227        TMR_ABORT_TASK          = 1,
 228        TMR_ABORT_TASK_SET      = 2,
 229        TMR_CLEAR_ACA           = 3,
 230        TMR_CLEAR_TASK_SET      = 4,
 231        TMR_LUN_RESET           = 5,
 232        TMR_TARGET_WARM_RESET   = 6,
 233        TMR_TARGET_COLD_RESET   = 7,
 234        TMR_FABRIC_TMR          = 255,
 235};
 236
 237/* fabric independent task management response values */
 238enum tcm_tmrsp_table {
 239        TMR_FUNCTION_COMPLETE           = 0,
 240        TMR_TASK_DOES_NOT_EXIST         = 1,
 241        TMR_LUN_DOES_NOT_EXIST          = 2,
 242        TMR_TASK_STILL_ALLEGIANT        = 3,
 243        TMR_TASK_FAILOVER_NOT_SUPPORTED = 4,
 244        TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED    = 5,
 245        TMR_FUNCTION_AUTHORIZATION_FAILED = 6,
 246        TMR_FUNCTION_REJECTED           = 255,
 247};
 248
 249struct se_obj {
 250        atomic_t obj_access_count;
 251};
 252
 253/*
 254 * Used by TCM Core internally to signal if ALUA emulation is enabled or
 255 * disabled, or running in with TCM/pSCSI passthrough mode
 256 */
 257typedef enum {
 258        SPC_ALUA_PASSTHROUGH,
 259        SPC2_ALUA_DISABLED,
 260        SPC3_ALUA_EMULATED
 261} t10_alua_index_t;
 262
 263/*
 264 * Used by TCM Core internally to signal if SAM Task Attribute emulation
 265 * is enabled or disabled, or running in with TCM/pSCSI passthrough mode
 266 */
 267typedef enum {
 268        SAM_TASK_ATTR_PASSTHROUGH,
 269        SAM_TASK_ATTR_UNTAGGED,
 270        SAM_TASK_ATTR_EMULATED
 271} t10_task_attr_index_t;
 272
 273/*
 274 * Used for target SCSI statistics
 275 */
 276typedef enum {
 277        SCSI_INST_INDEX,
 278        SCSI_DEVICE_INDEX,
 279        SCSI_AUTH_INTR_INDEX,
 280        SCSI_INDEX_TYPE_MAX
 281} scsi_index_t;
 282
 283struct se_cmd;
 284
 285struct t10_alua {
 286        t10_alua_index_t alua_type;
 287        /* ALUA Target Port Group ID */
 288        u16     alua_tg_pt_gps_counter;
 289        u32     alua_tg_pt_gps_count;
 290        spinlock_t tg_pt_gps_lock;
 291        struct se_subsystem_dev *t10_sub_dev;
 292        /* Used for default ALUA Target Port Group */
 293        struct t10_alua_tg_pt_gp *default_tg_pt_gp;
 294        /* Used for default ALUA Target Port Group ConfigFS group */
 295        struct config_group alua_tg_pt_gps_group;
 296        int (*alua_state_check)(struct se_cmd *, unsigned char *, u8 *);
 297        struct list_head tg_pt_gps_list;
 298};
 299
 300struct t10_alua_lu_gp {
 301        u16     lu_gp_id;
 302        int     lu_gp_valid_id;
 303        u32     lu_gp_members;
 304        atomic_t lu_gp_ref_cnt;
 305        spinlock_t lu_gp_lock;
 306        struct config_group lu_gp_group;
 307        struct list_head lu_gp_node;
 308        struct list_head lu_gp_mem_list;
 309};
 310
 311struct t10_alua_lu_gp_member {
 312        bool lu_gp_assoc;
 313        atomic_t lu_gp_mem_ref_cnt;
 314        spinlock_t lu_gp_mem_lock;
 315        struct t10_alua_lu_gp *lu_gp;
 316        struct se_device *lu_gp_mem_dev;
 317        struct list_head lu_gp_mem_list;
 318};
 319
 320struct t10_alua_tg_pt_gp {
 321        u16     tg_pt_gp_id;
 322        int     tg_pt_gp_valid_id;
 323        int     tg_pt_gp_alua_access_status;
 324        int     tg_pt_gp_alua_access_type;
 325        int     tg_pt_gp_nonop_delay_msecs;
 326        int     tg_pt_gp_trans_delay_msecs;
 327        int     tg_pt_gp_implict_trans_secs;
 328        int     tg_pt_gp_pref;
 329        int     tg_pt_gp_write_metadata;
 330        /* Used by struct t10_alua_tg_pt_gp->tg_pt_gp_md_buf_len */
 331#define ALUA_MD_BUF_LEN                         1024
 332        u32     tg_pt_gp_md_buf_len;
 333        u32     tg_pt_gp_members;
 334        atomic_t tg_pt_gp_alua_access_state;
 335        atomic_t tg_pt_gp_ref_cnt;
 336        spinlock_t tg_pt_gp_lock;
 337        struct mutex tg_pt_gp_md_mutex;
 338        struct se_subsystem_dev *tg_pt_gp_su_dev;
 339        struct config_group tg_pt_gp_group;
 340        struct list_head tg_pt_gp_list;
 341        struct list_head tg_pt_gp_mem_list;
 342};
 343
 344struct t10_alua_tg_pt_gp_member {
 345        bool tg_pt_gp_assoc;
 346        atomic_t tg_pt_gp_mem_ref_cnt;
 347        spinlock_t tg_pt_gp_mem_lock;
 348        struct t10_alua_tg_pt_gp *tg_pt_gp;
 349        struct se_port *tg_pt;
 350        struct list_head tg_pt_gp_mem_list;
 351};
 352
 353struct t10_vpd {
 354        unsigned char device_identifier[INQUIRY_VPD_DEVICE_IDENTIFIER_LEN];
 355        int protocol_identifier_set;
 356        u32 protocol_identifier;
 357        u32 device_identifier_code_set;
 358        u32 association;
 359        u32 device_identifier_type;
 360        struct list_head vpd_list;
 361};
 362
 363struct t10_wwn {
 364        char vendor[8];
 365        char model[16];
 366        char revision[4];
 367        char unit_serial[INQUIRY_VPD_SERIAL_LEN];
 368        spinlock_t t10_vpd_lock;
 369        struct se_subsystem_dev *t10_sub_dev;
 370        struct config_group t10_wwn_group;
 371        struct list_head t10_vpd_list;
 372};
 373
 374
 375/*
 376 * Used by TCM Core internally to signal if >= SPC-3 persistent reservations
 377 * emulation is enabled or disabled, or running in with TCM/pSCSI passthrough
 378 * mode
 379 */
 380typedef enum {
 381        SPC_PASSTHROUGH,
 382        SPC2_RESERVATIONS,
 383        SPC3_PERSISTENT_RESERVATIONS
 384} t10_reservations_index_t;
 385
 386struct t10_pr_registration {
 387        /* Used for fabrics that contain WWN+ISID */
 388#define PR_REG_ISID_LEN                         16
 389        /* PR_REG_ISID_LEN + ',i,0x' */
 390#define PR_REG_ISID_ID_LEN                      (PR_REG_ISID_LEN + 5)
 391        char pr_reg_isid[PR_REG_ISID_LEN];
 392        /* Used during APTPL metadata reading */
 393#define PR_APTPL_MAX_IPORT_LEN                  256
 394        unsigned char pr_iport[PR_APTPL_MAX_IPORT_LEN];
 395        /* Used during APTPL metadata reading */
 396#define PR_APTPL_MAX_TPORT_LEN                  256
 397        unsigned char pr_tport[PR_APTPL_MAX_TPORT_LEN];
 398        /* For writing out live meta data */
 399        unsigned char *pr_aptpl_buf;
 400        u16 pr_aptpl_rpti;
 401        u16 pr_reg_tpgt;
 402        /* Reservation effects all target ports */
 403        int pr_reg_all_tg_pt;
 404        /* Activate Persistence across Target Power Loss */
 405        int pr_reg_aptpl;
 406        int pr_res_holder;
 407        int pr_res_type;
 408        int pr_res_scope;
 409        /* Used for fabric initiator WWPNs using a ISID */
 410        bool isid_present_at_reg;
 411        u32 pr_res_mapped_lun;
 412        u32 pr_aptpl_target_lun;
 413        u32 pr_res_generation;
 414        u64 pr_reg_bin_isid;
 415        u64 pr_res_key;
 416        atomic_t pr_res_holders;
 417        struct se_node_acl *pr_reg_nacl;
 418        struct se_dev_entry *pr_reg_deve;
 419        struct se_lun *pr_reg_tg_pt_lun;
 420        struct list_head pr_reg_list;
 421        struct list_head pr_reg_abort_list;
 422        struct list_head pr_reg_aptpl_list;
 423        struct list_head pr_reg_atp_list;
 424        struct list_head pr_reg_atp_mem_list;
 425};
 426
 427/*
 428 * This set of function pointer ops is set based upon SPC3_PERSISTENT_RESERVATIONS,
 429 * SPC2_RESERVATIONS or SPC_PASSTHROUGH in drivers/target/target_core_pr.c:
 430 * core_setup_reservations()
 431 */
 432struct t10_reservation_ops {
 433        int (*t10_reservation_check)(struct se_cmd *, u32 *);
 434        int (*t10_seq_non_holder)(struct se_cmd *, unsigned char *, u32);
 435        int (*t10_pr_register)(struct se_cmd *);
 436        int (*t10_pr_clear)(struct se_cmd *);
 437};
 438
 439struct t10_reservation {
 440        /* Reservation effects all target ports */
 441        int pr_all_tg_pt;
 442        /* Activate Persistence across Target Power Loss enabled
 443         * for SCSI device */
 444        int pr_aptpl_active;
 445        /* Used by struct t10_reservation->pr_aptpl_buf_len */
 446#define PR_APTPL_BUF_LEN                        8192
 447        u32 pr_aptpl_buf_len;
 448        u32 pr_generation;
 449        t10_reservations_index_t res_type;
 450        spinlock_t registration_lock;
 451        spinlock_t aptpl_reg_lock;
 452        /*
 453         * This will always be set by one individual I_T Nexus.
 454         * However with all_tg_pt=1, other I_T Nexus from the
 455         * same initiator can access PR reg/res info on a different
 456         * target port.
 457         *
 458         * There is also the 'All Registrants' case, where there is
 459         * a single *pr_res_holder of the reservation, but all
 460         * registrations are considered reservation holders.
 461         */
 462        struct se_node_acl *pr_res_holder;
 463        struct list_head registration_list;
 464        struct list_head aptpl_reg_list;
 465        struct t10_reservation_ops pr_ops;
 466};
 467
 468struct se_tmr_req {
 469        /* Task Management function to be performed */
 470        u8                      function;
 471        /* Task Management response to send */
 472        u8                      response;
 473        int                     call_transport;
 474        /* Reference to ITT that Task Mgmt should be performed */
 475        u32                     ref_task_tag;
 476        void                    *fabric_tmr_ptr;
 477        struct se_cmd           *task_cmd;
 478        struct se_device        *tmr_dev;
 479        struct se_lun           *tmr_lun;
 480        struct list_head        tmr_list;
 481};
 482
 483struct se_cmd {
 484        /* SAM response code being sent to initiator */
 485        u8                      scsi_status;
 486        u8                      scsi_asc;
 487        u8                      scsi_ascq;
 488        u8                      scsi_sense_reason;
 489        u16                     scsi_sense_length;
 490        /* Delay for ALUA Active/NonOptimized state access in milliseconds */
 491        int                     alua_nonop_delay;
 492        /* See include/linux/dma-mapping.h */
 493        enum dma_data_direction data_direction;
 494        /* For SAM Task Attribute */
 495        int                     sam_task_attr;
 496        /* Transport protocol dependent state, see transport_state_table */
 497        enum transport_state_table t_state;
 498        /* Used to signal cmd->se_tfo->check_release_cmd() usage per cmd */
 499        unsigned                check_release:1;
 500        unsigned                cmd_wait_set:1;
 501        unsigned                unknown_data_length:1;
 502        /* See se_cmd_flags_table */
 503        u32                     se_cmd_flags;
 504        u32                     se_ordered_id;
 505        /* Total size in bytes associated with command */
 506        u32                     data_length;
 507        u32                     residual_count;
 508        u32                     orig_fe_lun;
 509        /* Persistent Reservation key */
 510        u64                     pr_res_key;
 511        /* Used for sense data */
 512        void                    *sense_buffer;
 513        struct list_head        se_delayed_node;
 514        struct list_head        se_lun_node;
 515        struct list_head        se_qf_node;
 516        struct se_device      *se_dev;
 517        struct se_dev_entry   *se_deve;
 518        struct se_lun           *se_lun;
 519        /* Only used for internal passthrough and legacy TCM fabric modules */
 520        struct se_session       *se_sess;
 521        struct se_tmr_req       *se_tmr_req;
 522        struct list_head        se_cmd_list;
 523        struct completion       cmd_wait_comp;
 524        struct kref             cmd_kref;
 525        struct target_core_fabric_ops *se_tfo;
 526        int (*execute_cmd)(struct se_cmd *);
 527        void (*transport_complete_callback)(struct se_cmd *);
 528
 529        unsigned char           *t_task_cdb;
 530        unsigned char           __t_task_cdb[TCM_MAX_COMMAND_SIZE];
 531        unsigned long long      t_task_lba;
 532        atomic_t                t_fe_count;
 533        unsigned int            transport_state;
 534#define CMD_T_ABORTED           (1 << 0)
 535#define CMD_T_ACTIVE            (1 << 1)
 536#define CMD_T_COMPLETE          (1 << 2)
 537#define CMD_T_QUEUED            (1 << 3)
 538#define CMD_T_SENT              (1 << 4)
 539#define CMD_T_STOP              (1 << 5)
 540#define CMD_T_FAILED            (1 << 6)
 541#define CMD_T_LUN_STOP          (1 << 7)
 542#define CMD_T_LUN_FE_STOP       (1 << 8)
 543#define CMD_T_DEV_ACTIVE        (1 << 9)
 544#define CMD_T_REQUEST_STOP      (1 << 10)
 545#define CMD_T_BUSY              (1 << 11)
 546        spinlock_t              t_state_lock;
 547        struct completion       t_transport_stop_comp;
 548        struct completion       transport_lun_fe_stop_comp;
 549        struct completion       transport_lun_stop_comp;
 550
 551        struct work_struct      work;
 552
 553        struct scatterlist      *t_data_sg;
 554        unsigned int            t_data_nents;
 555        void                    *t_data_vmap;
 556        struct scatterlist      *t_bidi_data_sg;
 557        unsigned int            t_bidi_data_nents;
 558
 559        struct list_head        state_list;
 560        bool                    state_active;
 561
 562        /* old task stop completion, consider merging with some of the above */
 563        struct completion       task_stop_comp;
 564
 565        /* backend private data */
 566        void                    *priv;
 567};
 568
 569struct se_ua {
 570        u8                      ua_asc;
 571        u8                      ua_ascq;
 572        struct se_node_acl      *ua_nacl;
 573        struct list_head        ua_dev_list;
 574        struct list_head        ua_nacl_list;
 575};
 576
 577struct se_node_acl {
 578        char                    initiatorname[TRANSPORT_IQN_LEN];
 579        /* Used to signal demo mode created ACL, disabled by default */
 580        bool                    dynamic_node_acl;
 581        bool                    acl_stop:1;
 582        u32                     queue_depth;
 583        u32                     acl_index;
 584        u64                     num_cmds;
 585        u64                     read_bytes;
 586        u64                     write_bytes;
 587        spinlock_t              stats_lock;
 588        /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
 589        atomic_t                acl_pr_ref_count;
 590        struct se_dev_entry     **device_list;
 591        struct se_session       *nacl_sess;
 592        struct se_portal_group *se_tpg;
 593        spinlock_t              device_list_lock;
 594        spinlock_t              nacl_sess_lock;
 595        struct config_group     acl_group;
 596        struct config_group     acl_attrib_group;
 597        struct config_group     acl_auth_group;
 598        struct config_group     acl_param_group;
 599        struct config_group     acl_fabric_stat_group;
 600        struct config_group     *acl_default_groups[5];
 601        struct list_head        acl_list;
 602        struct list_head        acl_sess_list;
 603        struct completion       acl_free_comp;
 604        struct kref             acl_kref;
 605};
 606
 607struct se_session {
 608        unsigned                sess_tearing_down:1;
 609        u64                     sess_bin_isid;
 610        struct se_node_acl      *se_node_acl;
 611        struct se_portal_group *se_tpg;
 612        void                    *fabric_sess_ptr;
 613        struct list_head        sess_list;
 614        struct list_head        sess_acl_list;
 615        struct list_head        sess_cmd_list;
 616        spinlock_t              sess_cmd_lock;
 617        struct kref             sess_kref;
 618};
 619
 620struct se_device;
 621struct se_transform_info;
 622struct scatterlist;
 623
 624struct se_ml_stat_grps {
 625        struct config_group     stat_group;
 626        struct config_group     scsi_auth_intr_group;
 627        struct config_group     scsi_att_intr_port_group;
 628};
 629
 630struct se_lun_acl {
 631        char                    initiatorname[TRANSPORT_IQN_LEN];
 632        u32                     mapped_lun;
 633        struct se_node_acl      *se_lun_nacl;
 634        struct se_lun           *se_lun;
 635        struct list_head        lacl_list;
 636        struct config_group     se_lun_group;
 637        struct se_ml_stat_grps  ml_stat_grps;
 638};
 639
 640struct se_dev_entry {
 641        bool                    def_pr_registered;
 642        /* See transport_lunflags_table */
 643        u32                     lun_flags;
 644        u32                     deve_cmds;
 645        u32                     mapped_lun;
 646        u32                     average_bytes;
 647        u32                     last_byte_count;
 648        u32                     total_cmds;
 649        u32                     total_bytes;
 650        u64                     pr_res_key;
 651        u64                     creation_time;
 652        u32                     attach_count;
 653        u64                     read_bytes;
 654        u64                     write_bytes;
 655        atomic_t                ua_count;
 656        /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
 657        atomic_t                pr_ref_count;
 658        struct se_lun_acl       *se_lun_acl;
 659        spinlock_t              ua_lock;
 660        struct se_lun           *se_lun;
 661        struct list_head        alua_port_list;
 662        struct list_head        ua_list;
 663};
 664
 665struct se_dev_limits {
 666        /* Max supported HW queue depth */
 667        u32             hw_queue_depth;
 668        /* Max supported virtual queue depth */
 669        u32             queue_depth;
 670        /* From include/linux/blkdev.h for the other HW/SW limits. */
 671        struct queue_limits limits;
 672};
 673
 674struct se_dev_attrib {
 675        int             emulate_dpo;
 676        int             emulate_fua_write;
 677        int             emulate_fua_read;
 678        int             emulate_write_cache;
 679        int             emulate_ua_intlck_ctrl;
 680        int             emulate_tas;
 681        int             emulate_tpu;
 682        int             emulate_tpws;
 683        int             emulate_reservations;
 684        int             emulate_alua;
 685        int             enforce_pr_isids;
 686        int             is_nonrot;
 687        int             emulate_rest_reord;
 688        u32             hw_block_size;
 689        u32             block_size;
 690        u32             hw_max_sectors;
 691        u32             fabric_max_sectors;
 692        u32             optimal_sectors;
 693        u32             hw_queue_depth;
 694        u32             queue_depth;
 695        u32             max_unmap_lba_count;
 696        u32             max_unmap_block_desc_count;
 697        u32             unmap_granularity;
 698        u32             unmap_granularity_alignment;
 699        struct se_subsystem_dev *da_sub_dev;
 700        struct config_group da_group;
 701};
 702
 703struct se_dev_stat_grps {
 704        struct config_group stat_group;
 705        struct config_group scsi_dev_group;
 706        struct config_group scsi_tgt_dev_group;
 707        struct config_group scsi_lu_group;
 708};
 709
 710struct se_subsystem_dev {
 711/* Used for struct se_subsystem_dev-->se_dev_alias, must be less than PAGE_SIZE */
 712#define SE_DEV_ALIAS_LEN                512
 713        unsigned char   se_dev_alias[SE_DEV_ALIAS_LEN];
 714/* Used for struct se_subsystem_dev->se_dev_udev_path[], must be less than PAGE_SIZE */
 715#define SE_UDEV_PATH_LEN                512
 716        unsigned char   se_dev_udev_path[SE_UDEV_PATH_LEN];
 717        u32             su_dev_flags;
 718        struct se_hba *se_dev_hba;
 719        struct se_device *se_dev_ptr;
 720        struct se_dev_attrib se_dev_attrib;
 721        /* T10 Asymmetric Logical Unit Assignment for Target Ports */
 722        struct t10_alua t10_alua;
 723        /* T10 Inquiry and VPD WWN Information */
 724        struct t10_wwn  t10_wwn;
 725        /* T10 SPC-2 + SPC-3 Reservations */
 726        struct t10_reservation t10_pr;
 727        spinlock_t      se_dev_lock;
 728        void            *se_dev_su_ptr;
 729        struct config_group se_dev_group;
 730        /* For T10 Reservations */
 731        struct config_group se_dev_pr_group;
 732        /* For target_core_stat.c groups */
 733        struct se_dev_stat_grps dev_stat_grps;
 734};
 735
 736struct se_device {
 737        /* RELATIVE TARGET PORT IDENTIFER Counter */
 738        u16                     dev_rpti_counter;
 739        /* Used for SAM Task Attribute ordering */
 740        u32                     dev_cur_ordered_id;
 741        u32                     dev_flags;
 742        u32                     dev_port_count;
 743        /* See transport_device_status_table */
 744        u32                     dev_status;
 745        /* Physical device queue depth */
 746        u32                     queue_depth;
 747        /* Used for SPC-2 reservations enforce of ISIDs */
 748        u64                     dev_res_bin_isid;
 749        t10_task_attr_index_t   dev_task_attr_type;
 750        /* Pointer to transport specific device structure */
 751        void                    *dev_ptr;
 752        u32                     dev_index;
 753        u64                     creation_time;
 754        u32                     num_resets;
 755        u64                     num_cmds;
 756        u64                     read_bytes;
 757        u64                     write_bytes;
 758        spinlock_t              stats_lock;
 759        /* Active commands on this virtual SE device */
 760        atomic_t                simple_cmds;
 761        atomic_t                dev_ordered_id;
 762        atomic_t                dev_ordered_sync;
 763        atomic_t                dev_qf_count;
 764        struct se_obj           dev_obj;
 765        struct se_obj           dev_access_obj;
 766        struct se_obj           dev_export_obj;
 767        spinlock_t              delayed_cmd_lock;
 768        spinlock_t              execute_task_lock;
 769        spinlock_t              dev_reservation_lock;
 770        spinlock_t              dev_status_lock;
 771        spinlock_t              se_port_lock;
 772        spinlock_t              se_tmr_lock;
 773        spinlock_t              qf_cmd_lock;
 774        /* Used for legacy SPC-2 reservationsa */
 775        struct se_node_acl      *dev_reserved_node_acl;
 776        /* Used for ALUA Logical Unit Group membership */
 777        struct t10_alua_lu_gp_member *dev_alua_lu_gp_mem;
 778        /* Used for SPC-3 Persistent Reservations */
 779        struct t10_pr_registration *dev_pr_res_holder;
 780        struct list_head        dev_sep_list;
 781        struct list_head        dev_tmr_list;
 782        struct workqueue_struct *tmr_wq;
 783        struct work_struct      qf_work_queue;
 784        struct list_head        delayed_cmd_list;
 785        struct list_head        state_list;
 786        struct list_head        qf_cmd_list;
 787        /* Pointer to associated SE HBA */
 788        struct se_hba           *se_hba;
 789        struct se_subsystem_dev *se_sub_dev;
 790        /* Pointer to template of function pointers for transport */
 791        struct se_subsystem_api *transport;
 792        /* Linked list for struct se_hba struct se_device list */
 793        struct list_head        dev_list;
 794};
 795
 796struct se_hba {
 797        u16                     hba_tpgt;
 798        u32                     hba_id;
 799        /* See hba_flags_table */
 800        u32                     hba_flags;
 801        /* Virtual iSCSI devices attached. */
 802        u32                     dev_count;
 803        u32                     hba_index;
 804        /* Pointer to transport specific host structure. */
 805        void                    *hba_ptr;
 806        /* Linked list for struct se_device */
 807        struct list_head        hba_dev_list;
 808        struct list_head        hba_node;
 809        spinlock_t              device_lock;
 810        struct config_group     hba_group;
 811        struct mutex            hba_access_mutex;
 812        struct se_subsystem_api *transport;
 813};
 814
 815struct se_port_stat_grps {
 816        struct config_group stat_group;
 817        struct config_group scsi_port_group;
 818        struct config_group scsi_tgt_port_group;
 819        struct config_group scsi_transport_group;
 820};
 821
 822struct se_lun {
 823        /* See transport_lun_status_table */
 824        enum transport_lun_status_table lun_status;
 825        u32                     lun_access;
 826        u32                     lun_flags;
 827        u32                     unpacked_lun;
 828        atomic_t                lun_acl_count;
 829        spinlock_t              lun_acl_lock;
 830        spinlock_t              lun_cmd_lock;
 831        spinlock_t              lun_sep_lock;
 832        struct completion       lun_shutdown_comp;
 833        struct list_head        lun_cmd_list;
 834        struct list_head        lun_acl_list;
 835        struct se_device        *lun_se_dev;
 836        struct se_port          *lun_sep;
 837        struct config_group     lun_group;
 838        struct se_port_stat_grps port_stat_grps;
 839};
 840
 841struct scsi_port_stats {
 842       u64     cmd_pdus;
 843       u64     tx_data_octets;
 844       u64     rx_data_octets;
 845};
 846
 847struct se_port {
 848        /* RELATIVE TARGET PORT IDENTIFER */
 849        u16             sep_rtpi;
 850        int             sep_tg_pt_secondary_stat;
 851        int             sep_tg_pt_secondary_write_md;
 852        u32             sep_index;
 853        struct scsi_port_stats sep_stats;
 854        /* Used for ALUA Target Port Groups membership */
 855        atomic_t        sep_tg_pt_secondary_offline;
 856        /* Used for PR ALL_TG_PT=1 */
 857        atomic_t        sep_tg_pt_ref_cnt;
 858        spinlock_t      sep_alua_lock;
 859        struct mutex    sep_tg_pt_md_mutex;
 860        struct t10_alua_tg_pt_gp_member *sep_alua_tg_pt_gp_mem;
 861        struct se_lun *sep_lun;
 862        struct se_portal_group *sep_tpg;
 863        struct list_head sep_alua_list;
 864        struct list_head sep_list;
 865};
 866
 867struct se_tpg_np {
 868        struct se_portal_group *tpg_np_parent;
 869        struct config_group     tpg_np_group;
 870};
 871
 872struct se_portal_group {
 873        /* Type of target portal group, see transport_tpg_type_table */
 874        enum transport_tpg_type_table se_tpg_type;
 875        /* Number of ACLed Initiator Nodes for this TPG */
 876        u32                     num_node_acls;
 877        /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
 878        atomic_t                tpg_pr_ref_count;
 879        /* Spinlock for adding/removing ACLed Nodes */
 880        spinlock_t              acl_node_lock;
 881        /* Spinlock for adding/removing sessions */
 882        spinlock_t              session_lock;
 883        spinlock_t              tpg_lun_lock;
 884        /* Pointer to $FABRIC_MOD portal group */
 885        void                    *se_tpg_fabric_ptr;
 886        struct list_head        se_tpg_node;
 887        /* linked list for initiator ACL list */
 888        struct list_head        acl_node_list;
 889        struct se_lun           **tpg_lun_list;
 890        struct se_lun           tpg_virt_lun0;
 891        /* List of TCM sessions associated wth this TPG */
 892        struct list_head        tpg_sess_list;
 893        /* Pointer to $FABRIC_MOD dependent code */
 894        struct target_core_fabric_ops *se_tpg_tfo;
 895        struct se_wwn           *se_tpg_wwn;
 896        struct config_group     tpg_group;
 897        struct config_group     *tpg_default_groups[6];
 898        struct config_group     tpg_lun_group;
 899        struct config_group     tpg_np_group;
 900        struct config_group     tpg_acl_group;
 901        struct config_group     tpg_attrib_group;
 902        struct config_group     tpg_param_group;
 903};
 904
 905struct se_wwn {
 906        struct target_fabric_configfs *wwn_tf;
 907        struct config_group     wwn_group;
 908        struct config_group     *wwn_default_groups[2];
 909        struct config_group     fabric_stat_group;
 910};
 911
 912#endif /* TARGET_CORE_BASE_H */
 913
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.