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