Blame view
include/scsi/scsi_transport_iscsi.h
11.1 KB
39e84790d
|
1 |
/* |
1da177e4c
|
2 3 4 |
* iSCSI transport class definitions * * Copyright (C) IBM Corporation, 2004 |
7996a778f
|
5 |
* Copyright (C) Mike Christie, 2004 - 2006 |
39e84790d
|
6 7 |
* Copyright (C) Dmitry Yusupov, 2004 - 2005 * Copyright (C) Alex Aizman, 2004 - 2005 |
1da177e4c
|
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef SCSI_TRANSPORT_ISCSI_H #define SCSI_TRANSPORT_ISCSI_H |
7b8631b53
|
25 |
#include <linux/device.h> |
d773c082d
|
26 27 |
#include <linux/list.h> #include <linux/mutex.h> |
39e84790d
|
28 |
#include <scsi/iscsi_if.h> |
1da177e4c
|
29 |
|
7b8631b53
|
30 |
struct scsi_transport_template; |
7996a778f
|
31 |
struct iscsi_transport; |
d82ff9be7
|
32 |
struct iscsi_endpoint; |
7b8631b53
|
33 |
struct Scsi_Host; |
c01be6dcb
|
34 |
struct scsi_cmnd; |
7b8631b53
|
35 |
struct iscsi_cls_conn; |
7996a778f
|
36 |
struct iscsi_conn; |
9c19a7d03
|
37 |
struct iscsi_task; |
a54a52caa
|
38 |
struct sockaddr; |
8d07913db
|
39 |
struct iscsi_iface; |
90eeb01a0
|
40 |
struct bsg_job; |
7b8631b53
|
41 |
|
39e84790d
|
42 43 44 45 46 47 48 49 50 51 52 |
/** * struct iscsi_transport - iSCSI Transport template * * @name: transport name * @caps: iSCSI Data-Path capabilities * @create_session: create new iSCSI session object * @destroy_session: destroy existing iSCSI session object * @create_conn: create new iSCSI connection * @bind_conn: associate this connection with existing iSCSI session * and specified transport descriptor * @destroy_conn: destroy inactive iSCSI connection |
a54a52caa
|
53 54 55 56 57 58 |
* @set_param: set iSCSI parameter. Return 0 on success, -ENODATA * when param is not supported, and a -Exx value on other * error. * @get_param get iSCSI parameter. Must return number of bytes * copied to buffer on success, -ENODATA when param * is not supported, and a -Exx value on other error |
39e84790d
|
59 60 61 |
* @start_conn: set connection to be operational * @stop_conn: suspend/recover/terminate connection * @send_pdu: send iSCSI PDU, Login, Logout, NOP-Out, Reject, Text. |
7996a778f
|
62 |
* @session_recovery_timedout: notify LLD a block during recovery timed out |
3e5c28ad0
|
63 64 65 66 67 68 69 |
* @init_task: Initialize a iscsi_task and any internal structs. * When offloading the data path, this is called from * queuecommand with the session lock, or from the * iscsi_conn_send_pdu context with the session lock. * When not offloading the data path, this is called * from the scsi work queue without the session lock. * @xmit_task Requests LLD to transfer cmd task. Returns 0 or the |
3219e5294
|
70 |
* the number of bytes transferred on success, and -Exyz |
3e5c28ad0
|
71 72 73 74 75 76 77 78 |
* value on error. When offloading the data path, this * is called from queuecommand with the session lock, or * from the iscsi_conn_send_pdu context with the session * lock. When not offloading the data path, this is called * from the scsi work queue without the session lock. * @cleanup_task: requests LLD to fail task. Called with session lock * and after the connection has been suspended and * terminated during recovery. If called |
7996a778f
|
79 80 |
* from abort task then connection is not suspended * or terminated but sk_callback_lock is held |
39e84790d
|
81 82 83 84 85 86 87 |
* * Template API provided by iSCSI Transport */ struct iscsi_transport { struct module *owner; char *name; unsigned int caps; |
8d07913db
|
88 |
|
d82ff9be7
|
89 |
struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep, |
756135215
|
90 |
uint16_t cmds_max, uint16_t qdepth, |
5e7facb77
|
91 |
uint32_t sn); |
7b7232f3f
|
92 93 |
void (*destroy_session) (struct iscsi_cls_session *session); struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, |
7b8631b53
|
94 |
uint32_t cid); |
7b7232f3f
|
95 96 |
int (*bind_conn) (struct iscsi_cls_session *session, struct iscsi_cls_conn *cls_conn, |
264faaaa1
|
97 |
uint64_t transport_eph, int is_leading); |
7b7232f3f
|
98 99 |
int (*start_conn) (struct iscsi_cls_conn *conn); void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); |
7b8631b53
|
100 |
void (*destroy_conn) (struct iscsi_cls_conn *conn); |
7b7232f3f
|
101 |
int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, |
a54a52caa
|
102 |
char *buf, int buflen); |
289324b0c
|
103 104 |
int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param, char *buf); |
7b7232f3f
|
105 |
int (*get_conn_param) (struct iscsi_cls_conn *conn, |
a54a52caa
|
106 |
enum iscsi_param param, char *buf); |
7b7232f3f
|
107 |
int (*get_session_param) (struct iscsi_cls_session *session, |
a54a52caa
|
108 |
enum iscsi_param param, char *buf); |
1819dc814
|
109 110 |
int (*get_host_param) (struct Scsi_Host *shost, enum iscsi_host_param param, char *buf); |
1d9bf13a9
|
111 112 113 |
int (*set_host_param) (struct Scsi_Host *shost, enum iscsi_host_param param, char *buf, int buflen); |
7b7232f3f
|
114 |
int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
39e84790d
|
115 |
char *data, uint32_t data_size); |
7b7232f3f
|
116 117 |
void (*get_stats) (struct iscsi_cls_conn *conn, struct iscsi_stats *stats); |
577577da6
|
118 |
|
9c19a7d03
|
119 120 |
int (*init_task) (struct iscsi_task *task); int (*xmit_task) (struct iscsi_task *task); |
577577da6
|
121 |
void (*cleanup_task) (struct iscsi_task *task); |
2ff79d52d
|
122 |
int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); |
577577da6
|
123 124 125 |
int (*xmit_pdu) (struct iscsi_task *task); int (*init_pdu) (struct iscsi_task *task, unsigned int offset, unsigned int count); |
262ef6362
|
126 127 |
void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, int *index, int *age); |
30a6c6523
|
128 |
void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
10eb0f013
|
129 130 |
struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, struct sockaddr *dst_addr, |
d82ff9be7
|
131 132 133 |
int non_blocking); int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); void (*ep_disconnect) (struct iscsi_endpoint *ep); |
2174a04ee
|
134 |
int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type, |
01cb225da
|
135 |
uint32_t enable, struct sockaddr *dst_addr); |
43514774f
|
136 |
int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params); |
00c31889f
|
137 138 |
int (*set_iface_param) (struct Scsi_Host *shost, void *data, uint32_t len); |
8d07913db
|
139 140 141 |
int (*get_iface_param) (struct iscsi_iface *iface, enum iscsi_param_type param_type, int param, char *buf); |
587a1f165
|
142 |
umode_t (*attr_is_visible)(int param_type, int param); |
90eeb01a0
|
143 |
int (*bsg_request)(struct bsg_job *job); |
1da177e4c
|
144 145 146 |
}; /* |
39e84790d
|
147 |
* transport registration upcalls |
1da177e4c
|
148 |
*/ |
7b8631b53
|
149 |
extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt); |
39e84790d
|
150 |
extern int iscsi_unregister_transport(struct iscsi_transport *tt); |
1da177e4c
|
151 152 |
/* |
39e84790d
|
153 |
* control plane upcalls |
1da177e4c
|
154 |
*/ |
e5bd7b54e
|
155 156 |
extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error); |
17fa575ee
|
157 158 |
extern void iscsi_conn_login_event(struct iscsi_cls_conn *conn, enum iscsi_conn_state state); |
7b7232f3f
|
159 |
extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
39e84790d
|
160 |
char *data, uint32_t data_size); |
1da177e4c
|
161 |
|
43514774f
|
162 163 164 |
extern int iscsi_offload_mesg(struct Scsi_Host *shost, struct iscsi_transport *transport, uint32_t type, char *data, uint16_t data_size); |
7b8631b53
|
165 166 167 168 |
struct iscsi_cls_conn { struct list_head conn_list; /* item in connlist */ void *dd_data; /* LLD private data */ struct iscsi_transport *transport; |
b5c7a12dc
|
169 |
uint32_t cid; /* connection id */ |
22a39fbbf
|
170 171 |
struct mutex ep_mutex; struct iscsi_endpoint *ep; |
fd7255f51
|
172 |
|
7b8631b53
|
173 |
struct device dev; /* sysfs transport/container device */ |
7b8631b53
|
174 175 176 177 |
}; #define iscsi_dev_to_conn(_dev) \ container_of(_dev, struct iscsi_cls_conn, dev) |
3128c6c73
|
178 179 |
#define transport_class_to_conn(_cdev) \ iscsi_dev_to_conn(_cdev->parent) |
6eabafbe6
|
180 181 182 183 184 185 186 187 188 |
#define iscsi_conn_to_session(_conn) \ iscsi_dev_to_session(_conn->dev.parent) /* iscsi class session state */ enum { ISCSI_SESSION_LOGGED_IN, ISCSI_SESSION_FAILED, ISCSI_SESSION_FREE, }; |
7996a778f
|
189 |
|
7970634b8
|
190 |
#define ISCSI_MAX_TARGET -1 |
7b8631b53
|
191 |
struct iscsi_cls_session { |
7b7232f3f
|
192 |
struct list_head sess_list; /* item in session_list */ |
7b8631b53
|
193 |
struct iscsi_transport *transport; |
6eabafbe6
|
194 |
spinlock_t lock; |
45ab33b6c
|
195 196 |
struct work_struct block_work; struct work_struct unblock_work; |
bd976f62c
|
197 198 |
struct work_struct scan_work; struct work_struct unbind_work; |
fd7255f51
|
199 |
|
30a6c6523
|
200 201 |
/* recovery fields */ int recovery_tmo; |
c4028958b
|
202 |
struct delayed_work recovery_work; |
30a6c6523
|
203 |
|
7970634b8
|
204 |
unsigned int target_id; |
8d4a690cd
|
205 |
bool ida_used; |
30a6c6523
|
206 |
|
0c70d84b7
|
207 208 209 210 211 |
/* * pid of userspace process that created session or -1 if * created by the kernel. */ pid_t creator; |
6eabafbe6
|
212 |
int state; |
b5c7a12dc
|
213 214 |
int sid; /* session id */ void *dd_data; /* LLD private data */ |
7b8631b53
|
215 216 217 218 219 |
struct device dev; /* sysfs transport/container device */ }; #define iscsi_dev_to_session(_dev) \ container_of(_dev, struct iscsi_cls_session, dev) |
1d063c172
|
220 221 |
#define transport_class_to_session(_cdev) \ iscsi_dev_to_session(_cdev->parent) |
7b8631b53
|
222 223 |
#define iscsi_session_to_shost(_session) \ dev_to_shost(_session->dev.parent) |
8434aa8b6
|
224 225 |
#define starget_to_session(_stgt) \ iscsi_dev_to_session(_stgt->dev.parent) |
32c6e1b9a
|
226 |
struct iscsi_cls_host { |
8aae18adb
|
227 |
atomic_t nr_scans; |
30a6c6523
|
228 |
struct mutex mutex; |
90eeb01a0
|
229 |
struct request_queue *bsg_q; |
30a6c6523
|
230 |
}; |
90eeb01a0
|
231 232 |
#define iscsi_job_to_shost(_job) \ dev_to_shost(_job->dev) |
a4804cd6e
|
233 234 |
extern void iscsi_host_for_each_session(struct Scsi_Host *shost, void (*fn)(struct iscsi_cls_session *)); |
d82ff9be7
|
235 236 237 |
struct iscsi_endpoint { void *dd_data; /* LLD private data */ struct device dev; |
21536062d
|
238 |
uint64_t id; |
22a39fbbf
|
239 |
struct iscsi_cls_conn *conn; |
d82ff9be7
|
240 |
}; |
a4804cd6e
|
241 |
|
8d07913db
|
242 243 244 245 246 247 248 249 250 251 252 253 254 |
struct iscsi_iface { struct device dev; struct iscsi_transport *transport; uint32_t iface_type; /* IPv4 or IPv6 */ uint32_t iface_num; /* iface number, 0 - n */ void *dd_data; /* LLD private data */ }; #define iscsi_dev_to_iface(_dev) \ container_of(_dev, struct iscsi_iface, dev) #define iscsi_iface_to_shost(_iface) \ dev_to_shost(_iface->dev.parent) |
7b8631b53
|
255 256 257 |
/* * session and connection functions that can be used by HW iSCSI LLDs */ |
322d739da
|
258 259 260 261 262 |
#define iscsi_cls_session_printk(prefix, _cls_session, fmt, a...) \ dev_printk(prefix, &(_cls_session)->dev, fmt, ##a) #define iscsi_cls_conn_printk(prefix, _cls_conn, fmt, a...) \ dev_printk(prefix, &(_cls_conn)->dev, fmt, ##a) |
6eabafbe6
|
263 |
extern int iscsi_session_chkready(struct iscsi_cls_session *session); |
17fa575ee
|
264 |
extern int iscsi_is_session_online(struct iscsi_cls_session *session); |
8434aa8b6
|
265 |
extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, |
5d91e209f
|
266 |
struct iscsi_transport *transport, int dd_size); |
6a8a0d362
|
267 268 |
extern int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id); |
269747890
|
269 270 |
extern int iscsi_session_event(struct iscsi_cls_session *session, enum iscsi_uevent_e event); |
7b8631b53
|
271 |
extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, |
6a8a0d362
|
272 |
struct iscsi_transport *t, |
5d91e209f
|
273 |
int dd_size, |
6a8a0d362
|
274 |
unsigned int target_id); |
8434aa8b6
|
275 276 |
extern void iscsi_remove_session(struct iscsi_cls_session *session); extern void iscsi_free_session(struct iscsi_cls_session *session); |
7b8631b53
|
277 278 |
extern int iscsi_destroy_session(struct iscsi_cls_session *session); extern struct iscsi_cls_conn *iscsi_create_conn(struct iscsi_cls_session *sess, |
5d91e209f
|
279 |
int dd_size, uint32_t cid); |
7b8631b53
|
280 |
extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); |
30a6c6523
|
281 282 |
extern void iscsi_unblock_session(struct iscsi_cls_session *session); extern void iscsi_block_session(struct iscsi_cls_session *session); |
8aae18adb
|
283 |
extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time); |
d82ff9be7
|
284 285 286 |
extern struct iscsi_endpoint *iscsi_create_endpoint(int dd_size); extern void iscsi_destroy_endpoint(struct iscsi_endpoint *ep); extern struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle); |
c01be6dcb
|
287 |
extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd); |
8d07913db
|
288 289 290 291 292 293 |
extern struct iscsi_iface *iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *t, uint32_t iface_type, uint32_t iface_num, int dd_size); extern void iscsi_destroy_iface(struct iscsi_iface *iface); extern struct iscsi_iface *iscsi_lookup_iface(int handle); |
53cb8a1f4
|
294 |
|
1da177e4c
|
295 |
#endif |