~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/include/target/target_core_base.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef TARGET_CORE_BASE_H
  3 #define TARGET_CORE_BASE_H
  4 
  5 #include <linux/configfs.h>      /* struct config_group */
  6 #include <linux/dma-direction.h> /* enum dma_data_direction */
  7 #include <linux/sbitmap.h>
  8 #include <linux/percpu-refcount.h>
  9 #include <linux/semaphore.h>     /* struct semaphore */
 10 #include <linux/completion.h>
 11 
 12 #define TARGET_CORE_VERSION             "v5.0"
 13 
 14 /*
 15  * Maximum size of a CDB that can be stored in se_cmd without allocating
 16  * memory dynamically for the CDB.
 17  */
 18 #define TCM_MAX_COMMAND_SIZE                    32
 19 /*
 20  * From include/scsi/scsi_cmnd.h:SCSI_SENSE_BUFFERSIZE, currently
 21  * defined 96, but the real limit is 252 (or 260 including the header)
 22  */
 23 #define TRANSPORT_SENSE_BUFFER                  96
 24 /* Used by transport_send_check_condition_and_sense() */
 25 #define SPC_SENSE_KEY_OFFSET                    2
 26 #define SPC_ADD_SENSE_LEN_OFFSET                7
 27 #define SPC_DESC_TYPE_OFFSET                    8
 28 #define SPC_ADDITIONAL_DESC_LEN_OFFSET          9
 29 #define SPC_VALIDITY_OFFSET                     10
 30 #define SPC_ASC_KEY_OFFSET                      12
 31 #define SPC_ASCQ_KEY_OFFSET                     13
 32 #define TRANSPORT_IQN_LEN                       224
 33 /* Used by target_core_store_alua_lu_gp() and target_core_alua_lu_gp_show_attr_members() */
 34 #define LU_GROUP_NAME_BUF                       256
 35 /* Used by core_alua_store_tg_pt_gp_info() and target_core_alua_tg_pt_gp_show_attr_members() */
 36 #define TG_PT_GROUP_NAME_BUF                    256
 37 /* Used to parse VPD into struct t10_vpd */
 38 #define VPD_TMP_BUF_SIZE                        254
 39 /* Used by transport_generic_cmd_sequencer() */
 40 #define READ_BLOCK_LEN                          6
 41 #define READ_CAP_LEN                            8
 42 #define READ_POSITION_LEN                       20
 43 #define INQUIRY_LEN                             36
 44 /* Used by transport_get_inquiry_vpd_serial() */
 45 #define INQUIRY_VPD_SERIAL_LEN                  254
 46 /* Used by transport_get_inquiry_vpd_device_ident() */
 47 #define INQUIRY_VPD_DEVICE_IDENTIFIER_LEN       254
 48 
 49 #define INQUIRY_VENDOR_LEN                      8
 50 #define INQUIRY_MODEL_LEN                       16
 51 #define INQUIRY_REVISION_LEN                    4
 52 
 53 /* Attempts before moving from SHORT to LONG */
 54 #define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD   3
 55 #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT  3  /* In milliseconds */
 56 #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG   10 /* In milliseconds */
 57 
 58 #define PYX_TRANSPORT_STATUS_INTERVAL           5 /* In seconds */
 59 
 60 /* struct se_dev_attrib sanity values */
 61 /* Default max_unmap_lba_count */
 62 #define DA_MAX_UNMAP_LBA_COUNT                  0
 63 /* Default max_unmap_block_desc_count */
 64 #define DA_MAX_UNMAP_BLOCK_DESC_COUNT           0
 65 /* Default unmap_granularity */
 66 #define DA_UNMAP_GRANULARITY_DEFAULT            0
 67 /* Default unmap_granularity_alignment */
 68 #define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT  0
 69 /* Default unmap_zeroes_data */
 70 #define DA_UNMAP_ZEROES_DATA_DEFAULT            0
 71 /* Default max_write_same_len, disabled by default */
 72 #define DA_MAX_WRITE_SAME_LEN                   0
 73 /* Use a model alias based on the configfs backend device name */
 74 #define DA_EMULATE_MODEL_ALIAS                  0
 75 /* Emulation for WriteCache and SYNCHRONIZE_CACHE */
 76 #define DA_EMULATE_WRITE_CACHE                  0
 77 /* Emulation for TASK_ABORTED status (TAS) by default */
 78 #define DA_EMULATE_TAS                          1
 79 /* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */
 80 #define DA_EMULATE_TPU                          0
 81 /*
 82  * Emulation for Thin Provisioning WRITE_SAME w/ UNMAP=1 bit using
 83  * block/blk-lib.c:blkdev_issue_discard()
 84  */
 85 #define DA_EMULATE_TPWS                         0
 86 /* Emulation for CompareAndWrite (AtomicTestandSet) by default */
 87 #define DA_EMULATE_CAW                          1
 88 /* Emulation for 3rd Party Copy (ExtendedCopy) by default */
 89 #define DA_EMULATE_3PC                          1
 90 /* No Emulation for PSCSI by default */
 91 #define DA_EMULATE_ALUA                         0
 92 /* Emulate SCSI2 RESERVE/RELEASE and Persistent Reservations by default */
 93 #define DA_EMULATE_PR                           1
 94 /* Emulation for REPORT SUPPORTED OPERATION CODES */
 95 #define DA_EMULATE_RSOC                         1
 96 /* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */
 97 #define DA_ENFORCE_PR_ISIDS                     1
 98 /* Force SPC-3 PR Activate Persistence across Target Power Loss */
 99 #define DA_FORCE_PR_APTPL                       0
