aboutsummaryrefslogtreecommitdiffstats
path: root/include/target
diff options
context:
space:
mode:
Diffstat (limited to 'include/target')
-rw-r--r--include/target/target_core_base.h71
-rw-r--r--include/target/target_core_tmr.h2
-rw-r--r--include/target/target_core_transport.h75
3 files changed, 36 insertions, 112 deletions
diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
index 27040653005..35aa786f93d 100644
--- a/include/target/target_core_base.h
+++ b/include/target/target_core_base.h
@@ -10,10 +10,7 @@
10#include <net/tcp.h> 10#include <net/tcp.h>
11 11
12#define TARGET_CORE_MOD_VERSION "v4.1.0-rc1-ml" 12#define TARGET_CORE_MOD_VERSION "v4.1.0-rc1-ml"
13#define SHUTDOWN_SIGS (sigmask(SIGKILL)|sigmask(SIGINT)|sigmask(SIGABRT))
14 13
15/* Used by transport_generic_allocate_iovecs() */
16#define TRANSPORT_IOV_DATA_BUFFER 5
17/* Maximum Number of LUNs per Target Portal Group */ 14/* Maximum Number of LUNs per Target Portal Group */
18/* Don't raise above 511 or REPORT_LUNS needs to handle >1 page */ 15/* Don't raise above 511 or REPORT_LUNS needs to handle >1 page */
19#define TRANSPORT_MAX_LUNS_PER_TPG 256 16#define TRANSPORT_MAX_LUNS_PER_TPG 256
@@ -75,32 +72,26 @@ enum transport_tpg_type_table {
75}; 72};
76 73
77/* Used for generate timer flags */ 74/* Used for generate timer flags */
78enum timer_flags_table { 75enum se_task_flags {
79 TF_RUNNING = 0x01, 76 TF_ACTIVE = (1 << 0),
80 TF_STOP = 0x02, 77 TF_SENT = (1 << 1),
78 TF_REQUEST_STOP = (1 << 2),
81}; 79};
82 80
83/* Special transport agnostic struct se_cmd->t_states */ 81/* Special transport agnostic struct se_cmd->t_states */
84enum transport_state_table { 82enum transport_state_table {
85 TRANSPORT_NO_STATE = 0, 83 TRANSPORT_NO_STATE = 0,
86 TRANSPORT_NEW_CMD = 1, 84 TRANSPORT_NEW_CMD = 1,
87 TRANSPORT_DEFERRED_CMD = 2,
88 TRANSPORT_WRITE_PENDING = 3, 85 TRANSPORT_WRITE_PENDING = 3,
89 TRANSPORT_PROCESS_WRITE = 4, 86 TRANSPORT_PROCESS_WRITE = 4,
90 TRANSPORT_PROCESSING = 5, 87 TRANSPORT_PROCESSING = 5,
91 TRANSPORT_COMPLETE_OK = 6, 88 TRANSPORT_COMPLETE = 6,
92 TRANSPORT_COMPLETE_FAILURE = 7,
93 TRANSPORT_COMPLETE_TIMEOUT = 8,
94 TRANSPORT_PROCESS_TMR = 9, 89 TRANSPORT_PROCESS_TMR = 9,
95 TRANSPORT_TMR_COMPLETE = 10,
96 TRANSPORT_ISTATE_PROCESSING = 11, 90 TRANSPORT_ISTATE_PROCESSING = 11,
97 TRANSPORT_ISTATE_PROCESSED = 12,
98 TRANSPORT_KILL = 13,
99 TRANSPORT_REMOVE = 14,
100 TRANSPORT_FREE = 15,
101 TRANSPORT_NEW_CMD_MAP = 16, 91 TRANSPORT_NEW_CMD_MAP = 16,
102 TRANSPORT_FREE_CMD_INTR = 17, 92 TRANSPORT_FREE_CMD_INTR = 17,
103 TRANSPORT_COMPLETE_QF_WP = 18, 93 TRANSPORT_COMPLETE_QF_WP = 18,
94 TRANSPORT_COMPLETE_QF_OK = 19,
104}; 95};
105 96
106/* Used for struct se_cmd->se_cmd_flags */ 97/* Used for struct se_cmd->se_cmd_flags */
@@ -125,7 +116,6 @@ enum se_cmd_flags_table {
125 SCF_UNUSED = 0x00100000, 116 SCF_UNUSED = 0x00100000,
126 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000, 117 SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC = 0x00400000,
127 SCF_EMULATE_CDB_ASYNC = 0x01000000, 118 SCF_EMULATE_CDB_ASYNC = 0x01000000,
128 SCF_EMULATE_QUEUE_FULL = 0x02000000,
129}; 119};
130 120
131/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */ 121/* struct se_dev_entry->lun_flags and struct se_lun->lun_access */
@@ -401,34 +391,22 @@ struct se_queue_obj {
401} ____cacheline_aligned; 391} ____cacheline_aligned;
402 392
403struct se_task { 393struct se_task {
404 unsigned char task_sense;
405 struct scatterlist *task_sg;
406 u32 task_sg_nents;
407 struct scatterlist *task_sg_bidi;
408 u8 task_scsi_status;
409 u8 task_flags;
410 int task_error_status;
411 int task_state_flags;
412 bool task_padded_sg;
413 unsigned long long task_lba; 394 unsigned long long task_lba;
414 u32 task_no; 395 u32 task_sectors;
415 u32 task_sectors; 396 u32 task_size;
416 u32 task_size; 397 struct se_cmd *task_se_cmd;
398 struct scatterlist *task_sg;
399 u32 task_sg_nents;
400 u16 task_flags;
401 u8 task_sense;
402 u8 task_scsi_status;
403 int task_error_status;
417 enum dma_data_direction task_data_direction; 404 enum dma_data_direction task_data_direction;
418 struct se_cmd *task_se_cmd; 405 atomic_t task_state_active;
419 struct se_device *se_dev; 406 struct list_head t_list;
407 struct list_head t_execute_list;
408 struct list_head t_state_list;
420 struct completion task_stop_comp; 409 struct completion task_stop_comp;
421 atomic_t task_active;
422 atomic_t task_execute_queue;
423 atomic_t task_timeout;
424 atomic_t task_sent;
425 atomic_t task_stop;
426 atomic_t task_state_active;
427 struct timer_list task_timer;
428 struct se_device *se_obj_ptr;
429 struct list_head t_list;
430 struct list_head t_execute_list;
431 struct list_head t_state_list;
432} ____cacheline_aligned; 410} ____cacheline_aligned;
433 411
434struct se_cmd { 412struct se_cmd {
@@ -446,8 +424,6 @@ struct se_cmd {
446 int sam_task_attr; 424 int sam_task_attr;
447 /* Transport protocol dependent state, see transport_state_table */ 425 /* Transport protocol dependent state, see transport_state_table */
448 enum transport_state_table t_state; 426 enum transport_state_table t_state;
449 /* Transport protocol dependent state for out of order CmdSNs */
450 int deferred_t_state;
451 /* Transport specific error status */ 427 /* Transport specific error status */
452 int transport_error_status; 428 int transport_error_status;
453 /* See se_cmd_flags_table */ 429 /* See se_cmd_flags_table */
@@ -461,7 +437,6 @@ struct se_cmd {
461 u32 orig_fe_lun; 437 u32 orig_fe_lun;
462 /* Persistent Reservation key */ 438 /* Persistent Reservation key */
463 u64 pr_res_key; 439 u64 pr_res_key;
464 atomic_t transport_sent;
465 /* Used for sense data */ 440 /* Used for sense data */
466 void *sense_buffer; 441 void *sense_buffer;
467 struct list_head se_delayed_node; 442 struct list_head se_delayed_node;
@@ -479,10 +454,7 @@ struct se_cmd {
479 struct list_head se_queue_node; 454 struct list_head se_queue_node;
480 struct target_core_fabric_ops *se_tfo; 455 struct target_core_fabric_ops *se_tfo;
481 int (*transport_emulate_cdb)(struct se_cmd *); 456 int (*transport_emulate_cdb)(struct se_cmd *);
482 void (*transport_split_cdb)(unsigned long long, u32, unsigned char *);
483 void (*transport_wait_for_tasks)(struct se_cmd *, int, int);
484 void (*transport_complete_callback)(struct se_cmd *); 457 void (*transport_complete_callback)(struct se_cmd *);
485 int (*transport_qf_callback)(struct se_cmd *);
486 458
487 unsigned char *t_task_cdb; 459 unsigned char *t_task_cdb;
488 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE]; 460 unsigned char __t_task_cdb[TCM_MAX_COMMAND_SIZE];
@@ -495,7 +467,6 @@ struct se_cmd {
495 atomic_t t_se_count; 467 atomic_t t_se_count;
496 atomic_t t_task_cdbs_left; 468 atomic_t t_task_cdbs_left;
497 atomic_t t_task_cdbs_ex_left; 469 atomic_t t_task_cdbs_ex_left;
498 atomic_t t_task_cdbs_timeout_left;
499 atomic_t t_task_cdbs_sent; 470 atomic_t t_task_cdbs_sent;
500 atomic_t t_transport_aborted; 471 atomic_t t_transport_aborted;
501 atomic_t t_transport_active; 472 atomic_t t_transport_active;
@@ -503,7 +474,6 @@ struct se_cmd {
503 atomic_t t_transport_queue_active; 474 atomic_t t_transport_queue_active;
504 atomic_t t_transport_sent; 475 atomic_t t_transport_sent;
505 atomic_t t_transport_stop; 476 atomic_t t_transport_stop;
506 atomic_t t_transport_timeout;
507 atomic_t transport_dev_active; 477 atomic_t transport_dev_active;
508 atomic_t transport_lun_active; 478 atomic_t transport_lun_active;
509 atomic_t transport_lun_fe_stop; 479 atomic_t transport_lun_fe_stop;
@@ -514,6 +484,8 @@ struct se_cmd {
514 struct completion transport_lun_stop_comp; 484 struct completion transport_lun_stop_comp;
515 struct scatterlist *t_tasks_sg_chained; 485 struct scatterlist *t_tasks_sg_chained;
516 486
487 struct work_struct work;
488
517 /* 489 /*
518 * Used for pre-registered fabric SGL passthrough WRITE and READ 490 * Used for pre-registered fabric SGL passthrough WRITE and READ
519 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop 491 * with the special SCF_PASSTHROUGH_CONTIG_TO_SG case for TCM_Loop
@@ -670,7 +642,6 @@ struct se_dev_attrib {
670 u32 optimal_sectors; 642 u32 optimal_sectors;
671 u32 hw_queue_depth; 643 u32 hw_queue_depth;
672 u32 queue_depth; 644 u32 queue_depth;
673 u32 task_timeout;
674 u32 max_unmap_lba_count; 645 u32 max_unmap_lba_count;
675 u32 max_unmap_block_desc_count; 646 u32 max_unmap_block_desc_count;
676 u32 unmap_granularity; 647 u32 unmap_granularity;
diff --git a/include/target/target_core_tmr.h b/include/target/target_core_tmr.h
index bd559680747..d5876e17d3f 100644
--- a/include/target/target_core_tmr.h
+++ b/include/target/target_core_tmr.h
@@ -27,7 +27,7 @@ enum tcm_tmrsp_table {
27 27
28extern struct kmem_cache *se_tmr_req_cache; 28extern struct kmem_cache *se_tmr_req_cache;
29 29
30extern struct se_tmr_req *core_tmr_alloc_req(struct se_cmd *, void *, u8); 30extern struct se_tmr_req *core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t);
31extern void core_tmr_release_req(struct se_tmr_req *); 31extern void core_tmr_release_req(struct se_tmr_req *);
32extern int core_tmr_lun_reset(struct se_device *, struct se_tmr_req *, 32extern int core_tmr_lun_reset(struct se_device *, struct se_tmr_req *,
33 struct list_head *, struct se_cmd *); 33 struct list_head *, struct se_cmd *);
diff --git a/include/target/target_core_transport.h b/include/target/target_core_transport.h
index 46aae4f94ed..a037a1a6fbb 100644
--- a/include/target/target_core_transport.h
+++ b/include/target/target_core_transport.h
@@ -22,10 +22,9 @@
22#define PYX_TRANSPORT_LU_COMM_FAILURE -7 22#define PYX_TRANSPORT_LU_COMM_FAILURE -7
23#define PYX_TRANSPORT_UNKNOWN_MODE_PAGE -8 23#define PYX_TRANSPORT_UNKNOWN_MODE_PAGE -8
24#define PYX_TRANSPORT_WRITE_PROTECTED -9 24#define PYX_TRANSPORT_WRITE_PROTECTED -9
25#define PYX_TRANSPORT_TASK_TIMEOUT -10 25#define PYX_TRANSPORT_RESERVATION_CONFLICT -10
26#define PYX_TRANSPORT_RESERVATION_CONFLICT -11 26#define PYX_TRANSPORT_ILLEGAL_REQUEST -11
27#define PYX_TRANSPORT_ILLEGAL_REQUEST -12 27#define PYX_TRANSPORT_USE_SENSE_REASON -12
28#define PYX_TRANSPORT_USE_SENSE_REASON -13
29 28
30#ifndef SAM_STAT_RESERVATION_CONFLICT 29#ifndef SAM_STAT_RESERVATION_CONFLICT
31#define SAM_STAT_RESERVATION_CONFLICT 0x18 30#define SAM_STAT_RESERVATION_CONFLICT 0x18
@@ -38,16 +37,6 @@
38#define TRANSPORT_PLUGIN_VHBA_PDEV 2 37#define TRANSPORT_PLUGIN_VHBA_PDEV 2
39#define TRANSPORT_PLUGIN_VHBA_VDEV 3 38#define TRANSPORT_PLUGIN_VHBA_VDEV 3
40 39
41/* For SE OBJ Plugins, in seconds */
42#define TRANSPORT_TIMEOUT_TUR 10
43#define TRANSPORT_TIMEOUT_TYPE_DISK 60
44#define TRANSPORT_TIMEOUT_TYPE_ROM 120
45#define TRANSPORT_TIMEOUT_TYPE_TAPE 600
46#define TRANSPORT_TIMEOUT_TYPE_OTHER 300
47
48/* For se_task->task_state_flags */
49#define TSF_EXCEPTION_CLEARED 0x01
50
51/* 40/*
52 * struct se_subsystem_dev->su_dev_flags 41 * struct se_subsystem_dev->su_dev_flags
53*/ 42*/
@@ -64,8 +53,6 @@
64#define DF_SPC2_RESERVATIONS_WITH_ISID 0x00000004 53#define DF_SPC2_RESERVATIONS_WITH_ISID 0x00000004
65 54
66/* struct se_dev_attrib sanity values */ 55/* struct se_dev_attrib sanity values */
67/* 10 Minutes */
68#define DA_TASK_TIMEOUT_MAX 600
69/* Default max_unmap_lba_count */ 56/* Default max_unmap_lba_count */
70#define DA_MAX_UNMAP_LBA_COUNT 0 57#define DA_MAX_UNMAP_LBA_COUNT 0
71/* Default max_unmap_block_desc_count */ 58/* Default max_unmap_block_desc_count */
@@ -110,16 +97,13 @@
110 97
111#define MOD_MAX_SECTORS(ms, bs) (ms % (PAGE_SIZE / bs)) 98#define MOD_MAX_SECTORS(ms, bs) (ms % (PAGE_SIZE / bs))
112 99
113struct se_mem;
114struct se_subsystem_api; 100struct se_subsystem_api;
115 101
116extern struct kmem_cache *se_mem_cache;
117
118extern int init_se_kmem_caches(void); 102extern int init_se_kmem_caches(void);
119extern void release_se_kmem_caches(void); 103extern void release_se_kmem_caches(void);
120extern u32 scsi_get_new_index(scsi_index_t); 104extern u32 scsi_get_new_index(scsi_index_t);
121extern void transport_init_queue_obj(struct se_queue_obj *); 105extern void transport_init_queue_obj(struct se_queue_obj *);
122extern int transport_subsystem_check_init(void); 106extern void transport_subsystem_check_init(void);
123extern int transport_subsystem_register(struct se_subsystem_api *); 107extern int transport_subsystem_register(struct se_subsystem_api *);
124extern void transport_subsystem_release(struct se_subsystem_api *); 108extern void transport_subsystem_release(struct se_subsystem_api *);
125extern void transport_load_plugins(void); 109extern void transport_load_plugins(void);
@@ -134,7 +118,6 @@ extern void transport_free_session(struct se_session *);
134extern void transport_deregister_session_configfs(struct se_session *); 118extern void transport_deregister_session_configfs(struct se_session *);
135extern void transport_deregister_session(struct se_session *); 119extern void transport_deregister_session(struct se_session *);
136extern void transport_cmd_finish_abort(struct se_cmd *, int); 120extern void transport_cmd_finish_abort(struct se_cmd *, int);
137extern void transport_cmd_finish_abort_tmr(struct se_cmd *);
138extern void transport_complete_sync_cache(struct se_cmd *, int); 121extern void transport_complete_sync_cache(struct se_cmd *, int);
139extern void transport_complete_task(struct se_task *, int); 122extern void transport_complete_task(struct se_task *, int);
140extern void transport_add_task_to_execute_queue(struct se_task *, 123extern void transport_add_task_to_execute_queue(struct se_task *,
@@ -142,6 +125,8 @@ extern void transport_add_task_to_execute_queue(struct se_task *,
142 struct se_device *); 125 struct se_device *);
143extern void transport_remove_task_from_execute_queue(struct se_task *, 126extern void transport_remove_task_from_execute_queue(struct se_task *,
144 struct se_device *); 127 struct se_device *);
128extern void __transport_remove_task_from_execute_queue(struct se_task *,
129 struct se_device *);
145unsigned char *transport_dump_cmd_direction(struct se_cmd *); 130unsigned char *transport_dump_cmd_direction(struct se_cmd *);
146extern void transport_dump_dev_state(struct se_device *, char *, int *); 131extern void transport_dump_dev_state(struct se_device *, char *, int *);
147extern void transport_dump_dev_info(struct se_device *, struct se_lun *, 132extern void transport_dump_dev_info(struct se_device *, struct se_lun *,
@@ -169,29 +154,24 @@ extern void transport_init_se_cmd(struct se_cmd *,
169 unsigned char *); 154 unsigned char *);
170void *transport_kmap_first_data_page(struct se_cmd *cmd); 155void *transport_kmap_first_data_page(struct se_cmd *cmd);
171void transport_kunmap_first_data_page(struct se_cmd *cmd); 156void transport_kunmap_first_data_page(struct se_cmd *cmd);
172extern void transport_free_se_cmd(struct se_cmd *);
173extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *); 157extern int transport_generic_allocate_tasks(struct se_cmd *, unsigned char *);
174extern int transport_generic_handle_cdb(struct se_cmd *);
175extern int transport_handle_cdb_direct(struct se_cmd *); 158extern int transport_handle_cdb_direct(struct se_cmd *);
176extern int transport_generic_handle_cdb_map(struct se_cmd *); 159extern int transport_generic_handle_cdb_map(struct se_cmd *);
177extern int transport_generic_handle_data(struct se_cmd *); 160extern int transport_generic_handle_data(struct se_cmd *);
178extern void transport_new_cmd_failure(struct se_cmd *); 161extern void transport_new_cmd_failure(struct se_cmd *);
179extern int transport_generic_handle_tmr(struct se_cmd *); 162extern int transport_generic_handle_tmr(struct se_cmd *);
180extern void transport_generic_free_cmd_intr(struct se_cmd *); 163extern void transport_generic_free_cmd_intr(struct se_cmd *);
181extern void __transport_stop_task_timer(struct se_task *, unsigned long *); 164extern bool target_stop_task(struct se_task *task, unsigned long *flags);
182extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32, 165extern int transport_generic_map_mem_to_cmd(struct se_cmd *cmd, struct scatterlist *, u32,
183 struct scatterlist *, u32); 166 struct scatterlist *, u32);
184extern int transport_clear_lun_from_sessions(struct se_lun *); 167extern int transport_clear_lun_from_sessions(struct se_lun *);
168extern void transport_wait_for_tasks(struct se_cmd *);
185extern int transport_check_aborted_status(struct se_cmd *, int); 169extern int transport_check_aborted_status(struct se_cmd *, int);
186extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int); 170extern int transport_send_check_condition_and_sense(struct se_cmd *, u8, int);
187extern void transport_send_task_abort(struct se_cmd *); 171extern void transport_send_task_abort(struct se_cmd *);
188extern void transport_release_cmd(struct se_cmd *); 172extern void transport_release_cmd(struct se_cmd *);
189extern void transport_generic_free_cmd(struct se_cmd *, int, int); 173extern void transport_generic_free_cmd(struct se_cmd *, int);
190extern void transport_generic_wait_for_cmds(struct se_cmd *, int); 174extern void transport_generic_wait_for_cmds(struct se_cmd *, int);
191extern int transport_init_task_sg(struct se_task *, struct se_mem *, u32);
192extern int transport_map_mem_to_sg(struct se_task *, struct list_head *,
193 struct scatterlist *, struct se_mem *,
194 struct se_mem **, u32 *, u32 *);
195extern void transport_do_task_sg_chain(struct se_cmd *); 175extern void transport_do_task_sg_chain(struct se_cmd *);
196extern void transport_generic_process_write(struct se_cmd *); 176extern void transport_generic_process_write(struct se_cmd *);
197extern int transport_generic_new_cmd(struct se_cmd *); 177extern int transport_generic_new_cmd(struct se_cmd *);
@@ -200,6 +180,7 @@ extern int transport_generic_do_tmr(struct se_cmd *);
200extern int core_alua_check_nonop_delay(struct se_cmd *); 180extern int core_alua_check_nonop_delay(struct se_cmd *);
201/* From target_core_cdb.c */ 181/* From target_core_cdb.c */
202extern int transport_emulate_control_cdb(struct se_task *); 182extern int transport_emulate_control_cdb(struct se_task *);
183extern void target_get_task_cdb(struct se_task *task, unsigned char *cdb);
203 184
204/* 185/*
205 * Each se_transport_task_t can have N number of possible struct se_task's 186 * Each se_transport_task_t can have N number of possible struct se_task's
@@ -227,6 +208,10 @@ struct se_subsystem_api {
227 * Transport Type. 208 * Transport Type.
228 */ 209 */
229 u8 transport_type; 210 u8 transport_type;
211
212 unsigned int fua_write_emulated : 1;
213 unsigned int write_cache_emulated : 1;
214
230 /* 215 /*
231 * struct module for struct se_hba references 216 * struct module for struct se_hba references
232 */ 217 */
@@ -236,18 +221,6 @@ struct se_subsystem_api {
236 */ 221 */
237 struct list_head sub_api_list; 222 struct list_head sub_api_list;
238 /* 223 /*
239 * For SCF_SCSI_NON_DATA_CDB
240 */
241 int (*cdb_none)(struct se_task *);
242 /*
243 * For SCF_SCSI_DATA_SG_IO_CDB
244 */
245 int (*map_data_SG)(struct se_task *);
246 /*
247 * For SCF_SCSI_CONTROL_SG_IO_CDB
248 */
249 int (*map_control_SG)(struct se_task *);
250 /*
251 * attach_hba(): 224 * attach_hba():
252 */ 225 */
253 int (*attach_hba)(struct se_hba *, u32); 226 int (*attach_hba)(struct se_hba *, u32);
@@ -275,22 +248,6 @@ struct se_subsystem_api {
275 void (*free_device)(void *); 248 void (*free_device)(void *);
276 249
277 /* 250 /*
278 * dpo_emulated():
279 */
280 int (*dpo_emulated)(struct se_device *);
281 /*
282 * fua_write_emulated():
283 */
284 int (*fua_write_emulated)(struct se_device *);
285 /*
286 * fua_read_emulated():
287 */
288 int (*fua_read_emulated)(struct se_device *);
289 /*
290 * write_cache_emulated():
291 */
292 int (*write_cache_emulated)(struct se_device *);
293 /*
294 * transport_complete(): 251 * transport_complete():
295 * 252 *
296 * Use transport_generic_complete() for majority of DAS transport 253 * Use transport_generic_complete() for majority of DAS transport
@@ -331,10 +288,6 @@ struct se_subsystem_api {
331 ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *, 288 ssize_t (*show_configfs_dev_params)(struct se_hba *, struct se_subsystem_dev *,
332 char *); 289 char *);
333 /* 290 /*
334 * get_cdb():
335 */
336 unsigned char *(*get_cdb)(struct se_task *);
337 /*
338 * get_device_rev(): 291 * get_device_rev():
339 */ 292 */
340 u32 (*get_device_rev)(struct se_device *); 293 u32 (*get_device_rev)(struct se_device *);