Blame view

include/target/target_core_transport.h 9.99 KB
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
1
2
3
4
5
6
7
8
9
10
11
  #ifndef TARGET_CORE_TRANSPORT_H
  #define TARGET_CORE_TRANSPORT_H
  
  #define TARGET_CORE_VERSION			TARGET_CORE_MOD_VERSION
  
  /* Attempts before moving from SHORT to LONG */
  #define PYX_TRANSPORT_WINDOW_CLOSED_THRESHOLD	3
  #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_SHORT	3  /* In milliseconds */
  #define PYX_TRANSPORT_WINDOW_CLOSED_WAIT_LONG	10 /* In milliseconds */
  
  #define PYX_TRANSPORT_STATUS_INTERVAL		5 /* In seconds */
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
12
13
14
  #define TRANSPORT_PLUGIN_PHBA_PDEV		1
  #define TRANSPORT_PLUGIN_VHBA_PDEV		2
  #define TRANSPORT_PLUGIN_VHBA_VDEV		3
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
  /*
   * struct se_subsystem_dev->su_dev_flags
  */
  #define SDF_FIRMWARE_VPD_UNIT_SERIAL		0x00000001
  #define SDF_EMULATED_VPD_UNIT_SERIAL		0x00000002
  #define SDF_USING_UDEV_PATH			0x00000004
  #define SDF_USING_ALIAS				0x00000008
  
  /*
   * struct se_device->dev_flags
   */
  #define DF_READ_ONLY				0x00000001
  #define DF_SPC2_RESERVATIONS			0x00000002
  #define DF_SPC2_RESERVATIONS_WITH_ISID		0x00000004
  
  /* struct se_dev_attrib sanity values */
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  /* Default max_unmap_lba_count */
  #define DA_MAX_UNMAP_LBA_COUNT			0
  /* Default max_unmap_block_desc_count */
  #define DA_MAX_UNMAP_BLOCK_DESC_COUNT		0
  /* Default unmap_granularity */
  #define DA_UNMAP_GRANULARITY_DEFAULT		0
  /* Default unmap_granularity_alignment */
  #define DA_UNMAP_GRANULARITY_ALIGNMENT_DEFAULT	0
  /* Emulation for Direct Page Out */
  #define DA_EMULATE_DPO				0
  /* Emulation for Forced Unit Access WRITEs */
  #define DA_EMULATE_FUA_WRITE			1
  /* Emulation for Forced Unit Access READs */
  #define DA_EMULATE_FUA_READ			0
  /* Emulation for WriteCache and SYNCHRONIZE_CACHE */
  #define DA_EMULATE_WRITE_CACHE			0
  /* Emulation for UNIT ATTENTION Interlock Control */
  #define DA_EMULATE_UA_INTLLCK_CTRL		0
  /* Emulation for TASK_ABORTED status (TAS) by default */
  #define DA_EMULATE_TAS				1
  /* Emulation for Thin Provisioning UNMAP using block/blk-lib.c:blkdev_issue_discard() */
  #define DA_EMULATE_TPU				0
  /*
   * Emulation for Thin Provisioning WRITE_SAME w/ UNMAP=1 bit using
   * block/blk-lib.c:blkdev_issue_discard()
   */
  #define DA_EMULATE_TPWS				0
  /* No Emulation for PSCSI by default */
  #define DA_EMULATE_RESERVATIONS			0
  /* No Emulation for PSCSI by default */
  #define DA_EMULATE_ALUA				0
  /* Enforce SCSI Initiator Port TransportID with 'ISID' for PR */
  #define DA_ENFORCE_PR_ISIDS			1
  #define DA_STATUS_MAX_SECTORS_MIN		16
  #define DA_STATUS_MAX_SECTORS_MAX		8192
e22a7f075   Roland Dreier   target: Implement...
66
67
  /* By default don't report non-rotating (solid state) medium */
  #define DA_IS_NONROT				0
5de619a31   Nicholas Bellinger   target: Update QU...
68
69
  /* Queue Algorithm Modifier default for restricted reordering in control mode page */
  #define DA_EMULATE_REST_REORD			0
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
70
71
72
73
  
  #define SE_MODE_PAGE_BUF			512
  
  #define MOD_MAX_SECTORS(ms, bs)			(ms % (PAGE_SIZE / bs))
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
74
  struct se_subsystem_api;
e3d6f909e   Andy Grover   target: Core clea...
75
76
  extern int init_se_kmem_caches(void);
  extern void release_se_kmem_caches(void);
e89d15eea   Nicholas Bellinger   [SCSI] target: Re...
77
  extern u32 scsi_get_new_index(scsi_index_t);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
78
  extern void transport_init_queue_obj(struct se_queue_obj *);