100 #define DA_STATUS_MAX_SECTORS_MIN               16
101 #define DA_STATUS_MAX_SECTORS_MAX               8192
102 /* By default don't report non-rotating (solid state) medium */
103 #define DA_IS_NONROT                            0
104 /* Queue Algorithm Modifier default for restricted reordering in control mode page */
105 #define DA_EMULATE_REST_REORD                   0
106 
107 #define SE_INQUIRY_BUF                          1024
108 #define SE_MODE_PAGE_BUF                        512
109 #define SE_SENSE_BUF                            96
110 
111 enum target_submit_type {
112         /* Use the fabric driver's default submission type */
113         TARGET_FABRIC_DEFAULT_SUBMIT,
114         /* Submit from the calling context */
115         TARGET_DIRECT_SUBMIT,
116         /* Defer submission to the LIO workqueue */
117         TARGET_QUEUE_SUBMIT,
118 };
119 
120 /* struct se_hba->hba_flags */
121 enum hba_flags_table {
122         HBA_FLAGS_INTERNAL_USE  = 0x01,
123         HBA_FLAGS_PSCSI_MODE    = 0x02,
124 };
125 
126 /* Special transport agnostic struct se_cmd->t_states */
127 enum transport_state_table {
128         TRANSPORT_NO_STATE      = 0,
129         TRANSPORT_NEW_CMD       = 1,
130         TRANSPORT_WRITE_PENDING = 3,
131         TRANSPORT_PROCESSING    = 5,
132         TRANSPORT_COMPLETE      = 6,
133         TRANSPORT_ISTATE_PROCESSING = 11,
134         TRANSPORT_COMPLETE_QF_WP = 18,
135         TRANSPORT_COMPLETE_QF_OK = 19,
136         TRANSPORT_COMPLETE_QF_ERR = 20,
137 };
138 
139 /* Used for struct se_cmd->se_cmd_flags */
140 enum se_cmd_flags_table {
141         SCF_SUPPORTED_SAM_OPCODE                = (1 << 0),
142         SCF_TRANSPORT_TASK_SENSE                = (1 << 1),
143         SCF_EMULATED_TASK_SENSE                 = (1 << 2),
144         SCF_SCSI_DATA_CDB                       = (1 << 3),
145         SCF_SCSI_TMR_CDB                        = (1 << 4),
146         SCF_FUA                                 = (1 << 5),
147         SCF_SE_LUN_CMD                          = (1 << 6),
148         SCF_BIDI                                = (1 << 7),
149         SCF_SENT_CHECK_CONDITION                = (1 << 8),
150         SCF_OVERFLOW_BIT                        = (1 << 9),
151         SCF_UNDERFLOW_BIT                       = (1 << 10),
152         SCF_ALUA_NON_OPTIMIZED                  = (1 << 11),
153         SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC       = (1 << 12),
154         SCF_COMPARE_AND_WRITE                   = (1 << 13),
155         SCF_PASSTHROUGH_PROT_SG_TO_MEM_NOALLOC  = (1 << 14),
156         SCF_ACK_KREF                            = (1 << 15),
157         SCF_USE_CPUID                           = (1 << 16),
158         SCF_TASK_ATTR_SET                       = (1 << 17),
159         SCF_TREAT_READ_AS_NORMAL                = (1 << 18),
160 };
161 
162 /*
163  * Used by transport_send_check_condition_and_sense()
164  * to signal which ASC/ASCQ sense payload should be built.
165  */
166 typedef unsigned __bitwise sense_reason_t;
167 
168 enum tcm_sense_reason_table {
169 #define R(x)    (__force sense_reason_t )(x)
170         TCM_NO_SENSE                            = R(0x00),
171         TCM_NON_EXISTENT_LUN                    = R(0x01),
172         TCM_UNSUPPORTED_SCSI_OPCODE             = R(0x02),
173         TCM_INCORRECT_AMOUNT_OF_DATA            = R(0x03),
174         TCM_UNEXPECTED_UNSOLICITED_DATA         = R(0x04),
175         TCM_SERVICE_CRC_ERROR                   = R(0x05),
176         TCM_SNACK_REJECTED                      = R(0x06),
177         TCM_SECTOR_COUNT_TOO_MANY               = R(0x07),
178         TCM_INVALID_CDB_FIELD                   = R(0x08),
179         TCM_INVALID_PARAMETER_LIST              = R(0x09),
180         TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE  = R(0x0a),
181         TCM_UNKNOWN_MODE_PAGE                   = R(0x0b),
182         TCM_WRITE_PROTECTED                     = R(0x0c),
183         TCM_CHECK_CONDITION_ABORT_CMD           = R(0x0d),
184         TCM_CHECK_CONDITION_UNIT_ATTENTION      = R(0x0e),
185 
186         TCM_RESERVATION_CONFLICT                = R(0x10),
187         TCM_ADDRESS_OUT_OF_RANGE                = R(0x11),
188         TCM_OUT_OF_RESOURCES                    = R(0x12),
189         TCM_PARAMETER_LIST_LENGTH_ERROR         = R(0x13),
190         TCM_MISCOMPARE_VERIFY                   = R(0x14),
191         TCM_LOGICAL_BLOCK_GUARD_CHECK_FAILED    = R(0x15),
192         TCM_LOGICAL_BLOCK_APP_TAG_CHECK_FAILED  = R(0x16),
193         TCM_LOGICAL_BLOCK_REF_TAG_CHECK_FAILED  = R(0x17),
194         TCM_COPY_TARGET_DEVICE_NOT_REACHABLE    = R(0x18),
195         TCM_TOO_MANY_TARGET_DESCS               = R(0x19),
196         TCM_UNSUPPORTED_TARGET_DESC_TYPE_CODE   = R(0x1a),
197         TCM_TOO_MANY_SEGMENT_DESCS              = R(0x1b),
198         TCM_UNSUPPORTED_SEGMENT_DESC_TYPE_CODE  = R(0x1c),
199         TCM_INSUFFICIENT_REGISTRATION_RESOURCES = R(0x1d),
200         TCM_LUN_BUSY                            = R(0x1e),
201         TCM_INVALID_FIELD_IN_COMMAND_IU         = R(0x1f),
202         TCM_ALUA_TG_PT_STANDBY                  = R(0x20),
203         TCM_ALUA_TG_PT_UNAVAILABLE              = R(0x21),
204         TCM_ALUA_STATE_TRANSITION               = R(0x22),
205         TCM_ALUA_OFFLINE                        = R(0x23),
206 #undef R
207 };
208 
209 enum target_sc_flags_table {
210         TARGET_SCF_BIDI_OP              = 0x01,
211         TARGET_SCF_ACK_KREF             = 0x02,
212         TARGET_SCF_UNKNOWN_SIZE         = 0x04,
213         TARGET_SCF_USE_CPUID            = 0x08,
214 };
215 
216 /* fabric independent task management function values */
217 enum tcm_tmreq_table {
218         TMR_ABORT_TASK          = 1,
219         TMR_ABORT_TASK_SET      = 2,
220         TMR_CLEAR_ACA           = 3,
221         TMR_CLEAR_TASK_SET      = 4,
222         TMR_LUN_RESET           = 5,
223         TMR_TARGET_WARM_RESET   = 6,
224         TMR_TARGET_COLD_RESET   = 7,
225         TMR_LUN_RESET_PRO       = 0x80,
226         TMR_UNKNOWN             = 0xff,
227 };
228 
229 /* fabric independent task management response values */
230 enum tcm_tmrsp_table {
231         TMR_FUNCTION_FAILED             = 0,
232         TMR_FUNCTION_COMPLETE           = 1,
233         TMR_TASK_DOES_NOT_EXIST         = 2,
234         TMR_LUN_DOES_NOT_EXIST          = 3,
235         TMR_TASK_MGMT_FUNCTION_NOT_SUPPORTED    = 4,
236         TMR_FUNCTION_REJECTED           = 5,
237 };
238 
239 /*
240  * Used for target SCSI statistics
241  */
242 typedef enum {
243         SCSI_INST_INDEX,
244         SCSI_AUTH_INTR_INDEX,
245         SCSI_INDEX_TYPE_MAX
246 } scsi_index_t;
247 
248 struct se_cmd;
249 
250 struct t10_alua_lba_map_member {
251         struct list_head lba_map_mem_list;
252         int lba_map_mem_alua_state;
253         int lba_map_mem_alua_pg_id;
254 };
255 
256 struct t10_alua_lba_map {
257         u64 lba_map_first_lba;
258         u64 lba_map_last_lba;
259         struct list_head lba_map_list;
260         struct list_head lba_map_mem_list;
261 };
262 
263 struct t10_alua {
264         /* ALUA Target Port Group ID */
265         u16     alua_tg_pt_gps_counter;
266         u32     alua_tg_pt_gps_count;
267         /* Referrals support */
268         spinlock_t lba_map_lock;
269         u32     lba_map_segment_size;
270         u32     lba_map_segment_multiplier;
271         struct list_head lba_map_list;
272         spinlock_t tg_pt_gps_lock;
273         struct se_device *t10_dev;
274         /* Used for default ALUA Target Port Group */
275         struct t10_alua_tg_pt_gp *default_tg_pt_gp;
276         /* Used for default ALUA Target Port Group ConfigFS group */
277         struct config_group alua_tg_pt_gps_group;
278         struct list_head tg_pt_gps_list;
279 };
280 
281 struct t10_alua_lu_gp {
282         u16     lu_gp_id;
283         int     lu_gp_valid_id;
284         u32     lu_gp_members;
285         atomic_t lu_gp_ref_cnt;
286         spinlock_t lu_gp_lock;
287         struct config_group lu_gp_group;
288         struct list_head lu_gp_node;
289         struct list_head lu_gp_mem_list;
290 };
291 
292 struct t10_alua_lu_gp_member {
293         bool lu_gp_assoc;
294         atomic_t lu_gp_mem_ref_cnt;
295         spinlock_t lu_gp_mem_lock;
296         struct t10_alua_lu_gp *lu_gp;
297         struct se_device *lu_gp_mem_dev;
298         struct list_head lu_gp_mem_list;
299 };
300 
301 struct t10_alua_tg_pt_gp {
302         u16     tg_pt_gp_id;
303         int     tg_pt_gp_valid_id;
304         int     tg_pt_gp_alua_supported_states;
305         int     tg_pt_gp_alua_access_status;
306         int     tg_pt_gp_alua_access_type;
307         int     tg_pt_gp_nonop_delay_msecs;
308         int     tg_pt_gp_trans_delay_msecs;
309         int     tg_pt_gp_implicit_trans_secs;
310         int     tg_pt_gp_pref;
311         int     tg_pt_gp_write_metadata;
312         u32     tg_pt_gp_members;
313         int     tg_pt_gp_alua_access_state;
314         atomic_t tg_pt_gp_ref_cnt;
315         spinlock_t tg_pt_gp_lock;
316         struct mutex tg_pt_gp_transition_mutex;
317         struct se_device *tg_pt_gp_dev;
318         struct config_group tg_pt_gp_group;
319         struct list_head tg_pt_gp_list;
320         struct list_head tg_pt_gp_lun_list;
321         struct se_lun *tg_pt_gp_alua_lun;
322         struct se_node_acl *tg_pt_gp_alua_nacl;
323 };
324 
325 struct t10_vpd {
326         unsigned char device_identifier[INQUIRY_VPD_DEVICE_IDENTIFIER_LEN];
327         int protocol_identifier_set;
328         u32 protocol_identifier;
329         u32 device_identifier_code_set;
330         u32 association;
331         u32 device_identifier_type;
332         struct list_head vpd_list;
333 };
334 
335 struct t10_wwn {
336         /*
337          * SCSI left aligned strings may not be null terminated. +1 to ensure a
338          * null terminator is always present.
339          */
340         char vendor[INQUIRY_VENDOR_LEN + 1];
341         char model[INQUIRY_MODEL_LEN + 1];
342         char revision[INQUIRY_REVISION_LEN + 1];
343         char unit_serial[INQUIRY_VPD_SERIAL_LEN];
344         u32 company_id;
345         spinlock_t t10_vpd_lock;
346         struct se_device *t10_dev;
347         struct config_group t10_wwn_group;
348         struct list_head t10_vpd_list;
349 };
350 
351 struct t10_pr_registration {
352         /* Used for fabrics that contain WWN+ISID */
353 #define PR_REG_ISID_LEN                         16
354         /* PR_REG_ISID_LEN + ',i,0x' */
355 #define PR_REG_ISID_ID_LEN                      (PR_REG_ISID_LEN + 5)
356         char pr_reg_isid[PR_REG_ISID_LEN];
357         /* Used during APTPL metadata reading */
358 #define PR_APTPL_MAX_IPORT_LEN                  256
359         unsigned char pr_iport[PR_APTPL_MAX_IPORT_LEN];
360         /* Used during APTPL metadata reading */
361 #define PR_APTPL_MAX_TPORT_LEN                  256
362         unsigned char pr_tport[PR_APTPL_MAX_TPORT_LEN];
363         u16 pr_aptpl_rpti;
364         u16 pr_reg_tpgt;
365         /* Reservation effects all target ports */
366         int pr_reg_all_tg_pt;
367         /* Activate Persistence across Target Power Loss */
368         int pr_reg_aptpl;
369         int pr_res_holder;
370         int pr_res_type;
371         int pr_res_scope;
372         /* Used for fabric initiator WWPNs using a ISID */
373         bool isid_present_at_reg;
374         u64 pr_res_mapped_lun;
375         u64 pr_aptpl_target_lun;
376         u16 tg_pt_sep_rtpi;
377         u32 pr_res_generation;
378         u64 pr_reg_bin_isid;
379         u64 pr_res_key;
380         atomic_t pr_res_holders;
381         struct se_node_acl *pr_reg_nacl;
382         /* Used by ALL_TG_PT=1 registration with deve->pr_ref taken */
383         struct se_dev_entry *pr_reg_deve;
384         struct list_head pr_reg_list;
385         struct list_head pr_reg_abort_list;
386         struct list_head pr_reg_aptpl_list;
387         struct list_head pr_reg_atp_list;
388         struct list_head pr_reg_atp_mem_list;
389 };
390 
391 struct t10_reservation {
392         /* Reservation effects all target ports */
393         int pr_all_tg_pt;
394         /* Activate Persistence across Target Power Loss enabled
395          * for SCSI device */
396         int pr_aptpl_active;
397 #define PR_APTPL_BUF_LEN                        262144
398         u32 pr_generation;
399         spinlock_t registration_lock;
400         spinlock_t aptpl_reg_lock;
401         /*
402          * This will always be set by one individual I_T Nexus.
403          * However with all_tg_pt=1, other I_T Nexus from the
404          * same initiator can access PR reg/res info on a different
405          * target port.
406          *
407          * There is also the 'All Registrants' case, where there is
408          * a single *pr_res_holder of the reservation, but all
409          * registrations are considered reservation holders.
410          */
411         struct se_node_acl *pr_res_holder;
412         struct list_head registration_list;
413         struct list_head aptpl_reg_list;
414 };
415 
416 struct se_tmr_req {
417         /* Task Management function to be performed */
418         u8                      function;
419         /* Task Management response to send */
420         u8                      response;
421         int                     call_transport;
422         /* Reference to ITT that Task Mgmt should be performed */
423         u64                     ref_task_tag;
424         void                    *fabric_tmr_ptr;
425         struct se_cmd           *task_cmd;
426         struct se_device        *tmr_dev;
427         struct list_head        tmr_list;
428 };
429 
430 enum target_prot_op {
431         TARGET_PROT_NORMAL      = 0,
432         TARGET_PROT_DIN_INSERT  = (1 << 0),
433         TARGET_PROT_DOUT_INSERT = (1 << 1),
434         TARGET_PROT_DIN_STRIP   = (1 << 2),
435         TARGET_PROT_DOUT_STRIP  = (1 << 3),
436         TARGET_PROT_DIN_PASS    = (1 << 4),
437         TARGET_PROT_DOUT_PASS   = (1 << 5),
438 };
439 
440 #define TARGET_PROT_ALL TARGET_PROT_DIN_INSERT | TARGET_PROT_DOUT_INSERT | \
441                         TARGET_PROT_DIN_STRIP | TARGET_PROT_DOUT_STRIP | \
442                         TARGET_PROT_DIN_PASS | TARGET_PROT_DOUT_PASS
443 
444 enum target_prot_type {
445         TARGET_DIF_TYPE0_PROT,
446         TARGET_DIF_TYPE1_PROT,
447         TARGET_DIF_TYPE2_PROT,
448         TARGET_DIF_TYPE3_PROT,
449 };
450 
451 /* Emulation for UNIT ATTENTION Interlock Control */
452 enum target_ua_intlck_ctrl {
453         TARGET_UA_INTLCK_CTRL_CLEAR = 0,
454         TARGET_UA_INTLCK_CTRL_NO_CLEAR = 1,
455         TARGET_UA_INTLCK_CTRL_ESTABLISH_UA = 2,
456 };
457 
458 enum target_core_dif_check {
459         TARGET_DIF_CHECK_GUARD  = 0x1 << 0,
460         TARGET_DIF_CHECK_APPTAG = 0x1 << 1,
461         TARGET_DIF_CHECK_REFTAG = 0x1 << 2,
462 };
463 
464 /* for sam_task_attr */
465 #define TCM_SIMPLE_TAG  0x20
466 #define TCM_HEAD_TAG    0x21
467 #define TCM_ORDERED_TAG 0x22
468 #define TCM_ACA_TAG     0x24
469 
470 struct se_cmd {
471         /* Used for fail with specific sense codes */
472         sense_reason_t          sense_reason;
473         /* SAM response code being sent to initiator */
474         u8                      scsi_status;
475         u16                     scsi_sense_length;
476         unsigned                unknown_data_length:1;
477         bool                    state_active:1;
478         u64                     tag; /* SAM command identifier aka task tag */
479         /* Delay for ALUA Active/NonOptimized state access in milliseconds */
480         int                     alua_nonop_delay;
481         /* See include/linux/dma-mapping.h */
482         enum dma_data_direction data_direction;
483         /* For SAM Task Attribute */
484         int                     sam_task_attr;
485         /* Used for se_sess->sess_tag_pool */
486         unsigned int            map_tag;
487         int                     map_cpu;
488         /* Transport protocol dependent state, see transport_state_table */
489         enum transport_state_table t_state;
490         /* See se_cmd_flags_table */
491         u32                     se_cmd_flags;
492         /* Total size in bytes associated with command */
493         u32                     data_length;
494         u32                     residual_count;
495         u64                     orig_fe_lun;
496         /* Persistent Reservation key */
497         u64                     pr_res_key;
498         /* Used for sense data */
499         void                    *sense_buffer;
500         struct list_head        se_delayed_node;
501         struct list_head        se_qf_node;
502         struct se_device      *se_dev;
503         struct se_lun           *se_lun;
504         /* Only used for internal passthrough and legacy TCM fabric modules */
505         struct se_session       *se_sess;
506         struct target_cmd_counter *cmd_cnt;
507         struct se_tmr_req       *se_tmr_req;
508         struct llist_node       se_cmd_list;
509         struct completion       *free_compl;
510         struct completion       *abrt_compl;
511         const struct target_core_fabric_ops *se_tfo;
512         sense_reason_t          (*execute_cmd)(struct se_cmd *);
513         sense_reason_t (*transport_complete_callback)(struct se_cmd *, bool, int *);
514         void                    *protocol_data;
515 
516         unsigned char           *t_task_cdb;
517         unsigned char           __t_task_cdb[TCM_MAX_COMMAND_SIZE];
518         unsigned long long      t_task_lba;
519         unsigned int            t_task_nolb;
520         unsigned int            transport_state;
521 #define CMD_T_ABORTED           (1 << 0)
522 #define CMD_T_ACTIVE            (1 << 1)
523 #define CMD_T_COMPLETE          (1 << 2)
524 #define CMD_T_SENT              (1 << 4)
525 #define CMD_T_STOP              (1 << 5)
526 #define CMD_T_TAS               (1 << 10)
527 #define CMD_T_FABRIC_STOP       (1 << 11)
528         spinlock_t              t_state_lock;
529         struct kref             cmd_kref;
530         struct completion       t_transport_stop_comp;
531 
532         struct work_struct      work;
533 
534         struct scatterlist      *t_data_sg;
535         struct scatterlist      *t_data_sg_orig;
536         unsigned int            t_data_nents;
537         unsigned int            t_data_nents_orig;
538         void                    *t_data_vmap;
539         struct scatterlist      *t_bidi_data_sg;
540         unsigned int            t_bidi_data_nents;
541 
542         /* Used for lun->lun_ref counting */
543         int                     lun_ref_active;
544 
545         struct list_head        state_list;
546 
547         /* backend private data */
548         void                    *priv;
549 
550         /* DIF related members */
551         enum target_prot_op     prot_op;
552         enum target_prot_type   prot_type;
553         u8                      prot_checks;
554         bool                    prot_pto;
555         u32                     prot_length;
556         u32                     reftag_seed;
557         struct scatterlist      *t_prot_sg;
558         unsigned int            t_prot_nents;
559         sense_reason_t          pi_err;
560         u64                     sense_info;
561         /*
562          * CPU LIO will execute the cmd on. Defaults to the CPU the cmd is
563          * initialized on. Drivers can override.
564          */
565         int                     cpuid;
566 };
567 
568 struct se_ua {
569         u8                      ua_asc;
570         u8                      ua_ascq;
571         struct list_head        ua_nacl_list;
572 };
573 
574 struct se_node_acl {
575         char                    initiatorname[TRANSPORT_IQN_LEN];
576         /* Used to signal demo mode created ACL, disabled by default */
577         bool                    dynamic_node_acl;
578         bool                    dynamic_stop;
579         u32                     queue_depth;
580         u32                     acl_index;
581         enum target_prot_type   saved_prot_type;
582 #define MAX_ACL_TAG_SIZE 64
583         char                    acl_tag[MAX_ACL_TAG_SIZE];
584         /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
585         atomic_t                acl_pr_ref_count;
586         struct hlist_head       lun_entry_hlist;
587         struct se_session       *nacl_sess;
588         struct se_portal_group *se_tpg;
589         struct mutex            lun_entry_mutex;
590         spinlock_t              nacl_sess_lock;
591         struct config_group     acl_group;
592         struct config_group     acl_attrib_group;
593         struct config_group     acl_auth_group;
594         struct config_group     acl_param_group;
595         struct config_group     acl_fabric_stat_group;
596         struct list_head        acl_list;
597         struct list_head        acl_sess_list;
598         struct completion       acl_free_comp;
599         struct kref             acl_kref;
600 };
601 
602 static inline struct se_node_acl *acl_to_nacl(struct config_item *item)
603 {
604         return container_of(to_config_group(item), struct se_node_acl,
605                         acl_group);
606 }
607 
608 static inline struct se_node_acl *attrib_to_nacl(struct config_item *item)
609 {
610         return container_of(to_config_group(item), struct se_node_acl,
611                         acl_attrib_group);
612 }
613 
614 static inline struct se_node_acl *auth_to_nacl(struct config_item *item)
615 {
616         return container_of(to_config_group(item), struct se_node_acl,
617                         acl_auth_group);
618 }
619 
620 static inline struct se_node_acl *param_to_nacl(struct config_item *item)
621 {
622         return container_of(to_config_group(item), struct se_node_acl,
623                         acl_param_group);
624 }
625 
626 static inline struct se_node_acl *fabric_stat_to_nacl(struct config_item *item)
627 {
628         return container_of(to_config_group(item), struct se_node_acl,
629                         acl_fabric_stat_group);
630 }
631 
632 struct target_cmd_counter {
633         struct percpu_ref       refcnt;
634         wait_queue_head_t       refcnt_wq;
635         struct completion       stop_done;
636         atomic_t                stopped;
637 };
638 
639 struct se_session {
640         u64                     sess_bin_isid;
641         enum target_prot_op     sup_prot_ops;
642         enum target_prot_type   sess_prot_type;
643         struct se_node_acl      *se_node_acl;
644         struct se_portal_group *se_tpg;
645         void                    *fabric_sess_ptr;
646         struct list_head        sess_list;
647         struct list_head        sess_acl_list;
648         spinlock_t              sess_cmd_lock;
649         void                    *sess_cmd_map;
650         struct sbitmap_queue    sess_tag_pool;
651         struct target_cmd_counter *cmd_cnt;
652 };
653 
654 struct se_device;
655 struct se_transform_info;
656 struct scatterlist;
657 
658 struct se_ml_stat_grps {
659         struct config_group     stat_group;
660         struct config_group     scsi_auth_intr_group;
661         struct config_group     scsi_att_intr_port_group;
662 };
663 
664 struct se_lun_acl {
665         u64                     mapped_lun;
666         struct se_node_acl      *se_lun_nacl;
667         struct se_lun           *se_lun;
668         struct config_group     se_lun_group;
669         struct se_ml_stat_grps  ml_stat_grps;
670 };
671 
672 struct se_dev_entry {
673         u64                     mapped_lun;
674         u64                     pr_res_key;
675         u64                     creation_time;
676         bool                    lun_access_ro;
677         u32                     attach_count;
678         atomic_long_t           total_cmds;
679         atomic_long_t           read_bytes;
680         atomic_long_t           write_bytes;
681         /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
682         struct kref             pr_kref;
683         struct completion       pr_comp;
684         struct se_lun_acl       *se_lun_acl;
685         spinlock_t              ua_lock;
686         struct se_lun           *se_lun;
687 #define DEF_PR_REG_ACTIVE               1
688         unsigned long           deve_flags;
689         struct list_head        alua_port_list;
690         struct list_head        lun_link;
691         struct list_head        ua_list;
692         struct hlist_node       link;
693         struct rcu_head         rcu_head;
694 };
695 
696 struct se_dev_attrib {
697         bool            emulate_model_alias;
698         bool            emulate_dpo;            /* deprecated */
699         bool            emulate_fua_write;
700         bool            emulate_fua_read;       /* deprecated */
701         bool            emulate_write_cache;
702         enum target_ua_intlck_ctrl emulate_ua_intlck_ctrl;
703         bool            emulate_tas;
704         bool            emulate_tpu;
705         bool            emulate_tpws;
706         bool            emulate_caw;
707         bool            emulate_3pc;
708         bool            emulate_pr;
709         bool            emulate_rsoc;
710         enum target_prot_type pi_prot_type;
711         enum target_prot_type hw_pi_prot_type;
712         bool            pi_prot_verify;
713         bool            enforce_pr_isids;
714         bool            force_pr_aptpl;
715         bool            is_nonrot;
716         bool            emulate_rest_reord;
717         bool            unmap_zeroes_data;
718         u32             hw_block_size;
719         u32             block_size;
720         u32             hw_max_sectors;
721         u32             optimal_sectors;
722         u32             hw_queue_depth;
723         u32             queue_depth;
724         u32             max_unmap_lba_count;
725         u32             max_unmap_block_desc_count;
726         u32             unmap_granularity;
727         u32             unmap_granularity_alignment;
728         u32             max_write_same_len;
729         u8              submit_type;
730         struct se_device *da_dev;
731         struct config_group da_group;
732 };
733 
734 struct se_port_stat_grps {
735         struct config_group stat_group;
736         struct config_group scsi_port_group;
737         struct config_group scsi_tgt_port_group;
738         struct config_group scsi_transport_group;
739 };
740 
741 struct scsi_port_stats {
742         atomic_long_t   cmd_pdus;
743         atomic_long_t   tx_data_octets;
744         atomic_long_t   rx_data_octets;
745 };
746 
747 struct se_lun {
748         u64                     unpacked_lun;
749         bool                    lun_shutdown;
750         bool                    lun_access_ro;
751         u32                     lun_index;
752 
753         atomic_t                lun_acl_count;
754         struct se_device __rcu  *lun_se_dev;
755 
756         struct list_head        lun_deve_list;
757         spinlock_t              lun_deve_lock;
758 
759         /* ALUA state */
760         int                     lun_tg_pt_secondary_stat;
761         int                     lun_tg_pt_secondary_write_md;
762         atomic_t                lun_tg_pt_secondary_offline;
763         struct mutex            lun_tg_pt_md_mutex;
764 
765         /* ALUA target port group linkage */
766         struct list_head        lun_tg_pt_gp_link;
767         struct t10_alua_tg_pt_gp __rcu *lun_tg_pt_gp;
768         spinlock_t              lun_tg_pt_gp_lock;
769 
770         struct se_portal_group  *lun_tpg;
771         struct scsi_port_stats  lun_stats;
772         struct config_group     lun_group;
773         struct se_port_stat_grps port_stat_grps;
774         struct completion       lun_shutdown_comp;
775         struct percpu_ref       lun_ref;
776         struct list_head        lun_dev_link;
777         struct hlist_node       link;
778         struct rcu_head         rcu_head;
779 };
780 
781 struct se_dev_stat_grps {
782         struct config_group stat_group;
783         struct config_group scsi_dev_group;
784         struct config_group scsi_tgt_dev_group;
785         struct config_group scsi_lu_group;
786 };
787 
788 struct se_cmd_queue {
789         struct llist_head       cmd_list;
790         struct work_struct      work;
791 };
792 
793 struct se_dev_plug {
794         struct se_device        *se_dev;
795 };
796 
797 struct se_device_queue {
798         struct list_head        state_list;
799         spinlock_t              lock;
800         struct se_cmd_queue     sq;
801 };
802 
803 struct se_device {
804         /* Used for SAM Task Attribute ordering */
805         u32                     dev_cur_ordered_id;
806         u32                     dev_flags;
807 #define DF_CONFIGURED                           0x00000001
808 #define DF_FIRMWARE_VPD_UNIT_SERIAL             0x00000002
809 #define DF_EMULATED_VPD_UNIT_SERIAL             0x00000004
810 #define DF_USING_UDEV_PATH                      0x00000008
811 #define DF_USING_ALIAS                          0x00000010
812 #define DF_READ_ONLY                            0x00000020
813         u8                      transport_flags;
814         /* Physical device queue depth */
815         u32                     queue_depth;
816         /* Used for SPC-2 reservations enforce of ISIDs */
817         u64                     dev_res_bin_isid;
818         /* Pointer to transport specific device structure */
819         u32                     dev_index;
820         u64                     creation_time;
821         atomic_long_t           num_resets;
822         atomic_long_t           aborts_complete;
823         atomic_long_t           aborts_no_task;
824         atomic_long_t           num_cmds;
825         atomic_long_t           read_bytes;
826         atomic_long_t           write_bytes;
827         /* Active commands on this virtual SE device */
828         atomic_t                non_ordered;
829         bool                    ordered_sync_in_progress;
830         atomic_t                delayed_cmd_count;
831         atomic_t                dev_qf_count;
832         u32                     export_count;
833         spinlock_t              delayed_cmd_lock;
834         spinlock_t              dev_reservation_lock;
835         unsigned int            dev_reservation_flags;
836 #define DRF_SPC2_RESERVATIONS                   0x00000001
837 #define DRF_SPC2_RESERVATIONS_WITH_ISID         0x00000002
838         spinlock_t              se_port_lock;
839         spinlock_t              se_tmr_lock;
840         spinlock_t              qf_cmd_lock;
841         struct semaphore        caw_sem;
842         /* Used for legacy SPC-2 reservations */
843         struct se_session       *reservation_holder;
844         /* Used for ALUA Logical Unit Group membership */
845         struct t10_alua_lu_gp_member *dev_alua_lu_gp_mem;
846         /* Used for SPC-3 Persistent Reservations */
847         struct t10_pr_registration *dev_pr_res_holder;
848         struct list_head        dev_sep_list;
849         struct list_head        dev_tmr_list;
850         struct work_struct      qf_work_queue;
851         struct work_struct      delayed_cmd_work;
852         struct list_head        delayed_cmd_list;
853         struct list_head        qf_cmd_list;
854         /* Pointer to associated SE HBA */
855         struct se_hba           *se_hba;
856         /* T10 Inquiry and VPD WWN Information */
857         struct t10_wwn          t10_wwn;
858         /* T10 Asymmetric Logical Unit Assignment for Target Ports */
859         struct t10_alua         t10_alua;
860         /* T10 SPC-2 + SPC-3 Reservations */
861         struct t10_reservation  t10_pr;
862         struct se_dev_attrib    dev_attrib;
863         struct config_group     dev_action_group;
864         struct config_group     dev_group;
865         struct config_group     dev_pr_group;
866         struct se_dev_stat_grps dev_stat_grps;
867 #define SE_DEV_ALIAS_LEN 512            /* must be less than PAGE_SIZE */
868         unsigned char           dev_alias[SE_DEV_ALIAS_LEN];
869 #define SE_UDEV_PATH_LEN 512            /* must be less than PAGE_SIZE */
870         unsigned char           udev_path[SE_UDEV_PATH_LEN];
871         /* Pointer to template of function pointers for transport */
872         const struct target_backend_ops *transport;
873         struct se_lun           xcopy_lun;
874         /* Protection Information */
875         int                     prot_length;
876         /* For se_lun->lun_se_dev RCU read-side critical access */
877         u32                     hba_index;
878         struct rcu_head         rcu_head;
879         int                     queue_cnt;
880         struct se_device_queue  *queues;
881         struct mutex            lun_reset_mutex;
882 };
883 
884 struct target_opcode_descriptor {
885         u8                      support:3;
886         u8                      serv_action_valid:1;
887         u8                      opcode;
888         u16                     service_action;
889         u32                     cdb_size;
890         u8                      specific_timeout;
891         u16                     nominal_timeout;
892         u16                     recommended_timeout;
893         bool                    (*enabled)(struct target_opcode_descriptor *descr,
894                                            struct se_cmd *cmd);
895         void                    (*update_usage_bits)(u8 *usage_bits,
896                                                      struct se_device *dev);
897         u8                      usage_bits[];
898 };
899 
900 struct se_hba {
901         u16                     hba_tpgt;
902         u32                     hba_id;
903         /* See hba_flags_table */
904         u32                     hba_flags;
905         /* Virtual iSCSI devices attached. */
906         u32                     dev_count;
907         u32                     hba_index;
908         /* Pointer to transport specific host structure. */
909         void                    *hba_ptr;
910         struct list_head        hba_node;
911         spinlock_t              device_lock;
912         struct config_group     hba_group;
913         struct mutex            hba_access_mutex;
914         struct target_backend   *backend;
915 };
916 
917 struct se_tpg_np {
918         struct se_portal_group *tpg_np_parent;
919         struct config_group     tpg_np_group;
920 };
921 
922 static inline struct se_tpg_np *to_tpg_np(struct config_item *item)
923 {
924         return container_of(to_config_group(item), struct se_tpg_np,
925                         tpg_np_group);
926 }
927 
928 struct se_portal_group {
929         /*
930          * PROTOCOL IDENTIFIER value per SPC4, 7.5.1.
931          *
932          * Negative values can be used by fabric drivers for internal use TPGs.
933          */
934         int                     proto_id;
935         bool                    enabled;
936         /* RELATIVE TARGET PORT IDENTIFIER */
937         u16                     tpg_rtpi;
938         bool                    rtpi_manual;
939         /* Used for PR SPEC_I_PT=1 and REGISTER_AND_MOVE */
940         atomic_t                tpg_pr_ref_count;
941         /* Spinlock for adding/removing ACLed Nodes */
942         struct mutex            acl_node_mutex;
943         /* Spinlock for adding/removing sessions */
944         spinlock_t              session_lock;
945         struct mutex            tpg_lun_mutex;
946         /* linked list for initiator ACL list */
947         struct list_head        acl_node_list;
948         struct hlist_head       tpg_lun_hlist;
949         struct se_lun           *tpg_virt_lun0;
950         /* List of TCM sessions associated wth this TPG */
951         struct list_head        tpg_sess_list;
952         /* Pointer to $FABRIC_MOD dependent code */
953         const struct target_core_fabric_ops *se_tpg_tfo;
954         struct se_wwn           *se_tpg_wwn;
955         struct config_group     tpg_group;
956         struct config_group     tpg_lun_group;
957         struct config_group     tpg_np_group;
958         struct config_group     tpg_acl_group;
959         struct config_group     tpg_attrib_group;
960         struct config_group     tpg_auth_group;
961         struct config_group     tpg_param_group;
962 };
963 
964 static inline struct se_portal_group *to_tpg(struct config_item *item)
965 {
966         return container_of(to_config_group(item), struct se_portal_group,
967                         tpg_group);
968 }
969 
970 static inline struct se_portal_group *attrib_to_tpg(struct config_item *item)
971 {
972         return container_of(to_config_group(item), struct se_portal_group,
973                         tpg_attrib_group);
974 }
975 
976 static inline struct se_portal_group *auth_to_tpg(struct config_item *item)
977 {
978         return container_of(to_config_group(item), struct se_portal_group,
979                         tpg_auth_group);
980 }
981 
982 static inline struct se_portal_group *param_to_tpg(struct config_item *item)
983 {
984         return container_of(to_config_group(item), struct se_portal_group,
985                         tpg_param_group);
986 }
987 
988 enum {
989         /* Use se_cmd's cpuid for completion */
990         SE_COMPL_AFFINITY_CPUID         = -1,
991         /* Complete on current CPU */
992         SE_COMPL_AFFINITY_CURR_CPU      = -2,
993 };
994 
995 struct se_wwn {
996         struct target_fabric_configfs *wwn_tf;
997         void                    *priv;
998         struct config_group     wwn_group;
999         struct config_group     fabric_stat_group;
1000         struct config_group     param_group;
1001         int                     cmd_compl_affinity;
1002 };
1003 
1004 static inline void atomic_inc_mb(atomic_t *v)
1005 {
1006         smp_mb__before_atomic();
1007         atomic_inc(v);
1008         smp_mb__after_atomic();
1009 }
1010 
1011 static inline void atomic_dec_mb(atomic_t *v)
1012 {
1013         smp_mb__before_atomic();
1014         atomic_dec(v);
1015         smp_mb__after_atomic();
1016 }
1017 
1018 static inline void target_free_tag(struct se_session *sess, struct se_cmd *cmd)
1019 {
1020         sbitmap_queue_clear(&sess->sess_tag_pool, cmd->map_tag, cmd->map_cpu);
1021 }
1022 
1023 #endif /* TARGET_CORE_BASE_H */
1024 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php