Blame view
include/scsi/scsi_transport_iscsi.h
11.1 KB
39e84790d [SCSI] open-iscsi... |
1 |
/* |
1da177e4c Linux-2.6.12-rc2 |
2 3 4 |
* iSCSI transport class definitions * * Copyright (C) IBM Corporation, 2004 |
7996a778f [SCSI] iscsi: add... |
5 |
* Copyright (C) Mike Christie, 2004 - 2006 |
39e84790d [SCSI] open-iscsi... |
6 7 |
* Copyright (C) Dmitry Yusupov, 2004 - 2005 * Copyright (C) Alex Aizman, 2004 - 2005 |
1da177e4c Linux-2.6.12-rc2 |
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 [SCSI] iscsi: sep... |
25 |
#include <linux/device.h> |
d773c082d [SCSI] scsi_trans... |
26 27 |
#include <linux/list.h> #include <linux/mutex.h> |
39e84790d [SCSI] open-iscsi... |
28 |
#include <scsi/iscsi_if.h> |
1da177e4c Linux-2.6.12-rc2 |
29 |
|
7b8631b53 [SCSI] iscsi: sep... |
30 |
struct scsi_transport_template; |
7996a778f [SCSI] iscsi: add... |
31 |
struct iscsi_transport; |
d82ff9be7 [SCSI] iscsi clas... |
32 |
struct iscsi_endpoint; |
7b8631b53 [SCSI] iscsi: sep... |
33 |
struct Scsi_Host; |
c01be6dcb [SCSI] iscsi_tran... |
34 |
struct scsi_cmnd; |
7b8631b53 [SCSI] iscsi: sep... |
35 |
struct iscsi_cls_conn; |
7996a778f [SCSI] iscsi: add... |
36 |
struct iscsi_conn; |
9c19a7d03 [SCSI] libiscsi: ... |
37 |
struct iscsi_task; |
a54a52caa [SCSI] iscsi: fix... |
38 |
struct sockaddr; |
8d07913db [SCSI] iscsi clas... |
39 |
struct iscsi_iface; |
90eeb01a0 [SCSI] iscsi clas... |
40 |
struct bsg_job; |
7b8631b53 [SCSI] iscsi: sep... |
41 |
|
39e84790d [SCSI] open-iscsi... |
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 [SCSI] iscsi: fix... |
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 [SCSI] open-iscsi... |
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 [SCSI] iscsi: add... |
62 |
* @session_recovery_timedout: notify LLD a block during recovery timed out |
3e5c28ad0 [SCSI] libiscsi: ... |
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 [SCSI] iscsi: fix... |
70 |
* the number of bytes transferred on success, and -Exyz |
3e5c28ad0 [SCSI] libiscsi: ... |
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 [SCSI] iscsi: add... |
79 80 |
* from abort task then connection is not suspended * or terminated but sk_callback_lock is held |
39e84790d [SCSI] open-iscsi... |
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 [SCSI] iscsi clas... |
88 |
|
d82ff9be7 [SCSI] iscsi clas... |
89 |
struct iscsi_cls_session *(*create_session) (struct iscsi_endpoint *ep, |
756135215 [SCSI] iscsi: rem... |
90 |
uint16_t cmds_max, uint16_t qdepth, |
5e7facb77 [SCSI] iscsi clas... |
91 |
uint32_t sn); |
7b7232f3f [SCSI] iscsi upda... |
92 93 |
void (*destroy_session) (struct iscsi_cls_session *session); struct iscsi_cls_conn *(*create_conn) (struct iscsi_cls_session *sess, |
7b8631b53 [SCSI] iscsi: sep... |
94 |
uint32_t cid); |
7b7232f3f [SCSI] iscsi upda... |
95 96 |
int (*bind_conn) (struct iscsi_cls_session *session, struct iscsi_cls_conn *cls_conn, |
264faaaa1 [SCSI] iscsi: add... |
97 |
uint64_t transport_eph, int is_leading); |
7b7232f3f [SCSI] iscsi upda... |
98 99 |
int (*start_conn) (struct iscsi_cls_conn *conn); void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); |
7b8631b53 [SCSI] iscsi: sep... |
100 |
void (*destroy_conn) (struct iscsi_cls_conn *conn); |
7b7232f3f [SCSI] iscsi upda... |
101 |
int (*set_param) (struct iscsi_cls_conn *conn, enum iscsi_param param, |
a54a52caa [SCSI] iscsi: fix... |
102 |
char *buf, int buflen); |
289324b0c [SCSI] iscsi clas... |
103 104 |
int (*get_ep_param) (struct iscsi_endpoint *ep, enum iscsi_param param, char *buf); |
7b7232f3f [SCSI] iscsi upda... |
105 |
int (*get_conn_param) (struct iscsi_cls_conn *conn, |
a54a52caa [SCSI] iscsi: fix... |
106 |
enum iscsi_param param, char *buf); |
7b7232f3f [SCSI] iscsi upda... |
107 |
int (*get_session_param) (struct iscsi_cls_session *session, |
a54a52caa [SCSI] iscsi: fix... |
108 |
enum iscsi_param param, char *buf); |
1819dc814 [SCSI] iscsi_tran... |
109 110 |
int (*get_host_param) (struct Scsi_Host *shost, enum iscsi_host_param param, char *buf); |
1d9bf13a9 [SCSI] iscsi clas... |
111 112 113 |
int (*set_host_param) (struct Scsi_Host *shost, enum iscsi_host_param param, char *buf, int buflen); |
7b7232f3f [SCSI] iscsi upda... |
114 |
int (*send_pdu) (struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
39e84790d [SCSI] open-iscsi... |
115 |
char *data, uint32_t data_size); |
7b7232f3f [SCSI] iscsi upda... |
116 117 |
void (*get_stats) (struct iscsi_cls_conn *conn, struct iscsi_stats *stats); |
577577da6 [SCSI] libiscsi: ... |
118 |
|
9c19a7d03 [SCSI] libiscsi: ... |
119 120 |
int (*init_task) (struct iscsi_task *task); int (*xmit_task) (struct iscsi_task *task); |
577577da6 [SCSI] libiscsi: ... |
121 |
void (*cleanup_task) (struct iscsi_task *task); |
2ff79d52d [SCSI] libiscsi: ... |
122 |
int (*alloc_pdu) (struct iscsi_task *task, uint8_t opcode); |
577577da6 [SCSI] libiscsi: ... |
123 124 125 |
int (*xmit_pdu) (struct iscsi_task *task); int (*init_pdu) (struct iscsi_task *task, unsigned int offset, unsigned int count); |
262ef6362 [SCSI] libiscsi: ... |
126 127 |
void (*parse_pdu_itt) (struct iscsi_conn *conn, itt_t itt, int *index, int *age); |
30a6c6523 [SCSI] iscsi: fix... |
128 |
void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
10eb0f013 [SCSI] iscsi: pas... |
129 130 |
struct iscsi_endpoint *(*ep_connect) (struct Scsi_Host *shost, struct sockaddr *dst_addr, |
d82ff9be7 [SCSI] iscsi clas... |
131 132 133 |
int non_blocking); int (*ep_poll) (struct iscsi_endpoint *ep, int timeout_ms); void (*ep_disconnect) (struct iscsi_endpoint *ep); |
2174a04ee [SCSI] iscsi_tran... |
134 |
int (*tgt_dscvr) (struct Scsi_Host *shost, enum iscsi_tgt_dscvr type, |
01cb225da [SCSI] iscsi: add... |
135 |
uint32_t enable, struct sockaddr *dst_addr); |
43514774f [SCSI] iscsi clas... |
136 |
int (*set_path) (struct Scsi_Host *shost, struct iscsi_path *params); |
00c31889f [SCSI] qla4xxx: f... |
137 138 |
int (*set_iface_param) (struct Scsi_Host *shost, void *data, uint32_t len); |
8d07913db [SCSI] iscsi clas... |
139 140 141 |
int (*get_iface_param) (struct iscsi_iface *iface, enum iscsi_param_type param_type, int param, char *buf); |
587a1f165 switch ->is_visib... |
142 |
umode_t (*attr_is_visible)(int param_type, int param); |
90eeb01a0 [SCSI] iscsi clas... |
143 |
int (*bsg_request)(struct bsg_job *job); |
1da177e4c Linux-2.6.12-rc2 |
144 145 146 |
}; /* |
39e84790d [SCSI] open-iscsi... |
147 |
* transport registration upcalls |
1da177e4c Linux-2.6.12-rc2 |
148 |
*/ |
7b8631b53 [SCSI] iscsi: sep... |
149 |
extern struct scsi_transport_template *iscsi_register_transport(struct iscsi_transport *tt); |
39e84790d [SCSI] open-iscsi... |
150 |
extern int iscsi_unregister_transport(struct iscsi_transport *tt); |
1da177e4c Linux-2.6.12-rc2 |
151 152 |
/* |
39e84790d [SCSI] open-iscsi... |
153 |
* control plane upcalls |
1da177e4c Linux-2.6.12-rc2 |
154 |
*/ |
e5bd7b54e [SCSI] libiscsi: ... |
155 156 |
extern void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error); |
17fa575ee [SCSI] scsi_trans... |
157 158 |
extern void iscsi_conn_login_event(struct iscsi_cls_conn *conn, enum iscsi_conn_state state); |
7b7232f3f [SCSI] iscsi upda... |
159 |
extern int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr, |
39e84790d [SCSI] open-iscsi... |
160 |
char *data, uint32_t data_size); |
1da177e4c Linux-2.6.12-rc2 |
161 |
|
43514774f [SCSI] iscsi clas... |
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 [SCSI] iscsi: sep... |
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 [SCSI] iscsi: rm ... |
169 |
uint32_t cid; /* connection id */ |
22a39fbbf [SCSI] iscsi: fix... |
170 171 |
struct mutex ep_mutex; struct iscsi_endpoint *ep; |
fd7255f51 [SCSI] iscsi: add... |
172 |
|
7b8631b53 [SCSI] iscsi: sep... |
173 |
struct device dev; /* sysfs transport/container device */ |
7b8631b53 [SCSI] iscsi: sep... |
174 175 176 177 |
}; #define iscsi_dev_to_conn(_dev) \ container_of(_dev, struct iscsi_cls_conn, dev) |
3128c6c73 [SCSI] iscsi cls:... |
178 179 |
#define transport_class_to_conn(_cdev) \ iscsi_dev_to_conn(_cdev->parent) |
6eabafbe6 [SCSI] iscsi clas... |
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 [SCSI] iscsi: add... |
189 |
|
7970634b8 [SCSI] iscsi clas... |
190 |
#define ISCSI_MAX_TARGET -1 |
7b8631b53 [SCSI] iscsi: sep... |
191 |
struct iscsi_cls_session { |
7b7232f3f [SCSI] iscsi upda... |
192 |
struct list_head sess_list; /* item in session_list */ |
7b8631b53 [SCSI] iscsi: sep... |
193 |
struct iscsi_transport *transport; |
6eabafbe6 [SCSI] iscsi clas... |
194 |
spinlock_t lock; |
45ab33b6c [SCSI] iscsi clas... |
195 196 |
struct work_struct block_work; struct work_struct unblock_work; |
bd976f62c [SCSI] iscsi clas... |
197 198 |
struct work_struct scan_work; struct work_struct unbind_work; |
fd7255f51 [SCSI] iscsi: add... |
199 |
|
30a6c6523 [SCSI] iscsi: fix... |
200 201 |
/* recovery fields */ int recovery_tmo; |
c4028958b WorkStruct: make ... |
202 |
struct delayed_work recovery_work; |
30a6c6523 [SCSI] iscsi: fix... |
203 |
|
7970634b8 [SCSI] iscsi clas... |
204 |
unsigned int target_id; |
8d4a690cd [SCSI] iscsi clas... |
205 |
bool ida_used; |
30a6c6523 [SCSI] iscsi: fix... |
206 |
|
0c70d84b7 [SCSI] iscsi clas... |
207 208 209 210 211 |
/* * pid of userspace process that created session or -1 if * created by the kernel. */ pid_t creator; |
6eabafbe6 [SCSI] iscsi clas... |
212 |
int state; |
b5c7a12dc [SCSI] iscsi: rm ... |
213 214 |
int sid; /* session id */ void *dd_data; /* LLD private data */ |
7b8631b53 [SCSI] iscsi: sep... |
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 [SCSI] iscsi clas... |
220 221 |
#define transport_class_to_session(_cdev) \ iscsi_dev_to_session(_cdev->parent) |
7b8631b53 [SCSI] iscsi: sep... |
222 223 |
#define iscsi_session_to_shost(_session) \ dev_to_shost(_session->dev.parent) |
8434aa8b6 [SCSI] iscsi: bre... |
224 225 |
#define starget_to_session(_stgt) \ iscsi_dev_to_session(_stgt->dev.parent) |
32c6e1b9a [SCSI] iscsi clas... |
226 |
struct iscsi_cls_host { |
8aae18adb [SCSI] iscsi clas... |
227 |
atomic_t nr_scans; |
30a6c6523 [SCSI] iscsi: fix... |
228 |
struct mutex mutex; |
90eeb01a0 [SCSI] iscsi clas... |
229 |
struct request_queue *bsg_q; |
30a6c6523 [SCSI] iscsi: fix... |
230 |
}; |
90eeb01a0 [SCSI] iscsi clas... |
231 232 |
#define iscsi_job_to_shost(_job) \ dev_to_shost(_job->dev) |
a4804cd6e [SCSI] iscsi: add... |
233 234 |
extern void iscsi_host_for_each_session(struct Scsi_Host *shost, void (*fn)(struct iscsi_cls_session *)); |
d82ff9be7 [SCSI] iscsi clas... |
235 236 237 |
struct iscsi_endpoint { void *dd_data; /* LLD private data */ struct device dev; |
21536062d [SCSI] iscsi clas... |
238 |
uint64_t id; |
22a39fbbf [SCSI] iscsi: fix... |
239 |
struct iscsi_cls_conn *conn; |
d82ff9be7 [SCSI] iscsi clas... |
240 |
}; |
a4804cd6e [SCSI] iscsi: add... |
241 |
|
8d07913db [SCSI] iscsi clas... |
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 [SCSI] iscsi: sep... |
255 256 257 |
/* * session and connection functions that can be used by HW iSCSI LLDs */ |
322d739da [SCSI] iscsi: fix... |
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 [SCSI] iscsi clas... |
263 |
extern int iscsi_session_chkready(struct iscsi_cls_session *session); |
17fa575ee [SCSI] scsi_trans... |
264 |
extern int iscsi_is_session_online(struct iscsi_cls_session *session); |
8434aa8b6 [SCSI] iscsi: bre... |
265 |
extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, |
5d91e209f [SCSI] iscsi: rem... |
266 |
struct iscsi_transport *transport, int dd_size); |
6a8a0d362 [SCSI] iscsi: pas... |
267 268 |
extern int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id); |
269747890 [SCSI] libiscsi: ... |
269 270 |
extern int iscsi_session_event(struct iscsi_cls_session *session, enum iscsi_uevent_e event); |
7b8631b53 [SCSI] iscsi: sep... |
271 |
extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, |
6a8a0d362 [SCSI] iscsi: pas... |
272 |
struct iscsi_transport *t, |
5d91e209f [SCSI] iscsi: rem... |
273 |
int dd_size, |
6a8a0d362 [SCSI] iscsi: pas... |
274 |
unsigned int target_id); |
8434aa8b6 [SCSI] iscsi: bre... |
275 276 |
extern void iscsi_remove_session(struct iscsi_cls_session *session); extern void iscsi_free_session(struct iscsi_cls_session *session); |
7b8631b53 [SCSI] iscsi: sep... |
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 [SCSI] iscsi: rem... |
279 |
int dd_size, uint32_t cid); |
7b8631b53 [SCSI] iscsi: sep... |
280 |
extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); |
30a6c6523 [SCSI] iscsi: fix... |
281 282 |
extern void iscsi_unblock_session(struct iscsi_cls_session *session); extern void iscsi_block_session(struct iscsi_cls_session *session); |
8aae18adb [SCSI] iscsi clas... |
283 |
extern int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time); |
d82ff9be7 [SCSI] iscsi clas... |
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 [SCSI] iscsi_tran... |
287 |
extern int iscsi_block_scsi_eh(struct scsi_cmnd *cmd); |
8d07913db [SCSI] iscsi clas... |
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 [SCSI] iscsi: add... |
294 |
|
1da177e4c Linux-2.6.12-rc2 |
295 |
#endif |