Blame view

include/target/target_core_fabric.h 8.53 KB
c4795fb20   Christoph Hellwig   target: header re...
1
2
  #ifndef TARGET_CORE_FABRIC_H
  #define TARGET_CORE_FABRIC_H
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
3
4
  
  struct target_core_fabric_ops {
9ac8928e6   Christoph Hellwig   target: simplify ...
5
6
  	struct module *module;
  	const char *name;
144bc4c2a   Christoph Hellwig   target: move node...
7
  	size_t node_acl_size;
8f9b56548   Nicholas Bellinger   target/qla2xxx: H...
8
9
10
11
12
13
14
15
16
17
18
19
20
  	/*
  	 * Limits number of scatterlist entries per SCF_SCSI_DATA_CDB payload.
  	 * Setting this value tells target-core to enforce this limit, and
  	 * report as INQUIRY EVPD=b0 MAXIMUM TRANSFER LENGTH.
  	 *
  	 * target-core will currently reset se_cmd->data_length to this
  	 * maximum size, and set UNDERFLOW residual count if length exceeds
  	 * this limit.
  	 *
  	 * XXX: Not all initiator hosts honor this block-limit EVPD
  	 * XXX: Currently assumes single PAGE_SIZE per scatterlist entry
  	 */
  	u32 max_data_sg_nents;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
21
  	char *(*get_fabric_name)(void);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
22
23
24
  	char *(*tpg_get_wwn)(struct se_portal_group *);
  	u16 (*tpg_get_tag)(struct se_portal_group *);
  	u32 (*tpg_get_default_depth)(struct se_portal_group *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
25
26
27
28
  	int (*tpg_check_demo_mode)(struct se_portal_group *);
  	int (*tpg_check_demo_mode_cache)(struct se_portal_group *);
  	int (*tpg_check_demo_mode_write_protect)(struct se_portal_group *);
  	int (*tpg_check_prod_mode_write_protect)(struct se_portal_group *);
052605c6c   Nicholas Bellinger   target: Make stan...
29
30
31
32
33
34
  	/*
  	 * Optionally used by fabrics to allow demo-mode login, but not
  	 * expose any TPG LUNs, and return 'not connected' in standard
  	 * inquiry response
  	 */
  	int (*tpg_check_demo_mode_login_only)(struct se_portal_group *);
38b57f82f   Nicholas Bellinger   target: Add prote...
35
36
37
38
39
40
41
42
  	/*
  	 * Optionally used as a configfs tunable to determine when
  	 * target-core should signal the PROTECT=1 feature bit for
  	 * backends that don't support T10-PI, so that either fabric
  	 * HW offload or target-core emulation performs the associated
  	 * WRITE_STRIP and READ_INSERT operations.
  	 */
  	int (*tpg_check_prot_fabric_only)(struct se_portal_group *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
43
44
  	u32 (*tpg_get_inst_index)(struct se_portal_group *);
  	/*
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
45
  	 * Optional to release struct se_cmd and fabric dependent allocated
88dd9e26d   Nicholas Bellinger   target: Make TFO-...
46
47
48
49
  	 * I/O descriptor in transport_cmd_check_stop().
  	 *
  	 * Returning 1 will signal a descriptor has been released.
  	 * Returning 0 will signal a descriptor has not been released.
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
50
  	 */
88dd9e26d   Nicholas Bellinger   target: Make TFO-...
51
  	int (*check_stop_free)(struct se_cmd *);
35462975b   Christoph Hellwig   target: merge rel...
52
  	void (*release_cmd)(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
53
  	void (*close_session)(struct se_session *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
54
55
56
57
58
59
60
61
62
63
  	u32 (*sess_get_index)(struct se_session *);
  	/*
  	 * Used only for SCSI fabrics that contain multi-value TransportIDs
  	 * (like iSCSI).  All other SCSI fabrics should set this to NULL.
  	 */
  	u32 (*sess_get_initiator_sid)(struct se_session *,
  				      unsigned char *, u32);
  	int (*write_pending)(struct se_cmd *);
  	int (*write_pending_status)(struct se_cmd *);
  	void (*set_default_node_attributes)(struct se_node_acl *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
64
  	int (*get_cmd_state)(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
65
66
  	int (*queue_data_in)(struct se_cmd *);
  	int (*queue_status)(struct se_cmd *);
b79fafac7   Joern Engel   target: make queu...
67
  	void (*queue_tm_rsp)(struct se_cmd *);
131e6abc6   Nicholas Bellinger   target: Add TFO->...
68
  	void (*aborted_task)(struct se_cmd *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
69
70
71
72
73
74
  	/*
  	 * fabric module calls for target_core_fabric_configfs.c
  	 */
  	struct se_wwn *(*fabric_make_wwn)(struct target_fabric_configfs *,
  				struct config_group *, const char *);
  	void (*fabric_drop_wwn)(struct se_wwn *);
839559e10   Christoph Hellwig   target: add a new...
75
  	void (*add_wwn_groups)(struct se_wwn *);
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
76
77
78
79
80
81
82
83
84
85
  	struct se_portal_group *(*fabric_make_tpg)(struct se_wwn *,
  				struct config_group *, const char *);
  	void (*fabric_drop_tpg)(struct se_portal_group *);
  	int (*fabric_post_link)(struct se_portal_group *,
  				struct se_lun *);
  	void (*fabric_pre_unlink)(struct se_portal_group *,
  				struct se_lun *);
  	struct se_tpg_np *(*fabric_make_np)(struct se_portal_group *,
  				struct config_group *, const char *);
  	void (*fabric_drop_np)(struct se_tpg_np *);
c7d6a8039   Christoph Hellwig   target: refactor ...
86
  	int (*fabric_init_nodeacl)(struct se_node_acl *, const char *);
9ac8928e6   Christoph Hellwig   target: simplify ...
87
88
89
90
91
92
93
94
95
96
97
98
  
  	struct configfs_attribute **tfc_discovery_attrs;
  	struct configfs_attribute **tfc_wwn_attrs;
  	struct configfs_attribute **tfc_tpg_base_attrs;
  	struct configfs_attribute **tfc_tpg_np_base_attrs;
  	struct configfs_attribute **tfc_tpg_attrib_attrs;
  	struct configfs_attribute **tfc_tpg_auth_attrs;
  	struct configfs_attribute **tfc_tpg_param_attrs;
  	struct configfs_attribute **tfc_tpg_nacl_base_attrs;
  	struct configfs_attribute **tfc_tpg_nacl_attrib_attrs;
  	struct configfs_attribute **tfc_tpg_nacl_auth_attrs;
  	struct configfs_attribute **tfc_tpg_nacl_param_attrs;
c66ac9db8   Nicholas Bellinger   [SCSI] target: Ad...
99
  };
c4795fb20   Christoph Hellwig   target: header re...
100

9ac8928e6   Christoph Hellwig   target: simplify ...
101
102
  int target_register_template(const struct target_core_fabric_ops *fo);
  void target_unregister_template(const struct target_core_fabric_ops *fo);
d588cf8f6   Christoph Hellwig   target: Fix se_tp...
103
104
  int target_depend_item(struct config_item *item);
  void target_undepend_item(struct config_item *item);
7861728d4   Nicholas Bellinger   target: Add targe...
105
106
107
108
109
  struct se_session *target_alloc_session(struct se_portal_group *,
  		unsigned int, unsigned int, enum target_prot_op prot_op,
  		const char *, void *,
  		int (*callback)(struct se_portal_group *,
  				struct se_session *, void *));
e70beee78   Nicholas Bellinger   target: Pass in t...
110
  struct se_session *transport_init_session(enum target_prot_op);
c0add7fd0   Nicholas Bellinger   target: Add trans...
111
112
  int transport_alloc_session_tags(struct se_session *, unsigned int,
  		unsigned int);
e70beee78   Nicholas Bellinger   target: Pass in t...
113
114
  struct se_session *transport_init_session_tags(unsigned int, unsigned int,
  		enum target_prot_op);
c4795fb20   Christoph Hellwig   target: header re...
115
116
117
118
  void	__transport_register_session(struct se_portal_group *,
  		struct se_node_acl *, struct se_session *, void *);
  void	transport_register_session(struct se_portal_group *,
  		struct se_node_acl *, struct se_session *, void *);
f8e471f9e   Nicholas Bellinger   target: Add targe...
119
  ssize_t	target_show_dynamic_sessions(struct se_portal_group *, char *);
c4795fb20   Christoph Hellwig   target: header re...
120
  void	transport_free_session(struct se_session *);
afb999ffc   Nicholas Bellinger   target: Add se_no...
121
  void	target_put_nacl(struct se_node_acl *);
c4795fb20   Christoph Hellwig   target: header re...
122
123
  void	transport_deregister_session_configfs(struct se_session *);
  void	transport_deregister_session(struct se_session *);
9ac8928e6   Christoph Hellwig   target: simplify ...
124
125
  void	transport_init_se_cmd(struct se_cmd *,
  		const struct target_core_fabric_ops *,
c4795fb20   Christoph Hellwig   target: header re...
126
  		struct se_session *, u32, int, int, unsigned char *);
f2d306802   Hannes Reinecke   target: use 64-bi...
127
  sense_reason_t transport_lookup_cmd_lun(struct se_cmd *, u64);
de103c93a   Christoph Hellwig   target: pass sens...
128
  sense_reason_t target_setup_cmd_from_cdb(struct se_cmd *, unsigned char *);
a026757ff   Nicholas Bellinger   target: Add targe...
129
  int	target_submit_cmd_map_sgls(struct se_cmd *, struct se_session *,
f2d306802   Hannes Reinecke   target: use 64-bi...
130
  		unsigned char *, unsigned char *, u64, u32, int, int, int,
def2b339b   Nicholas Bellinger   target: Add prote...
131
132
  		struct scatterlist *, u32, struct scatterlist *, u32,
  		struct scatterlist *, u32);
d6dfc868b   Roland Dreier   target: Allow for...
133
  int	target_submit_cmd(struct se_cmd *, struct se_session *, unsigned char *,
f2d306802   Hannes Reinecke   target: use 64-bi...
134
  		unsigned char *, u64, u32, int, int, int);
c7042cae5   Nicholas Bellinger   target: Fix targe...
135
  int	target_submit_tmr(struct se_cmd *se_cmd, struct se_session *se_sess,
f2d306802   Hannes Reinecke   target: use 64-bi...
136
  		unsigned char *sense, u64 unpacked_lun,
c0974f893   Nicholas Bellinger   target: Allow tar...
137
  		void *fabric_tmr_ptr, unsigned char tm_type,
5261d86c5   Bart Van Assche   target: Support a...
138
  		gfp_t, u64, int);
c4795fb20   Christoph Hellwig   target: header re...
139
  int	transport_handle_cdb_direct(struct se_cmd *);
de103c93a   Christoph Hellwig   target: pass sens...
140
  sense_reason_t	transport_generic_new_cmd(struct se_cmd *);
c4795fb20   Christoph Hellwig   target: header re...
141

70baf0ab3   Christoph Hellwig   target: remove tr...
142
  void	target_execute_cmd(struct se_cmd *cmd);
c4795fb20   Christoph Hellwig   target: header re...
143

d5ddad416   Nicholas Bellinger   target: Propigate...
144
  int	transport_generic_free_cmd(struct se_cmd *, int);
c4795fb20   Christoph Hellwig   target: header re...
145
146
147
  
  bool	transport_wait_for_tasks(struct se_cmd *);
  int	transport_check_aborted_status(struct se_cmd *, int);
de103c93a   Christoph Hellwig   target: pass sens...
148
149
  int	transport_send_check_condition_and_sense(struct se_cmd *,
  		sense_reason_t, int);
afc16604c   Bart Van Assche   target: Remove fi...
150
151
  int	target_get_sess_cmd(struct se_cmd *, bool);
  int	target_put_sess_cmd(struct se_cmd *);
1c7b13fe6   Roland Dreier   target: Remove se...
152
  void	target_sess_cmd_list_set_waiting(struct se_session *);
be646c2d2   Joern Engel   target: Remove un...
153
  void	target_wait_for_sess_cmds(struct se_session *);
c4795fb20   Christoph Hellwig   target: header re...
154
155
  
  int	core_alua_check_nonop_delay(struct se_cmd *);
c8e31f26f   Andy Grover   target: Add SCF_S...
156
  int	core_tmr_alloc_req(struct se_cmd *, void *, u8, gfp_t);
c4795fb20   Christoph Hellwig   target: header re...
157
158
  void	core_tmr_release_req(struct se_tmr_req *);
  int	transport_generic_handle_tmr(struct se_cmd *);
de103c93a   Christoph Hellwig   target: pass sens...
159
  void	transport_generic_request_failure(struct se_cmd *, sense_reason_t);
f2d306802   Hannes Reinecke   target: use 64-bi...
160
  int	transport_lookup_tmr_lun(struct se_cmd *, u64);
e986a35ab   Hannes Reinecke   tcm_loop: Send I_...
161
  void	core_allocate_nexus_loss_ua(struct se_node_acl *acl);
c4795fb20   Christoph Hellwig   target: header re...
162

b3fde0357   Thomas Glanzmann   target: Export sy...
163
164
  struct se_node_acl *core_tpg_get_initiator_node_acl(struct se_portal_group *tpg,
  		unsigned char *);
21aaa23b0   Nicholas Bellinger   target: Obtain se...
165
166
  bool	target_tpg_has_node_acl(struct se_portal_group *tpg,
  		const char *);
c4795fb20   Christoph Hellwig   target: header re...
167
168
  struct se_node_acl *core_tpg_check_initiator_node_acl(struct se_portal_group *,
  		unsigned char *);
d36ad77f7   Nicholas Bellinger   target: Convert A...
169
  int	core_tpg_set_initiator_node_queue_depth(struct se_node_acl *, u32);
79e62fc38   Andy Grover   target/iscsi_targ...
170
171
  int	core_tpg_set_initiator_node_tag(struct se_portal_group *,
  		struct se_node_acl *, const char *);
bc0c94b14   Nicholas Bellinger   target: Drop unne...
172
  int	core_tpg_register(struct se_wwn *, struct se_portal_group *, int);
c4795fb20   Christoph Hellwig   target: header re...
173
  int	core_tpg_deregister(struct se_portal_group *);
e64aa657c   Christoph Hellwig   target: enhance a...
174
175
176
  int	target_alloc_sgl(struct scatterlist **sgl, unsigned int *nents,
  		u32 length, bool zero_page, bool chainable);
  void	target_free_sgl(struct scatterlist *sgl, int nents);
b3faa2e87   Nicholas Bellinger   target/tcm_qla2xx...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
  /*
   * The LIO target core uses DMA_TO_DEVICE to mean that data is going
   * to the target (eg handling a WRITE) and DMA_FROM_DEVICE to mean
   * that data is coming from the target (eg handling a READ).  However,
   * this is just the opposite of what we have to tell the DMA mapping
   * layer -- eg when handling a READ, the HBA will have to DMA the data
   * out of memory so it can send it to the initiator, which means we
   * need to use DMA_TO_DEVICE when we map the data.
   */
  static inline enum dma_data_direction
  target_reverse_dma_direction(struct se_cmd *se_cmd)
  {
  	if (se_cmd->se_cmd_flags & SCF_BIDI)
  		return DMA_BIDIRECTIONAL;
  
  	switch (se_cmd->data_direction) {
  	case DMA_TO_DEVICE:
  		return DMA_FROM_DEVICE;
  	case DMA_FROM_DEVICE:
  		return DMA_TO_DEVICE;
  	case DMA_NONE:
  	default:
  		return DMA_NONE;
  	}
  }
c4795fb20   Christoph Hellwig   target: header re...
202
  #endif /* TARGET_CORE_FABRICH */