dbc5623eb   Nicholas Bellinger   target: transport...
79
  extern void transport_subsystem_check_init(void);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  extern int transport_subsystem_register(struct se_subsystem_api *);
  extern void transport_subsystem_release(struct se_subsystem_api *);
  extern void transport_load_plugins(void);
  extern struct se_session *transport_init_session(void);
  extern void __transport_register_session(struct se_portal_group *,
  					struct se_node_acl *,
  					struct se_session *, void *);
  extern void transport_register_session(struct se_portal_group *,
  					struct se_node_acl *,
  					struct se_session *, void *);
  extern void transport_free_session(struct se_session *);
  extern void transport_deregister_session_configfs(struct se_session *);
  extern void transport_deregister_session(struct se_session *);
  extern void transport_cmd_finish_abort(struct se_cmd *, int);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
94
95
96
97
98
  extern void transport_complete_sync_cache(struct se_cmd *, int);
  extern void transport_complete_task(struct se_task *, int);
  extern void transport_add_task_to_execute_queue(struct se_task *,
  						struct se_task *,
  						struct se_device *);
52208ae3f   Nicholas Bellinger   [SCSI] target: Fi...
99
100
  extern void transport_remove_task_from_execute_queue(struct se_task *,
  						struct se_device *);
04629b7bd   Christoph Hellwig   target: Remove un...
101
102
  extern void __transport_remove_task_from_execute_queue(struct se_task *,
  						struct se_device *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  unsigned char *transport_dump_cmd_direction(struct se_cmd *);
  extern void transport_dump_dev_state(struct se_device *, char *, int *);
  extern void transport_dump_dev_info(struct se_device *, struct se_lun *,
  					unsigned long long, char *, int *);
  extern void transport_dump_vpd_proto_id(struct t10_vpd *,
  					unsigned char *, int);
  extern void transport_set_vpd_proto_id(struct t10_vpd *, unsigned char *);
  extern int transport_dump_vpd_assoc(struct t10_vpd *,
  					unsigned char *, int);
  extern int transport_set_vpd_assoc(struct t10_vpd *, unsigned char *);
  extern int transport_dump_vpd_ident_type(struct t10_vpd *,
  					unsigned char *, int);
  extern int transport_set_vpd_ident_type(struct t10_vpd *, unsigned char *);
  extern int transport_dump_vpd_ident(struct t10_vpd *,
  					unsigned char *, int);
  extern int transport_set_vpd_ident(struct t10_vpd *, unsigned char *);
  extern struct se_device *transport_add_device_to_core_hba(struct se_hba *,
  					struct se_subsystem_api *,
  					struct se_subsystem_dev *, u32,
  					void *, struct se_dev_limits *,
  					const char *, const char *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
124
125
126
127
  extern void transport_init_se_cmd(struct se_cmd *,
  					struct target_core_fabric_ops *,
  					struct se_session *, u32, int, int,
  					unsigned char *);
05d1c7c0d   Andy Grover   target: Make all ...
128
129
  void *transport_kmap_first_data_page(struct se_cmd *cmd);
  void transport_kunmap_first_data_page(struct se_cmd *cmd);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
130
  extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *);
695434e1c   Nicholas Bellinger   target: Add trans...
131
  extern int transport_handle_cdb_direct(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
132
133
  extern int transport_generic_handle_cdb_map(struct se_cmd *);
  extern int transport_generic_handle_data(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
134
  extern int transport_generic_handle_tmr(struct se_cmd *);
cdbb70bb4   Christoph Hellwig   target: factor so...
135
  extern bool target_stop_task(struct se_task *task, unsigned long *flags);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
136
137
138
  extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32,
  				struct scatterlist *, u32);
  extern int transport_clear_lun_from_sessions(struct se_lun *);
a17f091d1   Nicholas Bellinger   target: Add gener...
139
  extern bool transport_wait_for_tasks(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
140
141
142
  extern int transport_check_aborted_status(struct se_cmd *, int);
  extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int);
  extern void transport_send_task_abort(struct se_cmd *);
35462975b   Christoph Hellwig   target: merge rel...
143
  extern void transport_release_cmd(struct se_cmd *);
39c05f321   Nicholas Bellinger   target: Remove se...
144
  extern void transport_generic_free_cmd(struct se_cmd *, int);
a17f091d1   Nicholas Bellinger   target: Add gener...
145
146
147
148
  extern void target_get_sess_cmd(struct se_session *, struct se_cmd *);
  extern int target_put_sess_cmd(struct se_session *, struct se_cmd *);
  extern void target_splice_sess_cmd_list(struct se_session *);
  extern void target_wait_for_sess_cmds(struct se_session *, int);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
149
  extern void transport_generic_wait_for_cmds(struct se_cmd *, int);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
150
151
  extern void transport_do_task_sg_chain(struct se_cmd *);
  extern void transport_generic_process_write(struct se_cmd *);
a1d8b49ab   Andy Grover   target: Updates f...
152
  extern int transport_generic_new_cmd(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
153
154
155
  extern int transport_generic_do_tmr(struct se_cmd *);
  /* From target_core_alua.c */
  extern int core_alua_check_nonop_delay(struct se_cmd *);
5dd7ed2e8   Dan Carpenter   [SCSI] target: Mi...
156
157
  /* From target_core_cdb.c */
  extern int transport_emulate_control_cdb(struct se_task *);
485fd0d1e   Christoph Hellwig   target: replace -...
158
  extern void target_get_task_cdb(struct se_task *task, unsigned char *cdb);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
  
  /*
   * Each se_transport_task_t can have N number of possible struct se_task's
   * for the storage transport(s) to possibly execute.
   * Used primarily for splitting up CDBs that exceed the physical storage
   * HBA's maximum sector count per task.
   */
  struct se_mem {
  	struct page	*se_page;
  	u32		se_len;
  	u32		se_off;
  	struct list_head se_list;
  } ____cacheline_aligned;
  
  /*
   * 	Each type of disk transport supported MUST have a template defined
   *	within its .h file.
   */
  struct se_subsystem_api {
  	/*
  	 * The Name. :-)
  	 */
  	char name[16];
  	/*
  	 * Transport Type.
  	 */
  	u8 transport_type;
f55918fa3   Christoph Hellwig   target: clean up ...
186
187
188
  
  	unsigned int fua_write_emulated : 1;
  	unsigned int write_cache_emulated : 1;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
189
190
191
192
193
194
195
196
197
  	/*
  	 * struct module for struct se_hba references
  	 */
  	struct module *owner;
  	/*
  	 * Used for global se_subsystem_api list_head
  	 */
  	struct list_head sub_api_list;
  	/*
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  	 * attach_hba():
  	 */
  	int (*attach_hba)(struct se_hba *, u32);
  	/*
  	 * detach_hba():
  	 */
  	void (*detach_hba)(struct se_hba *);
  	/*
  	 * pmode_hba(): Used for TCM/pSCSI subsystem plugin HBA ->
  	 *		Linux/SCSI struct Scsi_Host passthrough
  	*/
  	int (*pmode_enable_hba)(struct se_hba *, unsigned long);
  	/*
  	 * allocate_virtdevice():
  	 */
  	void *(*allocate_virtdevice)(struct se_hba *, const char *);
  	/*
  	 * create_virtdevice(): Only for Virtual HBAs
  	 */
  	struct se_device *(*create_virtdevice)(struct se_hba *,
  				struct se_subsystem_dev *, void *);
  	/*
  	 * free_device():
  	 */
  	void (*free_device)(void *);
  
  	/*
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
225
226
227
228
229
230
  	 * transport_complete():
  	 *
  	 * Use transport_generic_complete() for majority of DAS transport
  	 * drivers.  Provided out of convenience.
  	 */
  	int (*transport_complete)(struct se_task *task);
6708bb27b   Andy Grover   target: Follow up...
231
  	struct se_task *(*alloc_task)(unsigned char *cdb);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
  	/*
  	 * do_task():
  	 */
  	int (*do_task)(struct se_task *);
  	/*
  	 * Used by virtual subsystem plugins IBLOCK and FILEIO to emulate
  	 * UNMAP and WRITE_SAME_* w/ UNMAP=1 <-> Linux/Block Discard
  	 */
  	int (*do_discard)(struct se_device *, sector_t, u32);
  	/*
  	 * Used  by virtual subsystem plugins IBLOCK and FILEIO to emulate
  	 * SYNCHRONIZE_CACHE_* <-> Linux/Block blkdev_issue_flush()
  	 */
  	void (*do_sync_cache)(struct se_task *);
  	/*
  	 * free_task():
  	 */
  	void (*free_task)(struct se_task *);
  	/*
  	 * check_configfs_dev_params():
  	 */
  	ssize_t (*check_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *);
  	/*
  	 * set_configfs_dev_params():
  	 */
  	ssize_t (*set_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,
  						const char *, ssize_t);
  	/*
  	 * show_configfs_dev_params():
  	 */
  	ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,
  						char *);
  	/*
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
265
266
267
268
269
270
271
272
273
274
275
276
  	 * get_device_rev():
  	 */
  	u32 (*get_device_rev)(struct se_device *);
  	/*
  	 * get_device_type():
  	 */
  	u32 (*get_device_type)(struct se_device *);
  	/*
  	 * Get the sector_t from a subsystem backstore..
  	 */
  	sector_t (*get_blocks)(struct se_device *);
  	/*
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
277
278
279
280
  	 * get_sense_buffer():
  	 */
  	unsigned char *(*get_sense_buffer)(struct se_task *);
  } ____cacheline_aligned;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
281
  #endif /* TARGET_CORE_TRANSPORT_H */