]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/scsi/scsi_transport_iscsi.c
arm: imx6: defconfig: update tx6 defconfigs
[karo-tx-linux.git] / drivers / scsi / scsi_transport_iscsi.c
1 /*
2  * iSCSI transport class definitions
3  *
4  * Copyright (C) IBM Corporation, 2004
5  * Copyright (C) Mike Christie, 2004 - 2005
6  * Copyright (C) Dmitry Yusupov, 2004 - 2005
7  * Copyright (C) Alex Aizman, 2004 - 2005
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22  */
23 #include <linux/module.h>
24 #include <linux/mutex.h>
25 #include <linux/slab.h>
26 #include <linux/bsg-lib.h>
27 #include <linux/idr.h>
28 #include <net/tcp.h>
29 #include <scsi/scsi.h>
30 #include <scsi/scsi_host.h>
31 #include <scsi/scsi_device.h>
32 #include <scsi/scsi_transport.h>
33 #include <scsi/scsi_transport_iscsi.h>
34 #include <scsi/iscsi_if.h>
35 #include <scsi/scsi_cmnd.h>
36 #include <scsi/scsi_bsg_iscsi.h>
37
38 #define ISCSI_TRANSPORT_VERSION "2.0-870"
39
40 static int dbg_session;
41 module_param_named(debug_session, dbg_session, int,
42                    S_IRUGO | S_IWUSR);
43 MODULE_PARM_DESC(debug_session,
44                  "Turn on debugging for sessions in scsi_transport_iscsi "
45                  "module. Set to 1 to turn on, and zero to turn off. Default "
46                  "is off.");
47
48 static int dbg_conn;
49 module_param_named(debug_conn, dbg_conn, int,
50                    S_IRUGO | S_IWUSR);
51 MODULE_PARM_DESC(debug_conn,
52                  "Turn on debugging for connections in scsi_transport_iscsi "
53                  "module. Set to 1 to turn on, and zero to turn off. Default "
54                  "is off.");
55
56 #define ISCSI_DBG_TRANS_SESSION(_session, dbg_fmt, arg...)              \
57         do {                                                            \
58                 if (dbg_session)                                        \
59                         iscsi_cls_session_printk(KERN_INFO, _session,   \
60                                                  "%s: " dbg_fmt,        \
61                                                  __func__, ##arg);      \
62         } while (0);
63
64 #define ISCSI_DBG_TRANS_CONN(_conn, dbg_fmt, arg...)                    \
65         do {                                                            \
66                 if (dbg_conn)                                           \
67                         iscsi_cls_conn_printk(KERN_INFO, _conn,         \
68                                               "%s: " dbg_fmt,           \
69                                               __func__, ##arg); \
70         } while (0);
71
72 struct iscsi_internal {
73         struct scsi_transport_template t;
74         struct iscsi_transport *iscsi_transport;
75         struct list_head list;
76         struct device dev;
77
78         struct transport_container conn_cont;
79         struct transport_container session_cont;
80 };
81
82 static atomic_t iscsi_session_nr; /* sysfs session id for next new session */
83 static struct workqueue_struct *iscsi_eh_timer_workq;
84
85 static DEFINE_IDA(iscsi_sess_ida);
86 /*
87  * list of registered transports and lock that must
88  * be held while accessing list. The iscsi_transport_lock must
89  * be acquired after the rx_queue_mutex.
90  */
91 static LIST_HEAD(iscsi_transports);
92 static DEFINE_SPINLOCK(iscsi_transport_lock);
93
94 #define to_iscsi_internal(tmpl) \
95         container_of(tmpl, struct iscsi_internal, t)
96
97 #define dev_to_iscsi_internal(_dev) \
98         container_of(_dev, struct iscsi_internal, dev)
99
100 static void iscsi_transport_release(struct device *dev)
101 {
102         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
103         kfree(priv);
104 }
105
106 /*
107  * iscsi_transport_class represents the iscsi_transports that are
108  * registered.
109  */
110 static struct class iscsi_transport_class = {
111         .name = "iscsi_transport",
112         .dev_release = iscsi_transport_release,
113 };
114
115 static ssize_t
116 show_transport_handle(struct device *dev, struct device_attribute *attr,
117                       char *buf)
118 {
119         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
120         return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
121 }
122 static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
123
124 #define show_transport_attr(name, format)                               \
125 static ssize_t                                                          \
126 show_transport_##name(struct device *dev,                               \
127                       struct device_attribute *attr,char *buf)          \
128 {                                                                       \
129         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);       \
130         return sprintf(buf, format"\n", priv->iscsi_transport->name);   \
131 }                                                                       \
132 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
133
134 show_transport_attr(caps, "0x%x");
135
136 static struct attribute *iscsi_transport_attrs[] = {
137         &dev_attr_handle.attr,
138         &dev_attr_caps.attr,
139         NULL,
140 };
141
142 static struct attribute_group iscsi_transport_group = {
143         .attrs = iscsi_transport_attrs,
144 };
145
146 /*
147  * iSCSI endpoint attrs
148  */
149 #define iscsi_dev_to_endpoint(_dev) \
150         container_of(_dev, struct iscsi_endpoint, dev)
151
152 #define ISCSI_ATTR(_prefix,_name,_mode,_show,_store)    \
153 struct device_attribute dev_attr_##_prefix##_##_name =  \
154         __ATTR(_name,_mode,_show,_store)
155
156 static void iscsi_endpoint_release(struct device *dev)
157 {
158         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
159         kfree(ep);
160 }
161
162 static struct class iscsi_endpoint_class = {
163         .name = "iscsi_endpoint",
164         .dev_release = iscsi_endpoint_release,
165 };
166
167 static ssize_t
168 show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf)
169 {
170         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
171         return sprintf(buf, "%llu\n", (unsigned long long) ep->id);
172 }
173 static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
174
175 static struct attribute *iscsi_endpoint_attrs[] = {
176         &dev_attr_ep_handle.attr,
177         NULL,
178 };
179
180 static struct attribute_group iscsi_endpoint_group = {
181         .attrs = iscsi_endpoint_attrs,
182 };
183
184 #define ISCSI_MAX_EPID -1
185
186 static int iscsi_match_epid(struct device *dev, const void *data)
187 {
188         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
189         const uint64_t *epid = data;
190
191         return *epid == ep->id;
192 }
193
194 struct iscsi_endpoint *
195 iscsi_create_endpoint(int dd_size)
196 {
197         struct device *dev;
198         struct iscsi_endpoint *ep;
199         uint64_t id;
200         int err;
201
202         for (id = 1; id < ISCSI_MAX_EPID; id++) {
203                 dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
204                                         iscsi_match_epid);
205                 if (!dev)
206                         break;
207         }
208         if (id == ISCSI_MAX_EPID) {
209                 printk(KERN_ERR "Too many connections. Max supported %u\n",
210                        ISCSI_MAX_EPID - 1);
211                 return NULL;
212         }
213
214         ep = kzalloc(sizeof(*ep) + dd_size, GFP_KERNEL);
215         if (!ep)
216                 return NULL;
217
218         ep->id = id;
219         ep->dev.class = &iscsi_endpoint_class;
220         dev_set_name(&ep->dev, "ep-%llu", (unsigned long long) id);
221         err = device_register(&ep->dev);
222         if (err)
223                 goto free_ep;
224
225         err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
226         if (err)
227                 goto unregister_dev;
228
229         if (dd_size)
230                 ep->dd_data = &ep[1];
231         return ep;
232
233 unregister_dev:
234         device_unregister(&ep->dev);
235         return NULL;
236
237 free_ep:
238         kfree(ep);
239         return NULL;
240 }
241 EXPORT_SYMBOL_GPL(iscsi_create_endpoint);
242
243 void iscsi_destroy_endpoint(struct iscsi_endpoint *ep)
244 {
245         sysfs_remove_group(&ep->dev.kobj, &iscsi_endpoint_group);
246         device_unregister(&ep->dev);
247 }
248 EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint);
249
250 struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
251 {
252         struct iscsi_endpoint *ep;
253         struct device *dev;
254
255         dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
256                                 iscsi_match_epid);
257         if (!dev)
258                 return NULL;
259
260         ep = iscsi_dev_to_endpoint(dev);
261         /*
262          * we can drop this now because the interface will prevent
263          * removals and lookups from racing.
264          */
265         put_device(dev);
266         return ep;
267 }
268 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint);
269
270 /*
271  * Interface to display network param to sysfs
272  */
273
274 static void iscsi_iface_release(struct device *dev)
275 {
276         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
277         struct device *parent = iface->dev.parent;
278
279         kfree(iface);
280         put_device(parent);
281 }
282
283
284 static struct class iscsi_iface_class = {
285         .name = "iscsi_iface",
286         .dev_release = iscsi_iface_release,
287 };
288
289 #define ISCSI_IFACE_ATTR(_prefix, _name, _mode, _show, _store)  \
290 struct device_attribute dev_attr_##_prefix##_##_name =          \
291         __ATTR(_name, _mode, _show, _store)
292
293 /* iface attrs show */
294 #define iscsi_iface_attr_show(type, name, param_type, param)            \
295 static ssize_t                                                          \
296 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
297                      char *buf)                                         \
298 {                                                                       \
299         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);            \
300         struct iscsi_transport *t = iface->transport;                   \
301         return t->get_iface_param(iface, param_type, param, buf);       \
302 }                                                                       \
303
304 #define iscsi_iface_net_attr(type, name, param)                         \
305         iscsi_iface_attr_show(type, name, ISCSI_NET_PARAM, param)       \
306 static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
307
308 /* generic read only ipvi4 attribute */
309 iscsi_iface_net_attr(ipv4_iface, ipaddress, ISCSI_NET_PARAM_IPV4_ADDR);
310 iscsi_iface_net_attr(ipv4_iface, gateway, ISCSI_NET_PARAM_IPV4_GW);
311 iscsi_iface_net_attr(ipv4_iface, subnet, ISCSI_NET_PARAM_IPV4_SUBNET);
312 iscsi_iface_net_attr(ipv4_iface, bootproto, ISCSI_NET_PARAM_IPV4_BOOTPROTO);
313
314 /* generic read only ipv6 attribute */
315 iscsi_iface_net_attr(ipv6_iface, ipaddress, ISCSI_NET_PARAM_IPV6_ADDR);
316 iscsi_iface_net_attr(ipv6_iface, link_local_addr, ISCSI_NET_PARAM_IPV6_LINKLOCAL);
317 iscsi_iface_net_attr(ipv6_iface, router_addr, ISCSI_NET_PARAM_IPV6_ROUTER);
318 iscsi_iface_net_attr(ipv6_iface, ipaddr_autocfg,
319                      ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG);
320 iscsi_iface_net_attr(ipv6_iface, link_local_autocfg,
321                      ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG);
322
323 /* common read only iface attribute */
324 iscsi_iface_net_attr(iface, enabled, ISCSI_NET_PARAM_IFACE_ENABLE);
325 iscsi_iface_net_attr(iface, vlan_id, ISCSI_NET_PARAM_VLAN_ID);
326 iscsi_iface_net_attr(iface, vlan_priority, ISCSI_NET_PARAM_VLAN_PRIORITY);
327 iscsi_iface_net_attr(iface, vlan_enabled, ISCSI_NET_PARAM_VLAN_ENABLED);
328 iscsi_iface_net_attr(iface, mtu, ISCSI_NET_PARAM_MTU);
329 iscsi_iface_net_attr(iface, port, ISCSI_NET_PARAM_PORT);
330
331 static umode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
332                                           struct attribute *attr, int i)
333 {
334         struct device *dev = container_of(kobj, struct device, kobj);
335         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
336         struct iscsi_transport *t = iface->transport;
337         int param;
338
339         if (attr == &dev_attr_iface_enabled.attr)
340                 param = ISCSI_NET_PARAM_IFACE_ENABLE;
341         else if (attr == &dev_attr_iface_vlan_id.attr)
342                 param = ISCSI_NET_PARAM_VLAN_ID;
343         else if (attr == &dev_attr_iface_vlan_priority.attr)
344                 param = ISCSI_NET_PARAM_VLAN_PRIORITY;
345         else if (attr == &dev_attr_iface_vlan_enabled.attr)
346                 param = ISCSI_NET_PARAM_VLAN_ENABLED;
347         else if (attr == &dev_attr_iface_mtu.attr)
348                 param = ISCSI_NET_PARAM_MTU;
349         else if (attr == &dev_attr_iface_port.attr)
350                 param = ISCSI_NET_PARAM_PORT;
351         else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
352                 if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
353                         param = ISCSI_NET_PARAM_IPV4_ADDR;
354                 else if (attr == &dev_attr_ipv4_iface_gateway.attr)
355                         param = ISCSI_NET_PARAM_IPV4_GW;
356                 else if (attr == &dev_attr_ipv4_iface_subnet.attr)
357                         param = ISCSI_NET_PARAM_IPV4_SUBNET;
358                 else if (attr == &dev_attr_ipv4_iface_bootproto.attr)
359                         param = ISCSI_NET_PARAM_IPV4_BOOTPROTO;
360                 else
361                         return 0;
362         } else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6) {
363                 if (attr == &dev_attr_ipv6_iface_ipaddress.attr)
364                         param = ISCSI_NET_PARAM_IPV6_ADDR;
365                 else if (attr == &dev_attr_ipv6_iface_link_local_addr.attr)
366                         param = ISCSI_NET_PARAM_IPV6_LINKLOCAL;
367                 else if (attr == &dev_attr_ipv6_iface_router_addr.attr)
368                         param = ISCSI_NET_PARAM_IPV6_ROUTER;
369                 else if (attr == &dev_attr_ipv6_iface_ipaddr_autocfg.attr)
370                         param = ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG;
371                 else if (attr == &dev_attr_ipv6_iface_link_local_autocfg.attr)
372                         param = ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG;
373                 else
374                         return 0;
375         } else {
376                 WARN_ONCE(1, "Invalid iface attr");
377                 return 0;
378         }
379
380         return t->attr_is_visible(ISCSI_NET_PARAM, param);
381 }
382
383 static struct attribute *iscsi_iface_attrs[] = {
384         &dev_attr_iface_enabled.attr,
385         &dev_attr_iface_vlan_id.attr,
386         &dev_attr_iface_vlan_priority.attr,
387         &dev_attr_iface_vlan_enabled.attr,
388         &dev_attr_ipv4_iface_ipaddress.attr,
389         &dev_attr_ipv4_iface_gateway.attr,
390         &dev_attr_ipv4_iface_subnet.attr,
391         &dev_attr_ipv4_iface_bootproto.attr,
392         &dev_attr_ipv6_iface_ipaddress.attr,
393         &dev_attr_ipv6_iface_link_local_addr.attr,
394         &dev_attr_ipv6_iface_router_addr.attr,
395         &dev_attr_ipv6_iface_ipaddr_autocfg.attr,
396         &dev_attr_ipv6_iface_link_local_autocfg.attr,
397         &dev_attr_iface_mtu.attr,
398         &dev_attr_iface_port.attr,
399         NULL,
400 };
401
402 static struct attribute_group iscsi_iface_group = {
403         .attrs = iscsi_iface_attrs,
404         .is_visible = iscsi_iface_attr_is_visible,
405 };
406
407 struct iscsi_iface *
408 iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *transport,
409                    uint32_t iface_type, uint32_t iface_num, int dd_size)
410 {
411         struct iscsi_iface *iface;
412         int err;
413
414         iface = kzalloc(sizeof(*iface) + dd_size, GFP_KERNEL);
415         if (!iface)
416                 return NULL;
417
418         iface->transport = transport;
419         iface->iface_type = iface_type;
420         iface->iface_num = iface_num;
421         iface->dev.release = iscsi_iface_release;
422         iface->dev.class = &iscsi_iface_class;
423         /* parent reference released in iscsi_iface_release */
424         iface->dev.parent = get_device(&shost->shost_gendev);
425         if (iface_type == ISCSI_IFACE_TYPE_IPV4)
426                 dev_set_name(&iface->dev, "ipv4-iface-%u-%u", shost->host_no,
427                              iface_num);
428         else
429                 dev_set_name(&iface->dev, "ipv6-iface-%u-%u", shost->host_no,
430                              iface_num);
431
432         err = device_register(&iface->dev);
433         if (err)
434                 goto free_iface;
435
436         err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group);
437         if (err)
438                 goto unreg_iface;
439
440         if (dd_size)
441                 iface->dd_data = &iface[1];
442         return iface;
443
444 unreg_iface:
445         device_unregister(&iface->dev);
446         return NULL;
447
448 free_iface:
449         put_device(iface->dev.parent);
450         kfree(iface);
451         return NULL;
452 }
453 EXPORT_SYMBOL_GPL(iscsi_create_iface);
454
455 void iscsi_destroy_iface(struct iscsi_iface *iface)
456 {
457         sysfs_remove_group(&iface->dev.kobj, &iscsi_iface_group);
458         device_unregister(&iface->dev);
459 }
460 EXPORT_SYMBOL_GPL(iscsi_destroy_iface);
461
462 /*
463  * Interface to display flash node params to sysfs
464  */
465
466 #define ISCSI_FLASHNODE_ATTR(_prefix, _name, _mode, _show, _store)      \
467 struct device_attribute dev_attr_##_prefix##_##_name =                  \
468         __ATTR(_name, _mode, _show, _store)
469
470 /* flash node session attrs show */
471 #define iscsi_flashnode_sess_attr_show(type, name, param)               \
472 static ssize_t                                                          \
473 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
474                      char *buf)                                         \
475 {                                                                       \
476         struct iscsi_bus_flash_session *fnode_sess =                    \
477                                         iscsi_dev_to_flash_session(dev);\
478         struct iscsi_transport *t = fnode_sess->transport;              \
479         return t->get_flashnode_param(fnode_sess, param, buf);          \
480 }                                                                       \
481
482
483 #define iscsi_flashnode_sess_attr(type, name, param)                    \
484         iscsi_flashnode_sess_attr_show(type, name, param)               \
485 static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO,                        \
486                             show_##type##_##name, NULL);
487
488 /* Flash node session attributes */
489
490 iscsi_flashnode_sess_attr(fnode, auto_snd_tgt_disable,
491                           ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE);
492 iscsi_flashnode_sess_attr(fnode, discovery_session,
493                           ISCSI_FLASHNODE_DISCOVERY_SESS);
494 iscsi_flashnode_sess_attr(fnode, portal_type, ISCSI_FLASHNODE_PORTAL_TYPE);
495 iscsi_flashnode_sess_attr(fnode, entry_enable, ISCSI_FLASHNODE_ENTRY_EN);
496 iscsi_flashnode_sess_attr(fnode, immediate_data, ISCSI_FLASHNODE_IMM_DATA_EN);
497 iscsi_flashnode_sess_attr(fnode, initial_r2t, ISCSI_FLASHNODE_INITIAL_R2T_EN);
498 iscsi_flashnode_sess_attr(fnode, data_seq_in_order,
499                           ISCSI_FLASHNODE_DATASEQ_INORDER);
500 iscsi_flashnode_sess_attr(fnode, data_pdu_in_order,
501                           ISCSI_FLASHNODE_PDU_INORDER);
502 iscsi_flashnode_sess_attr(fnode, chap_auth, ISCSI_FLASHNODE_CHAP_AUTH_EN);
503 iscsi_flashnode_sess_attr(fnode, discovery_logout,
504                           ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN);
505 iscsi_flashnode_sess_attr(fnode, bidi_chap, ISCSI_FLASHNODE_BIDI_CHAP_EN);
506 iscsi_flashnode_sess_attr(fnode, discovery_auth_optional,
507                           ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL);
508 iscsi_flashnode_sess_attr(fnode, erl, ISCSI_FLASHNODE_ERL);
509 iscsi_flashnode_sess_attr(fnode, first_burst_len, ISCSI_FLASHNODE_FIRST_BURST);
510 iscsi_flashnode_sess_attr(fnode, def_time2wait, ISCSI_FLASHNODE_DEF_TIME2WAIT);
511 iscsi_flashnode_sess_attr(fnode, def_time2retain,
512                           ISCSI_FLASHNODE_DEF_TIME2RETAIN);
513 iscsi_flashnode_sess_attr(fnode, max_outstanding_r2t, ISCSI_FLASHNODE_MAX_R2T);
514 iscsi_flashnode_sess_attr(fnode, isid, ISCSI_FLASHNODE_ISID);
515 iscsi_flashnode_sess_attr(fnode, tsid, ISCSI_FLASHNODE_TSID);
516 iscsi_flashnode_sess_attr(fnode, max_burst_len, ISCSI_FLASHNODE_MAX_BURST);
517 iscsi_flashnode_sess_attr(fnode, def_taskmgmt_tmo,
518                           ISCSI_FLASHNODE_DEF_TASKMGMT_TMO);
519 iscsi_flashnode_sess_attr(fnode, targetalias, ISCSI_FLASHNODE_ALIAS);
520 iscsi_flashnode_sess_attr(fnode, targetname, ISCSI_FLASHNODE_NAME);
521 iscsi_flashnode_sess_attr(fnode, tpgt, ISCSI_FLASHNODE_TPGT);
522 iscsi_flashnode_sess_attr(fnode, discovery_parent_idx,
523                           ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX);
524 iscsi_flashnode_sess_attr(fnode, discovery_parent_type,
525                           ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE);
526 iscsi_flashnode_sess_attr(fnode, chap_in_idx, ISCSI_FLASHNODE_CHAP_IN_IDX);
527 iscsi_flashnode_sess_attr(fnode, chap_out_idx, ISCSI_FLASHNODE_CHAP_OUT_IDX);
528 iscsi_flashnode_sess_attr(fnode, username, ISCSI_FLASHNODE_USERNAME);
529 iscsi_flashnode_sess_attr(fnode, username_in, ISCSI_FLASHNODE_USERNAME_IN);
530 iscsi_flashnode_sess_attr(fnode, password, ISCSI_FLASHNODE_PASSWORD);
531 iscsi_flashnode_sess_attr(fnode, password_in, ISCSI_FLASHNODE_PASSWORD_IN);
532 iscsi_flashnode_sess_attr(fnode, is_boot_target, ISCSI_FLASHNODE_IS_BOOT_TGT);
533
534 static struct attribute *iscsi_flashnode_sess_attrs[] = {
535         &dev_attr_fnode_auto_snd_tgt_disable.attr,
536         &dev_attr_fnode_discovery_session.attr,
537         &dev_attr_fnode_portal_type.attr,
538         &dev_attr_fnode_entry_enable.attr,
539         &dev_attr_fnode_immediate_data.attr,
540         &dev_attr_fnode_initial_r2t.attr,
541         &dev_attr_fnode_data_seq_in_order.attr,
542         &dev_attr_fnode_data_pdu_in_order.attr,
543         &dev_attr_fnode_chap_auth.attr,
544         &dev_attr_fnode_discovery_logout.attr,
545         &dev_attr_fnode_bidi_chap.attr,
546         &dev_attr_fnode_discovery_auth_optional.attr,
547         &dev_attr_fnode_erl.attr,
548         &dev_attr_fnode_first_burst_len.attr,
549         &dev_attr_fnode_def_time2wait.attr,
550         &dev_attr_fnode_def_time2retain.attr,
551         &dev_attr_fnode_max_outstanding_r2t.attr,
552         &dev_attr_fnode_isid.attr,
553         &dev_attr_fnode_tsid.attr,
554         &dev_attr_fnode_max_burst_len.attr,
555         &dev_attr_fnode_def_taskmgmt_tmo.attr,
556         &dev_attr_fnode_targetalias.attr,
557         &dev_attr_fnode_targetname.attr,
558         &dev_attr_fnode_tpgt.attr,
559         &dev_attr_fnode_discovery_parent_idx.attr,
560         &dev_attr_fnode_discovery_parent_type.attr,
561         &dev_attr_fnode_chap_in_idx.attr,
562         &dev_attr_fnode_chap_out_idx.attr,
563         &dev_attr_fnode_username.attr,
564         &dev_attr_fnode_username_in.attr,
565         &dev_attr_fnode_password.attr,
566         &dev_attr_fnode_password_in.attr,
567         &dev_attr_fnode_is_boot_target.attr,
568         NULL,
569 };
570
571 static umode_t iscsi_flashnode_sess_attr_is_visible(struct kobject *kobj,
572                                                     struct attribute *attr,
573                                                     int i)
574 {
575         struct device *dev = container_of(kobj, struct device, kobj);
576         struct iscsi_bus_flash_session *fnode_sess =
577                                                 iscsi_dev_to_flash_session(dev);
578         struct iscsi_transport *t = fnode_sess->transport;
579         int param;
580
581         if (attr == &dev_attr_fnode_auto_snd_tgt_disable.attr) {
582                 param = ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE;
583         } else if (attr == &dev_attr_fnode_discovery_session.attr) {
584                 param = ISCSI_FLASHNODE_DISCOVERY_SESS;
585         } else if (attr == &dev_attr_fnode_portal_type.attr) {
586                 param = ISCSI_FLASHNODE_PORTAL_TYPE;
587         } else if (attr == &dev_attr_fnode_entry_enable.attr) {
588                 param = ISCSI_FLASHNODE_ENTRY_EN;
589         } else if (attr == &dev_attr_fnode_immediate_data.attr) {
590                 param = ISCSI_FLASHNODE_IMM_DATA_EN;
591         } else if (attr == &dev_attr_fnode_initial_r2t.attr) {
592                 param = ISCSI_FLASHNODE_INITIAL_R2T_EN;
593         } else if (attr == &dev_attr_fnode_data_seq_in_order.attr) {
594                 param = ISCSI_FLASHNODE_DATASEQ_INORDER;
595         } else if (attr == &dev_attr_fnode_data_pdu_in_order.attr) {
596                 param = ISCSI_FLASHNODE_PDU_INORDER;
597         } else if (attr == &dev_attr_fnode_chap_auth.attr) {
598                 param = ISCSI_FLASHNODE_CHAP_AUTH_EN;
599         } else if (attr == &dev_attr_fnode_discovery_logout.attr) {
600                 param = ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN;
601         } else if (attr == &dev_attr_fnode_bidi_chap.attr) {
602                 param = ISCSI_FLASHNODE_BIDI_CHAP_EN;
603         } else if (attr == &dev_attr_fnode_discovery_auth_optional.attr) {
604                 param = ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL;
605         } else if (attr == &dev_attr_fnode_erl.attr) {
606                 param = ISCSI_FLASHNODE_ERL;
607         } else if (attr == &dev_attr_fnode_first_burst_len.attr) {
608                 param = ISCSI_FLASHNODE_FIRST_BURST;
609         } else if (attr == &dev_attr_fnode_def_time2wait.attr) {
610                 param = ISCSI_FLASHNODE_DEF_TIME2WAIT;
611         } else if (attr == &dev_attr_fnode_def_time2retain.attr) {
612                 param = ISCSI_FLASHNODE_DEF_TIME2RETAIN;
613         } else if (attr == &dev_attr_fnode_max_outstanding_r2t.attr) {
614                 param = ISCSI_FLASHNODE_MAX_R2T;
615         } else if (attr == &dev_attr_fnode_isid.attr) {
616                 param = ISCSI_FLASHNODE_ISID;
617         } else if (attr == &dev_attr_fnode_tsid.attr) {
618                 param = ISCSI_FLASHNODE_TSID;
619         } else if (attr == &dev_attr_fnode_max_burst_len.attr) {
620                 param = ISCSI_FLASHNODE_MAX_BURST;
621         } else if (attr == &dev_attr_fnode_def_taskmgmt_tmo.attr) {
622                 param = ISCSI_FLASHNODE_DEF_TASKMGMT_TMO;
623         } else if (attr == &dev_attr_fnode_targetalias.attr) {
624                 param = ISCSI_FLASHNODE_ALIAS;
625         } else if (attr == &dev_attr_fnode_targetname.attr) {
626                 param = ISCSI_FLASHNODE_NAME;
627         } else if (attr == &dev_attr_fnode_tpgt.attr) {
628                 param = ISCSI_FLASHNODE_TPGT;
629         } else if (attr == &dev_attr_fnode_discovery_parent_idx.attr) {
630                 param = ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX;
631         } else if (attr == &dev_attr_fnode_discovery_parent_type.attr) {
632                 param = ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE;
633         } else if (attr == &dev_attr_fnode_chap_in_idx.attr) {
634                 param = ISCSI_FLASHNODE_CHAP_IN_IDX;
635         } else if (attr == &dev_attr_fnode_chap_out_idx.attr) {
636                 param = ISCSI_FLASHNODE_CHAP_OUT_IDX;
637         } else if (attr == &dev_attr_fnode_username.attr) {
638                 param = ISCSI_FLASHNODE_USERNAME;
639         } else if (attr == &dev_attr_fnode_username_in.attr) {
640                 param = ISCSI_FLASHNODE_USERNAME_IN;
641         } else if (attr == &dev_attr_fnode_password.attr) {
642                 param = ISCSI_FLASHNODE_PASSWORD;
643         } else if (attr == &dev_attr_fnode_password_in.attr) {
644                 param = ISCSI_FLASHNODE_PASSWORD_IN;
645         } else if (attr == &dev_attr_fnode_is_boot_target.attr) {
646                 param = ISCSI_FLASHNODE_IS_BOOT_TGT;
647         } else {
648                 WARN_ONCE(1, "Invalid flashnode session attr");
649                 return 0;
650         }
651
652         return t->attr_is_visible(ISCSI_FLASHNODE_PARAM, param);
653 }
654
655 static struct attribute_group iscsi_flashnode_sess_attr_group = {
656         .attrs = iscsi_flashnode_sess_attrs,
657         .is_visible = iscsi_flashnode_sess_attr_is_visible,
658 };
659
660 static const struct attribute_group *iscsi_flashnode_sess_attr_groups[] = {
661         &iscsi_flashnode_sess_attr_group,
662         NULL,
663 };
664
665 static void iscsi_flashnode_sess_release(struct device *dev)
666 {
667         struct iscsi_bus_flash_session *fnode_sess =
668                                                 iscsi_dev_to_flash_session(dev);
669
670         kfree(fnode_sess->targetname);
671         kfree(fnode_sess->targetalias);
672         kfree(fnode_sess->portal_type);
673         kfree(fnode_sess);
674 }
675
676 struct device_type iscsi_flashnode_sess_dev_type = {
677         .name = "iscsi_flashnode_sess_dev_type",
678         .groups = iscsi_flashnode_sess_attr_groups,
679         .release = iscsi_flashnode_sess_release,
680 };
681
682 /* flash node connection attrs show */
683 #define iscsi_flashnode_conn_attr_show(type, name, param)               \
684 static ssize_t                                                          \
685 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
686                      char *buf)                                         \
687 {                                                                       \
688         struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);\
689         struct iscsi_bus_flash_session *fnode_sess =                    \
690                                 iscsi_flash_conn_to_flash_session(fnode_conn);\
691         struct iscsi_transport *t = fnode_conn->transport;              \
692         return t->get_flashnode_param(fnode_sess, param, buf);          \
693 }                                                                       \
694
695
696 #define iscsi_flashnode_conn_attr(type, name, param)                    \
697         iscsi_flashnode_conn_attr_show(type, name, param)               \
698 static ISCSI_FLASHNODE_ATTR(type, name, S_IRUGO,                        \
699                             show_##type##_##name, NULL);
700
701 /* Flash node connection attributes */
702
703 iscsi_flashnode_conn_attr(fnode, is_fw_assigned_ipv6,
704                           ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6);
705 iscsi_flashnode_conn_attr(fnode, header_digest, ISCSI_FLASHNODE_HDR_DGST_EN);
706 iscsi_flashnode_conn_attr(fnode, data_digest, ISCSI_FLASHNODE_DATA_DGST_EN);
707 iscsi_flashnode_conn_attr(fnode, snack_req, ISCSI_FLASHNODE_SNACK_REQ_EN);
708 iscsi_flashnode_conn_attr(fnode, tcp_timestamp_stat,
709                           ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT);
710 iscsi_flashnode_conn_attr(fnode, tcp_nagle_disable,
711                           ISCSI_FLASHNODE_TCP_NAGLE_DISABLE);
712 iscsi_flashnode_conn_attr(fnode, tcp_wsf_disable,
713                           ISCSI_FLASHNODE_TCP_WSF_DISABLE);
714 iscsi_flashnode_conn_attr(fnode, tcp_timer_scale,
715                           ISCSI_FLASHNODE_TCP_TIMER_SCALE);
716 iscsi_flashnode_conn_attr(fnode, tcp_timestamp_enable,
717                           ISCSI_FLASHNODE_TCP_TIMESTAMP_EN);
718 iscsi_flashnode_conn_attr(fnode, fragment_disable,
719                           ISCSI_FLASHNODE_IP_FRAG_DISABLE);
720 iscsi_flashnode_conn_attr(fnode, keepalive_tmo, ISCSI_FLASHNODE_KEEPALIVE_TMO);
721 iscsi_flashnode_conn_attr(fnode, port, ISCSI_FLASHNODE_PORT);
722 iscsi_flashnode_conn_attr(fnode, ipaddress, ISCSI_FLASHNODE_IPADDR);
723 iscsi_flashnode_conn_attr(fnode, max_recv_dlength,
724                           ISCSI_FLASHNODE_MAX_RECV_DLENGTH);
725 iscsi_flashnode_conn_attr(fnode, max_xmit_dlength,
726                           ISCSI_FLASHNODE_MAX_XMIT_DLENGTH);
727 iscsi_flashnode_conn_attr(fnode, local_port, ISCSI_FLASHNODE_LOCAL_PORT);
728 iscsi_flashnode_conn_attr(fnode, ipv4_tos, ISCSI_FLASHNODE_IPV4_TOS);
729 iscsi_flashnode_conn_attr(fnode, ipv6_traffic_class, ISCSI_FLASHNODE_IPV6_TC);
730 iscsi_flashnode_conn_attr(fnode, ipv6_flow_label,
731                           ISCSI_FLASHNODE_IPV6_FLOW_LABEL);
732 iscsi_flashnode_conn_attr(fnode, redirect_ipaddr,
733                           ISCSI_FLASHNODE_REDIRECT_IPADDR);
734 iscsi_flashnode_conn_attr(fnode, max_segment_size,
735                           ISCSI_FLASHNODE_MAX_SEGMENT_SIZE);
736 iscsi_flashnode_conn_attr(fnode, link_local_ipv6,
737                           ISCSI_FLASHNODE_LINK_LOCAL_IPV6);
738 iscsi_flashnode_conn_attr(fnode, tcp_xmit_wsf, ISCSI_FLASHNODE_TCP_XMIT_WSF);
739 iscsi_flashnode_conn_attr(fnode, tcp_recv_wsf, ISCSI_FLASHNODE_TCP_RECV_WSF);
740 iscsi_flashnode_conn_attr(fnode, statsn, ISCSI_FLASHNODE_STATSN);
741 iscsi_flashnode_conn_attr(fnode, exp_statsn, ISCSI_FLASHNODE_EXP_STATSN);
742
743 static struct attribute *iscsi_flashnode_conn_attrs[] = {
744         &dev_attr_fnode_is_fw_assigned_ipv6.attr,
745         &dev_attr_fnode_header_digest.attr,
746         &dev_attr_fnode_data_digest.attr,
747         &dev_attr_fnode_snack_req.attr,
748         &dev_attr_fnode_tcp_timestamp_stat.attr,
749         &dev_attr_fnode_tcp_nagle_disable.attr,
750         &dev_attr_fnode_tcp_wsf_disable.attr,
751         &dev_attr_fnode_tcp_timer_scale.attr,
752         &dev_attr_fnode_tcp_timestamp_enable.attr,
753         &dev_attr_fnode_fragment_disable.attr,
754         &dev_attr_fnode_max_recv_dlength.attr,
755         &dev_attr_fnode_max_xmit_dlength.attr,
756         &dev_attr_fnode_keepalive_tmo.attr,
757         &dev_attr_fnode_port.attr,
758         &dev_attr_fnode_ipaddress.attr,
759         &dev_attr_fnode_redirect_ipaddr.attr,
760         &dev_attr_fnode_max_segment_size.attr,
761         &dev_attr_fnode_local_port.attr,
762         &dev_attr_fnode_ipv4_tos.attr,
763         &dev_attr_fnode_ipv6_traffic_class.attr,
764         &dev_attr_fnode_ipv6_flow_label.attr,
765         &dev_attr_fnode_link_local_ipv6.attr,
766         &dev_attr_fnode_tcp_xmit_wsf.attr,
767         &dev_attr_fnode_tcp_recv_wsf.attr,
768         &dev_attr_fnode_statsn.attr,
769         &dev_attr_fnode_exp_statsn.attr,
770         NULL,
771 };
772
773 static umode_t iscsi_flashnode_conn_attr_is_visible(struct kobject *kobj,
774                                                     struct attribute *attr,
775                                                     int i)
776 {
777         struct device *dev = container_of(kobj, struct device, kobj);
778         struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);
779         struct iscsi_transport *t = fnode_conn->transport;
780         int param;
781
782         if (attr == &dev_attr_fnode_is_fw_assigned_ipv6.attr) {
783                 param = ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6;
784         } else if (attr == &dev_attr_fnode_header_digest.attr) {
785                 param = ISCSI_FLASHNODE_HDR_DGST_EN;
786         } else if (attr == &dev_attr_fnode_data_digest.attr) {
787                 param = ISCSI_FLASHNODE_DATA_DGST_EN;
788         } else if (attr == &dev_attr_fnode_snack_req.attr) {
789                 param = ISCSI_FLASHNODE_SNACK_REQ_EN;
790         } else if (attr == &dev_attr_fnode_tcp_timestamp_stat.attr) {
791                 param = ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT;
792         } else if (attr == &dev_attr_fnode_tcp_nagle_disable.attr) {
793                 param = ISCSI_FLASHNODE_TCP_NAGLE_DISABLE;
794         } else if (attr == &dev_attr_fnode_tcp_wsf_disable.attr) {
795                 param = ISCSI_FLASHNODE_TCP_WSF_DISABLE;
796         } else if (attr == &dev_attr_fnode_tcp_timer_scale.attr) {
797                 param = ISCSI_FLASHNODE_TCP_TIMER_SCALE;
798         } else if (attr == &dev_attr_fnode_tcp_timestamp_enable.attr) {
799                 param = ISCSI_FLASHNODE_TCP_TIMESTAMP_EN;
800         } else if (attr == &dev_attr_fnode_fragment_disable.attr) {
801                 param = ISCSI_FLASHNODE_IP_FRAG_DISABLE;
802         } else if (attr == &dev_attr_fnode_max_recv_dlength.attr) {
803                 param = ISCSI_FLASHNODE_MAX_RECV_DLENGTH;
804         } else if (attr == &dev_attr_fnode_max_xmit_dlength.attr) {
805                 param = ISCSI_FLASHNODE_MAX_XMIT_DLENGTH;
806         } else if (attr == &dev_attr_fnode_keepalive_tmo.attr) {
807                 param = ISCSI_FLASHNODE_KEEPALIVE_TMO;
808         } else if (attr == &dev_attr_fnode_port.attr) {
809                 param = ISCSI_FLASHNODE_PORT;
810         } else if (attr == &dev_attr_fnode_ipaddress.attr) {
811                 param = ISCSI_FLASHNODE_IPADDR;
812         } else if (attr == &dev_attr_fnode_redirect_ipaddr.attr) {
813                 param = ISCSI_FLASHNODE_REDIRECT_IPADDR;
814         } else if (attr == &dev_attr_fnode_max_segment_size.attr) {
815                 param = ISCSI_FLASHNODE_MAX_SEGMENT_SIZE;
816         } else if (attr == &dev_attr_fnode_local_port.attr) {
817                 param = ISCSI_FLASHNODE_LOCAL_PORT;
818         } else if (attr == &dev_attr_fnode_ipv4_tos.attr) {
819                 param = ISCSI_FLASHNODE_IPV4_TOS;
820         } else if (attr == &dev_attr_fnode_ipv6_traffic_class.attr) {
821                 param = ISCSI_FLASHNODE_IPV6_TC;
822         } else if (attr == &dev_attr_fnode_ipv6_flow_label.attr) {
823                 param = ISCSI_FLASHNODE_IPV6_FLOW_LABEL;
824         } else if (attr == &dev_attr_fnode_link_local_ipv6.attr) {
825                 param = ISCSI_FLASHNODE_LINK_LOCAL_IPV6;
826         } else if (attr == &dev_attr_fnode_tcp_xmit_wsf.attr) {
827                 param = ISCSI_FLASHNODE_TCP_XMIT_WSF;
828         } else if (attr == &dev_attr_fnode_tcp_recv_wsf.attr) {
829                 param = ISCSI_FLASHNODE_TCP_RECV_WSF;
830         } else if (attr == &dev_attr_fnode_statsn.attr) {
831                 param = ISCSI_FLASHNODE_STATSN;
832         } else if (attr == &dev_attr_fnode_exp_statsn.attr) {
833                 param = ISCSI_FLASHNODE_EXP_STATSN;
834         } else {
835                 WARN_ONCE(1, "Invalid flashnode connection attr");
836                 return 0;
837         }
838
839         return t->attr_is_visible(ISCSI_FLASHNODE_PARAM, param);
840 }
841
842 static struct attribute_group iscsi_flashnode_conn_attr_group = {
843         .attrs = iscsi_flashnode_conn_attrs,
844         .is_visible = iscsi_flashnode_conn_attr_is_visible,
845 };
846
847 static const struct attribute_group *iscsi_flashnode_conn_attr_groups[] = {
848         &iscsi_flashnode_conn_attr_group,
849         NULL,
850 };
851
852 static void iscsi_flashnode_conn_release(struct device *dev)
853 {
854         struct iscsi_bus_flash_conn *fnode_conn = iscsi_dev_to_flash_conn(dev);
855
856         kfree(fnode_conn->ipaddress);
857         kfree(fnode_conn->redirect_ipaddr);
858         kfree(fnode_conn->link_local_ipv6_addr);
859         kfree(fnode_conn);
860 }
861
862 struct device_type iscsi_flashnode_conn_dev_type = {
863         .name = "iscsi_flashnode_conn_dev_type",
864         .groups = iscsi_flashnode_conn_attr_groups,
865         .release = iscsi_flashnode_conn_release,
866 };
867
868 struct bus_type iscsi_flashnode_bus;
869
870 int iscsi_flashnode_bus_match(struct device *dev,
871                                      struct device_driver *drv)
872 {
873         if (dev->bus == &iscsi_flashnode_bus)
874                 return 1;
875         return 0;
876 }
877 EXPORT_SYMBOL_GPL(iscsi_flashnode_bus_match);
878
879 struct bus_type iscsi_flashnode_bus = {
880         .name = "iscsi_flashnode",
881         .match = &iscsi_flashnode_bus_match,
882 };
883
884 /**
885  * iscsi_create_flashnode_sess - Add flashnode session entry in sysfs
886  * @shost: pointer to host data
887  * @index: index of flashnode to add in sysfs
888  * @transport: pointer to transport data
889  * @dd_size: total size to allocate
890  *
891  * Adds a sysfs entry for the flashnode session attributes
892  *
893  * Returns:
894  *  pointer to allocated flashnode sess on sucess
895  *  %NULL on failure
896  */
897 struct iscsi_bus_flash_session *
898 iscsi_create_flashnode_sess(struct Scsi_Host *shost, int index,
899                             struct iscsi_transport *transport,
900                             int dd_size)
901 {
902         struct iscsi_bus_flash_session *fnode_sess;
903         int err;
904
905         fnode_sess = kzalloc(sizeof(*fnode_sess) + dd_size, GFP_KERNEL);
906         if (!fnode_sess)
907                 return NULL;
908
909         fnode_sess->transport = transport;
910         fnode_sess->target_id = index;
911         fnode_sess->dev.type = &iscsi_flashnode_sess_dev_type;
912         fnode_sess->dev.bus = &iscsi_flashnode_bus;
913         fnode_sess->dev.parent = &shost->shost_gendev;
914         dev_set_name(&fnode_sess->dev, "flashnode_sess-%u:%u",
915                      shost->host_no, index);
916
917         err = device_register(&fnode_sess->dev);
918         if (err)
919                 goto free_fnode_sess;
920
921         if (dd_size)
922                 fnode_sess->dd_data = &fnode_sess[1];
923
924         return fnode_sess;
925
926 free_fnode_sess:
927         kfree(fnode_sess);
928         return NULL;
929 }
930 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_sess);
931
932 /**
933  * iscsi_create_flashnode_conn - Add flashnode conn entry in sysfs
934  * @shost: pointer to host data
935  * @fnode_sess: pointer to the parent flashnode session entry
936  * @transport: pointer to transport data
937  * @dd_size: total size to allocate
938  *
939  * Adds a sysfs entry for the flashnode connection attributes
940  *
941  * Returns:
942  *  pointer to allocated flashnode conn on success
943  *  %NULL on failure
944  */
945 struct iscsi_bus_flash_conn *
946 iscsi_create_flashnode_conn(struct Scsi_Host *shost,
947                             struct iscsi_bus_flash_session *fnode_sess,
948                             struct iscsi_transport *transport,
949                             int dd_size)
950 {
951         struct iscsi_bus_flash_conn *fnode_conn;
952         int err;
953
954         fnode_conn = kzalloc(sizeof(*fnode_conn) + dd_size, GFP_KERNEL);
955         if (!fnode_conn)
956                 return NULL;
957
958         fnode_conn->transport = transport;
959         fnode_conn->dev.type = &iscsi_flashnode_conn_dev_type;
960         fnode_conn->dev.bus = &iscsi_flashnode_bus;
961         fnode_conn->dev.parent = &fnode_sess->dev;
962         dev_set_name(&fnode_conn->dev, "flashnode_conn-%u:%u:0",
963                      shost->host_no, fnode_sess->target_id);
964
965         err = device_register(&fnode_conn->dev);
966         if (err)
967                 goto free_fnode_conn;
968
969         if (dd_size)
970                 fnode_conn->dd_data = &fnode_conn[1];
971
972         return fnode_conn;
973
974 free_fnode_conn:
975         kfree(fnode_conn);
976         return NULL;
977 }
978 EXPORT_SYMBOL_GPL(iscsi_create_flashnode_conn);
979
980 /**
981  * iscsi_is_flashnode_conn_dev - verify passed device is to be flashnode conn
982  * @dev: device to verify
983  * @data: pointer to data containing value to use for verification
984  *
985  * Verifies if the passed device is flashnode conn device
986  *
987  * Returns:
988  *  1 on success
989  *  0 on failure
990  */
991 int iscsi_is_flashnode_conn_dev(struct device *dev, void *data)
992 {
993         return dev->bus == &iscsi_flashnode_bus;
994 }
995 EXPORT_SYMBOL_GPL(iscsi_is_flashnode_conn_dev);
996
997 static int iscsi_destroy_flashnode_conn(struct iscsi_bus_flash_conn *fnode_conn)
998 {
999         device_unregister(&fnode_conn->dev);
1000         return 0;
1001 }
1002
1003 static int flashnode_match_index(struct device *dev, void *data)
1004 {
1005         struct iscsi_bus_flash_session *fnode_sess = NULL;
1006         int ret = 0;
1007
1008         if (!iscsi_flashnode_bus_match(dev, NULL))
1009                 goto exit_match_index;
1010
1011         fnode_sess = iscsi_dev_to_flash_session(dev);
1012         ret = (fnode_sess->target_id == *((int *)data)) ? 1 : 0;
1013
1014 exit_match_index:
1015         return ret;
1016 }
1017
1018 /**
1019  * iscsi_get_flashnode_by_index -finds flashnode session entry by index
1020  * @shost: pointer to host data
1021  * @idx: index to match
1022  *
1023  * Finds the flashnode session object for the passed index
1024  *
1025  * Returns:
1026  *  pointer to found flashnode session object on success
1027  *  %NULL on failure
1028  */
1029 static struct iscsi_bus_flash_session *
1030 iscsi_get_flashnode_by_index(struct Scsi_Host *shost, uint32_t idx)
1031 {
1032         struct iscsi_bus_flash_session *fnode_sess = NULL;
1033         struct device *dev;
1034
1035         dev = device_find_child(&shost->shost_gendev, &idx,
1036                                 flashnode_match_index);
1037         if (dev)
1038                 fnode_sess = iscsi_dev_to_flash_session(dev);
1039
1040         return fnode_sess;
1041 }
1042
1043 /**
1044  * iscsi_find_flashnode_sess - finds flashnode session entry
1045  * @shost: pointer to host data
1046  * @data: pointer to data containing value to use for comparison
1047  * @fn: function pointer that does actual comparison
1048  *
1049  * Finds the flashnode session object comparing the data passed using logic
1050  * defined in passed function pointer
1051  *
1052  * Returns:
1053  *  pointer to found flashnode session device object on success
1054  *  %NULL on failure
1055  */
1056 struct device *
1057 iscsi_find_flashnode_sess(struct Scsi_Host *shost, void *data,
1058                           int (*fn)(struct device *dev, void *data))
1059 {
1060         return device_find_child(&shost->shost_gendev, data, fn);
1061 }
1062 EXPORT_SYMBOL_GPL(iscsi_find_flashnode_sess);
1063
1064 /**
1065  * iscsi_find_flashnode_conn - finds flashnode connection entry
1066  * @fnode_sess: pointer to parent flashnode session entry
1067  *
1068  * Finds the flashnode connection object comparing the data passed using logic
1069  * defined in passed function pointer
1070  *
1071  * Returns:
1072  *  pointer to found flashnode connection device object on success
1073  *  %NULL on failure
1074  */
1075 struct device *
1076 iscsi_find_flashnode_conn(struct iscsi_bus_flash_session *fnode_sess)
1077 {
1078         return device_find_child(&fnode_sess->dev, NULL,
1079                                  iscsi_is_flashnode_conn_dev);
1080 }
1081 EXPORT_SYMBOL_GPL(iscsi_find_flashnode_conn);
1082
1083 static int iscsi_iter_destroy_flashnode_conn_fn(struct device *dev, void *data)
1084 {
1085         if (!iscsi_is_flashnode_conn_dev(dev, NULL))
1086                 return 0;
1087
1088         return iscsi_destroy_flashnode_conn(iscsi_dev_to_flash_conn(dev));
1089 }
1090
1091 /**
1092  * iscsi_destroy_flashnode_sess - destory flashnode session entry
1093  * @fnode_sess: pointer to flashnode session entry to be destroyed
1094  *
1095  * Deletes the flashnode session entry and all children flashnode connection
1096  * entries from sysfs
1097  */
1098 void iscsi_destroy_flashnode_sess(struct iscsi_bus_flash_session *fnode_sess)
1099 {
1100         int err;
1101
1102         err = device_for_each_child(&fnode_sess->dev, NULL,
1103                                     iscsi_iter_destroy_flashnode_conn_fn);
1104         if (err)
1105                 pr_err("Could not delete all connections for %s. Error %d.\n",
1106                        fnode_sess->dev.kobj.name, err);
1107
1108         device_unregister(&fnode_sess->dev);
1109 }
1110 EXPORT_SYMBOL_GPL(iscsi_destroy_flashnode_sess);
1111
1112 static int iscsi_iter_destroy_flashnode_fn(struct device *dev, void *data)
1113 {
1114         if (!iscsi_flashnode_bus_match(dev, NULL))
1115                 return 0;
1116
1117         iscsi_destroy_flashnode_sess(iscsi_dev_to_flash_session(dev));
1118         return 0;
1119 }
1120
1121 /**
1122  * iscsi_destroy_all_flashnode - destory all flashnode session entries
1123  * @shost: pointer to host data
1124  *
1125  * Destroys all the flashnode session entries and all corresponding children
1126  * flashnode connection entries from sysfs
1127  */
1128 void iscsi_destroy_all_flashnode(struct Scsi_Host *shost)
1129 {
1130         device_for_each_child(&shost->shost_gendev, NULL,
1131                               iscsi_iter_destroy_flashnode_fn);
1132 }
1133 EXPORT_SYMBOL_GPL(iscsi_destroy_all_flashnode);
1134
1135 /*
1136  * BSG support
1137  */
1138 /**
1139  * iscsi_bsg_host_dispatch - Dispatch command to LLD.
1140  * @job: bsg job to be processed
1141  */
1142 static int iscsi_bsg_host_dispatch(struct bsg_job *job)
1143 {
1144         struct Scsi_Host *shost = iscsi_job_to_shost(job);
1145         struct iscsi_bsg_request *req = job->request;
1146         struct iscsi_bsg_reply *reply = job->reply;
1147         struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
1148         int cmdlen = sizeof(uint32_t);  /* start with length of msgcode */
1149         int ret;
1150
1151         /* check if we have the msgcode value at least */
1152         if (job->request_len < sizeof(uint32_t)) {
1153                 ret = -ENOMSG;
1154                 goto fail_host_msg;
1155         }
1156
1157         /* Validate the host command */
1158         switch (req->msgcode) {
1159         case ISCSI_BSG_HST_VENDOR:
1160                 cmdlen += sizeof(struct iscsi_bsg_host_vendor);
1161                 if ((shost->hostt->vendor_id == 0L) ||
1162                     (req->rqst_data.h_vendor.vendor_id !=
1163                         shost->hostt->vendor_id)) {
1164                         ret = -ESRCH;
1165                         goto fail_host_msg;
1166                 }
1167                 break;
1168         default:
1169                 ret = -EBADR;
1170                 goto fail_host_msg;
1171         }
1172
1173         /* check if we really have all the request data needed */
1174         if (job->request_len < cmdlen) {
1175                 ret = -ENOMSG;
1176                 goto fail_host_msg;
1177         }
1178
1179         ret = i->iscsi_transport->bsg_request(job);
1180         if (!ret)
1181                 return 0;
1182
1183 fail_host_msg:
1184         /* return the errno failure code as the only status */
1185         BUG_ON(job->reply_len < sizeof(uint32_t));
1186         reply->reply_payload_rcv_len = 0;
1187         reply->result = ret;
1188         job->reply_len = sizeof(uint32_t);
1189         bsg_job_done(job, ret, 0);
1190         return 0;
1191 }
1192
1193 /**
1194  * iscsi_bsg_host_add - Create and add the bsg hooks to receive requests
1195  * @shost: shost for iscsi_host
1196  * @ihost: iscsi_cls_host adding the structures to
1197  */
1198 static int
1199 iscsi_bsg_host_add(struct Scsi_Host *shost, struct iscsi_cls_host *ihost)
1200 {
1201         struct device *dev = &shost->shost_gendev;
1202         struct iscsi_internal *i = to_iscsi_internal(shost->transportt);
1203         struct request_queue *q;
1204         char bsg_name[20];
1205         int ret;
1206
1207         if (!i->iscsi_transport->bsg_request)
1208                 return -ENOTSUPP;
1209
1210         snprintf(bsg_name, sizeof(bsg_name), "iscsi_host%d", shost->host_no);
1211
1212         q = __scsi_alloc_queue(shost, bsg_request_fn);
1213         if (!q)
1214                 return -ENOMEM;
1215
1216         ret = bsg_setup_queue(dev, q, bsg_name, iscsi_bsg_host_dispatch, 0);
1217         if (ret) {
1218                 shost_printk(KERN_ERR, shost, "bsg interface failed to "
1219                              "initialize - no request queue\n");
1220                 blk_cleanup_queue(q);
1221                 return ret;
1222         }
1223
1224         ihost->bsg_q = q;
1225         return 0;
1226 }
1227
1228 static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
1229                             struct device *cdev)
1230 {
1231         struct Scsi_Host *shost = dev_to_shost(dev);
1232         struct iscsi_cls_host *ihost = shost->shost_data;
1233
1234         memset(ihost, 0, sizeof(*ihost));
1235         atomic_set(&ihost->nr_scans, 0);
1236         mutex_init(&ihost->mutex);
1237
1238         iscsi_bsg_host_add(shost, ihost);
1239         /* ignore any bsg add error - we just can't do sgio */
1240
1241         return 0;
1242 }
1243
1244 static int iscsi_remove_host(struct transport_container *tc,
1245                              struct device *dev, struct device *cdev)
1246 {
1247         struct Scsi_Host *shost = dev_to_shost(dev);
1248         struct iscsi_cls_host *ihost = shost->shost_data;
1249
1250         if (ihost->bsg_q) {
1251                 bsg_unregister_queue(ihost->bsg_q);
1252                 blk_cleanup_queue(ihost->bsg_q);
1253         }
1254         return 0;
1255 }
1256
1257 static DECLARE_TRANSPORT_CLASS(iscsi_host_class,
1258                                "iscsi_host",
1259                                iscsi_setup_host,
1260                                iscsi_remove_host,
1261                                NULL);
1262
1263 static DECLARE_TRANSPORT_CLASS(iscsi_session_class,
1264                                "iscsi_session",
1265                                NULL,
1266                                NULL,
1267                                NULL);
1268
1269 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
1270                                "iscsi_connection",
1271                                NULL,
1272                                NULL,
1273                                NULL);
1274
1275 static struct sock *nls;
1276 static DEFINE_MUTEX(rx_queue_mutex);
1277
1278 static LIST_HEAD(sesslist);
1279 static DEFINE_SPINLOCK(sesslock);
1280 static LIST_HEAD(connlist);
1281 static DEFINE_SPINLOCK(connlock);
1282
1283 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
1284 {
1285         struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
1286         return sess->sid;
1287 }
1288
1289 /*
1290  * Returns the matching session to a given sid
1291  */
1292 static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
1293 {
1294         unsigned long flags;
1295         struct iscsi_cls_session *sess;
1296
1297         spin_lock_irqsave(&sesslock, flags);
1298         list_for_each_entry(sess, &sesslist, sess_list) {
1299                 if (sess->sid == sid) {
1300                         spin_unlock_irqrestore(&sesslock, flags);
1301                         return sess;
1302                 }
1303         }
1304         spin_unlock_irqrestore(&sesslock, flags);
1305         return NULL;
1306 }
1307
1308 /*
1309  * Returns the matching connection to a given sid / cid tuple
1310  */
1311 static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid)
1312 {
1313         unsigned long flags;
1314         struct iscsi_cls_conn *conn;
1315
1316         spin_lock_irqsave(&connlock, flags);
1317         list_for_each_entry(conn, &connlist, conn_list) {
1318                 if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) {
1319                         spin_unlock_irqrestore(&connlock, flags);
1320                         return conn;
1321                 }
1322         }
1323         spin_unlock_irqrestore(&connlock, flags);
1324         return NULL;
1325 }
1326
1327 /*
1328  * The following functions can be used by LLDs that allocate
1329  * their own scsi_hosts or by software iscsi LLDs
1330  */
1331 static struct {
1332         int value;
1333         char *name;
1334 } iscsi_session_state_names[] = {
1335         { ISCSI_SESSION_LOGGED_IN,      "LOGGED_IN" },
1336         { ISCSI_SESSION_FAILED,         "FAILED" },
1337         { ISCSI_SESSION_FREE,           "FREE" },
1338 };
1339
1340 static const char *iscsi_session_state_name(int state)
1341 {
1342         int i;
1343         char *name = NULL;
1344
1345         for (i = 0; i < ARRAY_SIZE(iscsi_session_state_names); i++) {
1346                 if (iscsi_session_state_names[i].value == state) {
1347                         name = iscsi_session_state_names[i].name;
1348                         break;
1349                 }
1350         }
1351         return name;
1352 }
1353
1354 int iscsi_session_chkready(struct iscsi_cls_session *session)
1355 {
1356         unsigned long flags;
1357         int err;
1358
1359         spin_lock_irqsave(&session->lock, flags);
1360         switch (session->state) {
1361         case ISCSI_SESSION_LOGGED_IN:
1362                 err = 0;
1363                 break;
1364         case ISCSI_SESSION_FAILED:
1365                 err = DID_IMM_RETRY << 16;
1366                 break;
1367         case ISCSI_SESSION_FREE:
1368                 err = DID_TRANSPORT_FAILFAST << 16;
1369                 break;
1370         default:
1371                 err = DID_NO_CONNECT << 16;
1372                 break;
1373         }
1374         spin_unlock_irqrestore(&session->lock, flags);
1375         return err;
1376 }
1377 EXPORT_SYMBOL_GPL(iscsi_session_chkready);
1378
1379 int iscsi_is_session_online(struct iscsi_cls_session *session)
1380 {
1381         unsigned long flags;
1382         int ret = 0;
1383
1384         spin_lock_irqsave(&session->lock, flags);
1385         if (session->state == ISCSI_SESSION_LOGGED_IN)
1386                 ret = 1;
1387         spin_unlock_irqrestore(&session->lock, flags);
1388         return ret;
1389 }
1390 EXPORT_SYMBOL_GPL(iscsi_is_session_online);
1391
1392 static void iscsi_session_release(struct device *dev)
1393 {
1394         struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
1395         struct Scsi_Host *shost;
1396
1397         shost = iscsi_session_to_shost(session);
1398         scsi_host_put(shost);
1399         ISCSI_DBG_TRANS_SESSION(session, "Completing session release\n");
1400         kfree(session);
1401 }
1402
1403 int iscsi_is_session_dev(const struct device *dev)
1404 {
1405         return dev->release == iscsi_session_release;
1406 }
1407 EXPORT_SYMBOL_GPL(iscsi_is_session_dev);
1408
1409 static int iscsi_iter_session_fn(struct device *dev, void *data)
1410 {
1411         void (* fn) (struct iscsi_cls_session *) = data;
1412
1413         if (!iscsi_is_session_dev(dev))
1414                 return 0;
1415         fn(iscsi_dev_to_session(dev));
1416         return 0;
1417 }
1418
1419 void iscsi_host_for_each_session(struct Scsi_Host *shost,
1420                                  void (*fn)(struct iscsi_cls_session *))
1421 {
1422         device_for_each_child(&shost->shost_gendev, fn,
1423                               iscsi_iter_session_fn);
1424 }
1425 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session);
1426
1427 /**
1428  * iscsi_scan_finished - helper to report when running scans are done
1429  * @shost: scsi host
1430  * @time: scan run time
1431  *
1432  * This function can be used by drives like qla4xxx to report to the scsi
1433  * layer when the scans it kicked off at module load time are done.
1434  */
1435 int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time)
1436 {
1437         struct iscsi_cls_host *ihost = shost->shost_data;
1438         /*
1439          * qla4xxx will have kicked off some session unblocks before calling
1440          * scsi_scan_host, so just wait for them to complete.
1441          */
1442         return !atomic_read(&ihost->nr_scans);
1443 }
1444 EXPORT_SYMBOL_GPL(iscsi_scan_finished);
1445
1446 struct iscsi_scan_data {
1447         unsigned int channel;
1448         unsigned int id;
1449         unsigned int lun;
1450 };
1451
1452 static int iscsi_user_scan_session(struct device *dev, void *data)
1453 {
1454         struct iscsi_scan_data *scan_data = data;
1455         struct iscsi_cls_session *session;
1456         struct Scsi_Host *shost;
1457         struct iscsi_cls_host *ihost;
1458         unsigned long flags;
1459         unsigned int id;
1460
1461         if (!iscsi_is_session_dev(dev))
1462                 return 0;
1463
1464         session = iscsi_dev_to_session(dev);
1465
1466         ISCSI_DBG_TRANS_SESSION(session, "Scanning session\n");
1467
1468         shost = iscsi_session_to_shost(session);
1469         ihost = shost->shost_data;
1470
1471         mutex_lock(&ihost->mutex);
1472         spin_lock_irqsave(&session->lock, flags);
1473         if (session->state != ISCSI_SESSION_LOGGED_IN) {
1474                 spin_unlock_irqrestore(&session->lock, flags);
1475                 goto user_scan_exit;
1476         }
1477         id = session->target_id;
1478         spin_unlock_irqrestore(&session->lock, flags);
1479
1480         if (id != ISCSI_MAX_TARGET) {
1481                 if ((scan_data->channel == SCAN_WILD_CARD ||
1482                      scan_data->channel == 0) &&
1483                     (scan_data->id == SCAN_WILD_CARD ||
1484                      scan_data->id == id))
1485                         scsi_scan_target(&session->dev, 0, id,
1486                                          scan_data->lun, 1);
1487         }
1488
1489 user_scan_exit:
1490         mutex_unlock(&ihost->mutex);
1491         ISCSI_DBG_TRANS_SESSION(session, "Completed session scan\n");
1492         return 0;
1493 }
1494
1495 static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
1496                            uint id, uint lun)
1497 {
1498         struct iscsi_scan_data scan_data;
1499
1500         scan_data.channel = channel;
1501         scan_data.id = id;
1502         scan_data.lun = lun;
1503
1504         return device_for_each_child(&shost->shost_gendev, &scan_data,
1505                                      iscsi_user_scan_session);
1506 }
1507
1508 static void iscsi_scan_session(struct work_struct *work)
1509 {
1510         struct iscsi_cls_session *session =
1511                         container_of(work, struct iscsi_cls_session, scan_work);
1512         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1513         struct iscsi_cls_host *ihost = shost->shost_data;
1514         struct iscsi_scan_data scan_data;
1515
1516         scan_data.channel = 0;
1517         scan_data.id = SCAN_WILD_CARD;
1518         scan_data.lun = SCAN_WILD_CARD;
1519
1520         iscsi_user_scan_session(&session->dev, &scan_data);
1521         atomic_dec(&ihost->nr_scans);
1522 }
1523
1524 /**
1525  * iscsi_block_scsi_eh - block scsi eh until session state has transistioned
1526  * @cmd: scsi cmd passed to scsi eh handler
1527  *
1528  * If the session is down this function will wait for the recovery
1529  * timer to fire or for the session to be logged back in. If the
1530  * recovery timer fires then FAST_IO_FAIL is returned. The caller
1531  * should pass this error value to the scsi eh.
1532  */
1533 int iscsi_block_scsi_eh(struct scsi_cmnd *cmd)
1534 {
1535         struct iscsi_cls_session *session =
1536                         starget_to_session(scsi_target(cmd->device));
1537         unsigned long flags;
1538         int ret = 0;
1539
1540         spin_lock_irqsave(&session->lock, flags);
1541         while (session->state != ISCSI_SESSION_LOGGED_IN) {
1542                 if (session->state == ISCSI_SESSION_FREE) {
1543                         ret = FAST_IO_FAIL;
1544                         break;
1545                 }
1546                 spin_unlock_irqrestore(&session->lock, flags);
1547                 msleep(1000);
1548                 spin_lock_irqsave(&session->lock, flags);
1549         }
1550         spin_unlock_irqrestore(&session->lock, flags);
1551         return ret;
1552 }
1553 EXPORT_SYMBOL_GPL(iscsi_block_scsi_eh);
1554
1555 static void session_recovery_timedout(struct work_struct *work)
1556 {
1557         struct iscsi_cls_session *session =
1558                 container_of(work, struct iscsi_cls_session,
1559                              recovery_work.work);
1560         unsigned long flags;
1561
1562         iscsi_cls_session_printk(KERN_INFO, session,
1563                                  "session recovery timed out after %d secs\n",
1564                                  session->recovery_tmo);
1565
1566         spin_lock_irqsave(&session->lock, flags);
1567         switch (session->state) {
1568         case ISCSI_SESSION_FAILED:
1569                 session->state = ISCSI_SESSION_FREE;
1570                 break;
1571         case ISCSI_SESSION_LOGGED_IN:
1572         case ISCSI_SESSION_FREE:
1573                 /* we raced with the unblock's flush */
1574                 spin_unlock_irqrestore(&session->lock, flags);
1575                 return;
1576         }
1577         spin_unlock_irqrestore(&session->lock, flags);
1578
1579         if (session->transport->session_recovery_timedout)
1580                 session->transport->session_recovery_timedout(session);
1581
1582         ISCSI_DBG_TRANS_SESSION(session, "Unblocking SCSI target\n");
1583         scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);
1584         ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking SCSI target\n");
1585 }
1586
1587 static void __iscsi_unblock_session(struct work_struct *work)
1588 {
1589         struct iscsi_cls_session *session =
1590                         container_of(work, struct iscsi_cls_session,
1591                                      unblock_work);
1592         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1593         struct iscsi_cls_host *ihost = shost->shost_data;
1594         unsigned long flags;
1595
1596         ISCSI_DBG_TRANS_SESSION(session, "Unblocking session\n");
1597         /*
1598          * The recovery and unblock work get run from the same workqueue,
1599          * so try to cancel it if it was going to run after this unblock.
1600          */
1601         cancel_delayed_work(&session->recovery_work);
1602         spin_lock_irqsave(&session->lock, flags);
1603         session->state = ISCSI_SESSION_LOGGED_IN;
1604         spin_unlock_irqrestore(&session->lock, flags);
1605         /* start IO */
1606         scsi_target_unblock(&session->dev, SDEV_RUNNING);
1607         /*
1608          * Only do kernel scanning if the driver is properly hooked into
1609          * the async scanning code (drivers like iscsi_tcp do login and
1610          * scanning from userspace).
1611          */
1612         if (shost->hostt->scan_finished) {
1613                 if (scsi_queue_work(shost, &session->scan_work))
1614                         atomic_inc(&ihost->nr_scans);
1615         }
1616         ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking session\n");
1617 }
1618
1619 /**
1620  * iscsi_unblock_session - set a session as logged in and start IO.
1621  * @session: iscsi session
1622  *
1623  * Mark a session as ready to accept IO.
1624  */
1625 void iscsi_unblock_session(struct iscsi_cls_session *session)
1626 {
1627         queue_work(iscsi_eh_timer_workq, &session->unblock_work);
1628         /*
1629          * make sure all the events have completed before tell the driver
1630          * it is safe
1631          */
1632         flush_workqueue(iscsi_eh_timer_workq);
1633 }
1634 EXPORT_SYMBOL_GPL(iscsi_unblock_session);
1635
1636 static void __iscsi_block_session(struct work_struct *work)
1637 {
1638         struct iscsi_cls_session *session =
1639                         container_of(work, struct iscsi_cls_session,
1640                                      block_work);
1641         unsigned long flags;
1642
1643         ISCSI_DBG_TRANS_SESSION(session, "Blocking session\n");
1644         spin_lock_irqsave(&session->lock, flags);
1645         session->state = ISCSI_SESSION_FAILED;
1646         spin_unlock_irqrestore(&session->lock, flags);
1647         scsi_target_block(&session->dev);
1648         ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n");
1649         if (session->recovery_tmo >= 0)
1650                 queue_delayed_work(iscsi_eh_timer_workq,
1651                                    &session->recovery_work,
1652                                    session->recovery_tmo * HZ);
1653 }
1654
1655 void iscsi_block_session(struct iscsi_cls_session *session)
1656 {
1657         queue_work(iscsi_eh_timer_workq, &session->block_work);
1658 }
1659 EXPORT_SYMBOL_GPL(iscsi_block_session);
1660
1661 static void __iscsi_unbind_session(struct work_struct *work)
1662 {
1663         struct iscsi_cls_session *session =
1664                         container_of(work, struct iscsi_cls_session,
1665                                      unbind_work);
1666         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1667         struct iscsi_cls_host *ihost = shost->shost_data;
1668         unsigned long flags;
1669         unsigned int target_id;
1670
1671         ISCSI_DBG_TRANS_SESSION(session, "Unbinding session\n");
1672
1673         /* Prevent new scans and make sure scanning is not in progress */
1674         mutex_lock(&ihost->mutex);
1675         spin_lock_irqsave(&session->lock, flags);
1676         if (session->target_id == ISCSI_MAX_TARGET) {
1677                 spin_unlock_irqrestore(&session->lock, flags);
1678                 mutex_unlock(&ihost->mutex);
1679                 return;
1680         }
1681
1682         target_id = session->target_id;
1683         session->target_id = ISCSI_MAX_TARGET;
1684         spin_unlock_irqrestore(&session->lock, flags);
1685         mutex_unlock(&ihost->mutex);
1686
1687         if (session->ida_used)
1688                 ida_simple_remove(&iscsi_sess_ida, target_id);
1689
1690         scsi_remove_target(&session->dev);
1691         iscsi_session_event(session, ISCSI_KEVENT_UNBIND_SESSION);
1692         ISCSI_DBG_TRANS_SESSION(session, "Completed target removal\n");
1693 }
1694
1695 struct iscsi_cls_session *
1696 iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
1697                     int dd_size)
1698 {
1699         struct iscsi_cls_session *session;
1700
1701         session = kzalloc(sizeof(*session) + dd_size,
1702                           GFP_KERNEL);
1703         if (!session)
1704                 return NULL;
1705
1706         session->transport = transport;
1707         session->creator = -1;
1708         session->recovery_tmo = 120;
1709         session->state = ISCSI_SESSION_FREE;
1710         INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
1711         INIT_LIST_HEAD(&session->sess_list);
1712         INIT_WORK(&session->unblock_work, __iscsi_unblock_session);
1713         INIT_WORK(&session->block_work, __iscsi_block_session);
1714         INIT_WORK(&session->unbind_work, __iscsi_unbind_session);
1715         INIT_WORK(&session->scan_work, iscsi_scan_session);
1716         spin_lock_init(&session->lock);
1717
1718         /* this is released in the dev's release function */
1719         scsi_host_get(shost);
1720         session->dev.parent = &shost->shost_gendev;
1721         session->dev.release = iscsi_session_release;
1722         device_initialize(&session->dev);
1723         if (dd_size)
1724                 session->dd_data = &session[1];
1725
1726         ISCSI_DBG_TRANS_SESSION(session, "Completed session allocation\n");
1727         return session;
1728 }
1729 EXPORT_SYMBOL_GPL(iscsi_alloc_session);
1730
1731 int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
1732 {
1733         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1734         struct iscsi_cls_host *ihost;
1735         unsigned long flags;
1736         int id = 0;
1737         int err;
1738
1739         ihost = shost->shost_data;
1740         session->sid = atomic_add_return(1, &iscsi_session_nr);
1741
1742         if (target_id == ISCSI_MAX_TARGET) {
1743                 id = ida_simple_get(&iscsi_sess_ida, 0, 0, GFP_KERNEL);
1744
1745                 if (id < 0) {
1746                         iscsi_cls_session_printk(KERN_ERR, session,
1747                                         "Failure in Target ID Allocation\n");
1748                         return id;
1749                 }
1750                 session->target_id = (unsigned int)id;
1751                 session->ida_used = true;
1752         } else
1753                 session->target_id = target_id;
1754
1755         dev_set_name(&session->dev, "session%u", session->sid);
1756         err = device_add(&session->dev);
1757         if (err) {
1758                 iscsi_cls_session_printk(KERN_ERR, session,
1759                                          "could not register session's dev\n");
1760                 goto release_ida;
1761         }
1762         transport_register_device(&session->dev);
1763
1764         spin_lock_irqsave(&sesslock, flags);
1765         list_add(&session->sess_list, &sesslist);
1766         spin_unlock_irqrestore(&sesslock, flags);
1767
1768         iscsi_session_event(session, ISCSI_KEVENT_CREATE_SESSION);
1769         ISCSI_DBG_TRANS_SESSION(session, "Completed session adding\n");
1770         return 0;
1771
1772 release_ida:
1773         if (session->ida_used)
1774                 ida_simple_remove(&iscsi_sess_ida, session->target_id);
1775
1776         return err;
1777 }
1778 EXPORT_SYMBOL_GPL(iscsi_add_session);
1779
1780 /**
1781  * iscsi_create_session - create iscsi class session
1782  * @shost: scsi host
1783  * @transport: iscsi transport
1784  * @dd_size: private driver data size
1785  * @target_id: which target
1786  *
1787  * This can be called from a LLD or iscsi_transport.
1788  */
1789 struct iscsi_cls_session *
1790 iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
1791                      int dd_size, unsigned int target_id)
1792 {
1793         struct iscsi_cls_session *session;
1794
1795         session = iscsi_alloc_session(shost, transport, dd_size);
1796         if (!session)
1797                 return NULL;
1798
1799         if (iscsi_add_session(session, target_id)) {
1800                 iscsi_free_session(session);
1801                 return NULL;
1802         }
1803         return session;
1804 }
1805 EXPORT_SYMBOL_GPL(iscsi_create_session);
1806
1807 static void iscsi_conn_release(struct device *dev)
1808 {
1809         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
1810         struct device *parent = conn->dev.parent;
1811
1812         ISCSI_DBG_TRANS_CONN(conn, "Releasing conn\n");
1813         kfree(conn);
1814         put_device(parent);
1815 }
1816
1817 static int iscsi_is_conn_dev(const struct device *dev)
1818 {
1819         return dev->release == iscsi_conn_release;
1820 }
1821
1822 static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data)
1823 {
1824         if (!iscsi_is_conn_dev(dev))
1825                 return 0;
1826         return iscsi_destroy_conn(iscsi_dev_to_conn(dev));
1827 }
1828
1829 void iscsi_remove_session(struct iscsi_cls_session *session)
1830 {
1831         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1832         unsigned long flags;
1833         int err;
1834
1835         ISCSI_DBG_TRANS_SESSION(session, "Removing session\n");
1836
1837         spin_lock_irqsave(&sesslock, flags);
1838         list_del(&session->sess_list);
1839         spin_unlock_irqrestore(&sesslock, flags);
1840
1841         /* make sure there are no blocks/unblocks queued */
1842         flush_workqueue(iscsi_eh_timer_workq);
1843         /* make sure the timedout callout is not running */
1844         if (!cancel_delayed_work(&session->recovery_work))
1845                 flush_workqueue(iscsi_eh_timer_workq);
1846         /*
1847          * If we are blocked let commands flow again. The lld or iscsi
1848          * layer should set up the queuecommand to fail commands.
1849          * We assume that LLD will not be calling block/unblock while
1850          * removing the session.
1851          */
1852         spin_lock_irqsave(&session->lock, flags);
1853         session->state = ISCSI_SESSION_FREE;
1854         spin_unlock_irqrestore(&session->lock, flags);
1855
1856         scsi_target_unblock(&session->dev, SDEV_TRANSPORT_OFFLINE);
1857         /* flush running scans then delete devices */
1858         scsi_flush_work(shost);
1859         __iscsi_unbind_session(&session->unbind_work);
1860
1861         /* hw iscsi may not have removed all connections from session */
1862         err = device_for_each_child(&session->dev, NULL,
1863                                     iscsi_iter_destroy_conn_fn);
1864         if (err)
1865                 iscsi_cls_session_printk(KERN_ERR, session,
1866                                          "Could not delete all connections "
1867                                          "for session. Error %d.\n", err);
1868
1869         transport_unregister_device(&session->dev);
1870
1871         ISCSI_DBG_TRANS_SESSION(session, "Completing session removal\n");
1872         device_del(&session->dev);
1873 }
1874 EXPORT_SYMBOL_GPL(iscsi_remove_session);
1875
1876 void iscsi_free_session(struct iscsi_cls_session *session)
1877 {
1878         ISCSI_DBG_TRANS_SESSION(session, "Freeing session\n");
1879         iscsi_session_event(session, ISCSI_KEVENT_DESTROY_SESSION);
1880         put_device(&session->dev);
1881 }
1882 EXPORT_SYMBOL_GPL(iscsi_free_session);
1883
1884 /**
1885  * iscsi_destroy_session - destroy iscsi session
1886  * @session: iscsi_session
1887  *
1888  * Can be called by a LLD or iscsi_transport. There must not be
1889  * any running connections.
1890  */
1891 int iscsi_destroy_session(struct iscsi_cls_session *session)
1892 {
1893         iscsi_remove_session(session);
1894         ISCSI_DBG_TRANS_SESSION(session, "Completing session destruction\n");
1895         iscsi_free_session(session);
1896         return 0;
1897 }
1898 EXPORT_SYMBOL_GPL(iscsi_destroy_session);
1899
1900 /**
1901  * iscsi_create_conn - create iscsi class connection
1902  * @session: iscsi cls session
1903  * @dd_size: private driver data size
1904  * @cid: connection id
1905  *
1906  * This can be called from a LLD or iscsi_transport. The connection
1907  * is child of the session so cid must be unique for all connections
1908  * on the session.
1909  *
1910  * Since we do not support MCS, cid will normally be zero. In some cases
1911  * for software iscsi we could be trying to preallocate a connection struct
1912  * in which case there could be two connection structs and cid would be
1913  * non-zero.
1914  */
1915 struct iscsi_cls_conn *
1916 iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid)
1917 {
1918         struct iscsi_transport *transport = session->transport;
1919         struct iscsi_cls_conn *conn;
1920         unsigned long flags;
1921         int err;
1922
1923         conn = kzalloc(sizeof(*conn) + dd_size, GFP_KERNEL);
1924         if (!conn)
1925                 return NULL;
1926         if (dd_size)
1927                 conn->dd_data = &conn[1];
1928
1929         mutex_init(&conn->ep_mutex);
1930         INIT_LIST_HEAD(&conn->conn_list);
1931         conn->transport = transport;
1932         conn->cid = cid;
1933
1934         /* this is released in the dev's release function */
1935         if (!get_device(&session->dev))
1936                 goto free_conn;
1937
1938         dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid);
1939         conn->dev.parent = &session->dev;
1940         conn->dev.release = iscsi_conn_release;
1941         err = device_register(&conn->dev);
1942         if (err) {
1943                 iscsi_cls_session_printk(KERN_ERR, session, "could not "
1944                                          "register connection's dev\n");
1945                 goto release_parent_ref;
1946         }
1947         transport_register_device(&conn->dev);
1948
1949         spin_lock_irqsave(&connlock, flags);
1950         list_add(&conn->conn_list, &connlist);
1951         spin_unlock_irqrestore(&connlock, flags);
1952
1953         ISCSI_DBG_TRANS_CONN(conn, "Completed conn creation\n");
1954         return conn;
1955
1956 release_parent_ref:
1957         put_device(&session->dev);
1958 free_conn:
1959         kfree(conn);
1960         return NULL;
1961 }
1962
1963 EXPORT_SYMBOL_GPL(iscsi_create_conn);
1964
1965 /**
1966  * iscsi_destroy_conn - destroy iscsi class connection
1967  * @conn: iscsi cls session
1968  *
1969  * This can be called from a LLD or iscsi_transport.
1970  */
1971 int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
1972 {
1973         unsigned long flags;
1974
1975         spin_lock_irqsave(&connlock, flags);
1976         list_del(&conn->conn_list);
1977         spin_unlock_irqrestore(&connlock, flags);
1978
1979         transport_unregister_device(&conn->dev);
1980         ISCSI_DBG_TRANS_CONN(conn, "Completing conn destruction\n");
1981         device_unregister(&conn->dev);
1982         return 0;
1983 }
1984 EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
1985
1986 /*
1987  * iscsi interface functions
1988  */
1989 static struct iscsi_internal *
1990 iscsi_if_transport_lookup(struct iscsi_transport *tt)
1991 {
1992         struct iscsi_internal *priv;
1993         unsigned long flags;
1994
1995         spin_lock_irqsave(&iscsi_transport_lock, flags);
1996         list_for_each_entry(priv, &iscsi_transports, list) {
1997                 if (tt == priv->iscsi_transport) {
1998                         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
1999                         return priv;
2000                 }
2001         }
2002         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
2003         return NULL;
2004 }
2005
2006 static int
2007 iscsi_multicast_skb(struct sk_buff *skb, uint32_t group, gfp_t gfp)
2008 {
2009         return nlmsg_multicast(nls, skb, 0, group, gfp);
2010 }
2011
2012 int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
2013                    char *data, uint32_t data_size)
2014 {
2015         struct nlmsghdr *nlh;
2016         struct sk_buff *skb;
2017         struct iscsi_uevent *ev;
2018         char *pdu;
2019         struct iscsi_internal *priv;
2020         int len = nlmsg_total_size(sizeof(*ev) + sizeof(struct iscsi_hdr) +
2021                                    data_size);
2022
2023         priv = iscsi_if_transport_lookup(conn->transport);
2024         if (!priv)
2025                 return -EINVAL;
2026
2027         skb = alloc_skb(len, GFP_ATOMIC);
2028         if (!skb) {
2029                 iscsi_conn_error_event(conn, ISCSI_ERR_CONN_FAILED);
2030                 iscsi_cls_conn_printk(KERN_ERR, conn, "can not deliver "
2031                                       "control PDU: OOM\n");
2032                 return -ENOMEM;
2033         }
2034
2035         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2036         ev = nlmsg_data(nlh);
2037         memset(ev, 0, sizeof(*ev));
2038         ev->transport_handle = iscsi_handle(conn->transport);
2039         ev->type = ISCSI_KEVENT_RECV_PDU;
2040         ev->r.recv_req.cid = conn->cid;
2041         ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
2042         pdu = (char*)ev + sizeof(*ev);
2043         memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
2044         memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
2045
2046         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2047 }
2048 EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
2049
2050 int iscsi_offload_mesg(struct Scsi_Host *shost,
2051                        struct iscsi_transport *transport, uint32_t type,
2052                        char *data, uint16_t data_size)
2053 {
2054         struct nlmsghdr *nlh;
2055         struct sk_buff *skb;
2056         struct iscsi_uevent *ev;
2057         int len = nlmsg_total_size(sizeof(*ev) + data_size);
2058
2059         skb = alloc_skb(len, GFP_ATOMIC);
2060         if (!skb) {
2061                 printk(KERN_ERR "can not deliver iscsi offload message:OOM\n");
2062                 return -ENOMEM;
2063         }
2064
2065         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2066         ev = nlmsg_data(nlh);
2067         memset(ev, 0, sizeof(*ev));
2068         ev->type = type;
2069         ev->transport_handle = iscsi_handle(transport);
2070         switch (type) {
2071         case ISCSI_KEVENT_PATH_REQ:
2072                 ev->r.req_path.host_no = shost->host_no;
2073                 break;
2074         case ISCSI_KEVENT_IF_DOWN:
2075                 ev->r.notify_if_down.host_no = shost->host_no;
2076                 break;
2077         }
2078
2079         memcpy((char *)ev + sizeof(*ev), data, data_size);
2080
2081         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC);
2082 }
2083 EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
2084
2085 void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)
2086 {
2087         struct nlmsghdr *nlh;
2088         struct sk_buff  *skb;
2089         struct iscsi_uevent *ev;
2090         struct iscsi_internal *priv;
2091         int len = nlmsg_total_size(sizeof(*ev));
2092
2093         priv = iscsi_if_transport_lookup(conn->transport);
2094         if (!priv)
2095                 return;
2096
2097         skb = alloc_skb(len, GFP_ATOMIC);
2098         if (!skb) {
2099                 iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
2100                                       "conn error (%d)\n", error);
2101                 return;
2102         }
2103
2104         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2105         ev = nlmsg_data(nlh);
2106         ev->transport_handle = iscsi_handle(conn->transport);
2107         ev->type = ISCSI_KEVENT_CONN_ERROR;
2108         ev->r.connerror.error = error;
2109         ev->r.connerror.cid = conn->cid;
2110         ev->r.connerror.sid = iscsi_conn_get_sid(conn);
2111
2112         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2113
2114         iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn error (%d)\n",
2115                               error);
2116 }
2117 EXPORT_SYMBOL_GPL(iscsi_conn_error_event);
2118
2119 void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
2120                             enum iscsi_conn_state state)
2121 {
2122         struct nlmsghdr *nlh;
2123         struct sk_buff  *skb;
2124         struct iscsi_uevent *ev;
2125         struct iscsi_internal *priv;
2126         int len = nlmsg_total_size(sizeof(*ev));
2127
2128         priv = iscsi_if_transport_lookup(conn->transport);
2129         if (!priv)
2130                 return;
2131
2132         skb = alloc_skb(len, GFP_ATOMIC);
2133         if (!skb) {
2134                 iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
2135                                       "conn login (%d)\n", state);
2136                 return;
2137         }
2138
2139         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2140         ev = nlmsg_data(nlh);
2141         ev->transport_handle = iscsi_handle(conn->transport);
2142         ev->type = ISCSI_KEVENT_CONN_LOGIN_STATE;
2143         ev->r.conn_login.state = state;
2144         ev->r.conn_login.cid = conn->cid;
2145         ev->r.conn_login.sid = iscsi_conn_get_sid(conn);
2146         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
2147
2148         iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn login (%d)\n",
2149                               state);
2150 }
2151 EXPORT_SYMBOL_GPL(iscsi_conn_login_event);
2152
2153 void iscsi_post_host_event(uint32_t host_no, struct iscsi_transport *transport,
2154                            enum iscsi_host_event_code code, uint32_t data_size,
2155                            uint8_t *data)
2156 {
2157         struct nlmsghdr *nlh;
2158         struct sk_buff *skb;
2159         struct iscsi_uevent *ev;
2160         int len = nlmsg_total_size(sizeof(*ev) + data_size);
2161
2162         skb = alloc_skb(len, GFP_NOIO);
2163         if (!skb) {
2164                 printk(KERN_ERR "gracefully ignored host event (%d):%d OOM\n",
2165                        host_no, code);
2166                 return;
2167         }
2168
2169         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2170         ev = nlmsg_data(nlh);
2171         ev->transport_handle = iscsi_handle(transport);
2172         ev->type = ISCSI_KEVENT_HOST_EVENT;
2173         ev->r.host_event.host_no = host_no;
2174         ev->r.host_event.code = code;
2175         ev->r.host_event.data_size = data_size;
2176
2177         if (data_size)
2178                 memcpy((char *)ev + sizeof(*ev), data, data_size);
2179
2180         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_NOIO);
2181 }
2182 EXPORT_SYMBOL_GPL(iscsi_post_host_event);
2183
2184 void iscsi_ping_comp_event(uint32_t host_no, struct iscsi_transport *transport,
2185                            uint32_t status, uint32_t pid, uint32_t data_size,
2186                            uint8_t *data)
2187 {
2188         struct nlmsghdr *nlh;
2189         struct sk_buff *skb;
2190         struct iscsi_uevent *ev;
2191         int len = nlmsg_total_size(sizeof(*ev) + data_size);
2192
2193         skb = alloc_skb(len, GFP_NOIO);
2194         if (!skb) {
2195                 printk(KERN_ERR "gracefully ignored ping comp: OOM\n");
2196                 return;
2197         }
2198
2199         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2200         ev = nlmsg_data(nlh);
2201         ev->transport_handle = iscsi_handle(transport);
2202         ev->type = ISCSI_KEVENT_PING_COMP;
2203         ev->r.ping_comp.host_no = host_no;
2204         ev->r.ping_comp.status = status;
2205         ev->r.ping_comp.pid = pid;
2206         ev->r.ping_comp.data_size = data_size;
2207         memcpy((char *)ev + sizeof(*ev), data, data_size);
2208
2209         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_NOIO);
2210 }
2211 EXPORT_SYMBOL_GPL(iscsi_ping_comp_event);
2212
2213 static int
2214 iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi,
2215                     void *payload, int size)
2216 {
2217         struct sk_buff  *skb;
2218         struct nlmsghdr *nlh;
2219         int len = nlmsg_total_size(size);
2220         int flags = multi ? NLM_F_MULTI : 0;
2221         int t = done ? NLMSG_DONE : type;
2222
2223         skb = alloc_skb(len, GFP_ATOMIC);
2224         if (!skb) {
2225                 printk(KERN_ERR "Could not allocate skb to send reply.\n");
2226                 return -ENOMEM;
2227         }
2228
2229         nlh = __nlmsg_put(skb, 0, 0, t, (len - sizeof(*nlh)), 0);
2230         nlh->nlmsg_flags = flags;
2231         memcpy(nlmsg_data(nlh), payload, size);
2232         return iscsi_multicast_skb(skb, group, GFP_ATOMIC);
2233 }
2234
2235 static int
2236 iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
2237 {
2238         struct iscsi_uevent *ev = nlmsg_data(nlh);
2239         struct iscsi_stats *stats;
2240         struct sk_buff *skbstat;
2241         struct iscsi_cls_conn *conn;
2242         struct nlmsghdr *nlhstat;
2243         struct iscsi_uevent *evstat;
2244         struct iscsi_internal *priv;
2245         int len = nlmsg_total_size(sizeof(*ev) +
2246                                    sizeof(struct iscsi_stats) +
2247                                    sizeof(struct iscsi_stats_custom) *
2248                                    ISCSI_STATS_CUSTOM_MAX);
2249         int err = 0;
2250
2251         priv = iscsi_if_transport_lookup(transport);
2252         if (!priv)
2253                 return -EINVAL;
2254
2255         conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
2256         if (!conn)
2257                 return -EEXIST;
2258
2259         do {
2260                 int actual_size;
2261
2262                 skbstat = alloc_skb(len, GFP_ATOMIC);
2263                 if (!skbstat) {
2264                         iscsi_cls_conn_printk(KERN_ERR, conn, "can not "
2265                                               "deliver stats: OOM\n");
2266                         return -ENOMEM;
2267                 }
2268
2269                 nlhstat = __nlmsg_put(skbstat, 0, 0, 0,
2270                                       (len - sizeof(*nlhstat)), 0);
2271                 evstat = nlmsg_data(nlhstat);
2272                 memset(evstat, 0, sizeof(*evstat));
2273                 evstat->transport_handle = iscsi_handle(conn->transport);
2274                 evstat->type = nlh->nlmsg_type;
2275                 evstat->u.get_stats.cid =
2276                         ev->u.get_stats.cid;
2277                 evstat->u.get_stats.sid =
2278                         ev->u.get_stats.sid;
2279                 stats = (struct iscsi_stats *)
2280                         ((char*)evstat + sizeof(*evstat));
2281                 memset(stats, 0, sizeof(*stats));
2282
2283                 transport->get_stats(conn, stats);
2284                 actual_size = nlmsg_total_size(sizeof(struct iscsi_uevent) +
2285                                                sizeof(struct iscsi_stats) +
2286                                                sizeof(struct iscsi_stats_custom) *
2287                                                stats->custom_length);
2288                 actual_size -= sizeof(*nlhstat);
2289                 actual_size = nlmsg_msg_size(actual_size);
2290                 skb_trim(skbstat, NLMSG_ALIGN(actual_size));
2291                 nlhstat->nlmsg_len = actual_size;
2292
2293                 err = iscsi_multicast_skb(skbstat, ISCSI_NL_GRP_ISCSID,
2294                                           GFP_ATOMIC);
2295         } while (err < 0 && err != -ECONNREFUSED);
2296
2297         return err;
2298 }
2299
2300 /**
2301  * iscsi_session_event - send session destr. completion event
2302  * @session: iscsi class session
2303  * @event: type of event
2304  */
2305 int iscsi_session_event(struct iscsi_cls_session *session,
2306                         enum iscsi_uevent_e event)
2307 {
2308         struct iscsi_internal *priv;
2309         struct Scsi_Host *shost;
2310         struct iscsi_uevent *ev;
2311         struct sk_buff  *skb;
2312         struct nlmsghdr *nlh;
2313         int rc, len = nlmsg_total_size(sizeof(*ev));
2314
2315         priv = iscsi_if_transport_lookup(session->transport);
2316         if (!priv)
2317                 return -EINVAL;
2318         shost = iscsi_session_to_shost(session);
2319
2320         skb = alloc_skb(len, GFP_KERNEL);
2321         if (!skb) {
2322                 iscsi_cls_session_printk(KERN_ERR, session,
2323                                          "Cannot notify userspace of session "
2324                                          "event %u\n", event);
2325                 return -ENOMEM;
2326         }
2327
2328         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
2329         ev = nlmsg_data(nlh);
2330         ev->transport_handle = iscsi_handle(session->transport);
2331
2332         ev->type = event;
2333         switch (event) {
2334         case ISCSI_KEVENT_DESTROY_SESSION:
2335                 ev->r.d_session.host_no = shost->host_no;
2336                 ev->r.d_session.sid = session->sid;
2337                 break;
2338         case ISCSI_KEVENT_CREATE_SESSION:
2339                 ev->r.c_session_ret.host_no = shost->host_no;
2340                 ev->r.c_session_ret.sid = session->sid;
2341                 break;
2342         case ISCSI_KEVENT_UNBIND_SESSION:
2343                 ev->r.unbind_session.host_no = shost->host_no;
2344                 ev->r.unbind_session.sid = session->sid;
2345                 break;
2346         default:
2347                 iscsi_cls_session_printk(KERN_ERR, session, "Invalid event "
2348                                          "%u.\n", event);
2349                 kfree_skb(skb);
2350                 return -EINVAL;
2351         }
2352
2353         /*
2354          * this will occur if the daemon is not up, so we just warn
2355          * the user and when the daemon is restarted it will handle it
2356          */
2357         rc = iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
2358         if (rc == -ESRCH)
2359                 iscsi_cls_session_printk(KERN_ERR, session,
2360                                          "Cannot notify userspace of session "
2361                                          "event %u. Check iscsi daemon\n",
2362                                          event);
2363
2364         ISCSI_DBG_TRANS_SESSION(session, "Completed handling event %d rc %d\n",
2365                                 event, rc);
2366         return rc;
2367 }
2368 EXPORT_SYMBOL_GPL(iscsi_session_event);
2369
2370 static int
2371 iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_endpoint *ep,
2372                         struct iscsi_uevent *ev, pid_t pid,
2373                         uint32_t initial_cmdsn, uint16_t cmds_max,
2374                         uint16_t queue_depth)
2375 {
2376         struct iscsi_transport *transport = priv->iscsi_transport;
2377         struct iscsi_cls_session *session;
2378         struct Scsi_Host *shost;
2379
2380         session = transport->create_session(ep, cmds_max, queue_depth,
2381                                             initial_cmdsn);
2382         if (!session)
2383                 return -ENOMEM;
2384
2385         session->creator = pid;
2386         shost = iscsi_session_to_shost(session);
2387         ev->r.c_session_ret.host_no = shost->host_no;
2388         ev->r.c_session_ret.sid = session->sid;
2389         ISCSI_DBG_TRANS_SESSION(session,
2390                                 "Completed creating transport session\n");
2391         return 0;
2392 }
2393
2394 static int
2395 iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2396 {
2397         struct iscsi_cls_conn *conn;
2398         struct iscsi_cls_session *session;
2399
2400         session = iscsi_session_lookup(ev->u.c_conn.sid);
2401         if (!session) {
2402                 printk(KERN_ERR "iscsi: invalid session %d.\n",
2403                        ev->u.c_conn.sid);
2404                 return -EINVAL;
2405         }
2406
2407         conn = transport->create_conn(session, ev->u.c_conn.cid);
2408         if (!conn) {
2409                 iscsi_cls_session_printk(KERN_ERR, session,
2410                                          "couldn't create a new connection.");
2411                 return -ENOMEM;
2412         }
2413
2414         ev->r.c_conn_ret.sid = session->sid;
2415         ev->r.c_conn_ret.cid = conn->cid;
2416
2417         ISCSI_DBG_TRANS_CONN(conn, "Completed creating transport conn\n");
2418         return 0;
2419 }
2420
2421 static int
2422 iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2423 {
2424         struct iscsi_cls_conn *conn;
2425
2426         conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid);
2427         if (!conn)
2428                 return -EINVAL;
2429
2430         ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n");
2431         if (transport->destroy_conn)
2432                 transport->destroy_conn(conn);
2433
2434         return 0;
2435 }
2436
2437 static int
2438 iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2439 {
2440         char *data = (char*)ev + sizeof(*ev);
2441         struct iscsi_cls_conn *conn;
2442         struct iscsi_cls_session *session;
2443         int err = 0, value = 0;
2444
2445         session = iscsi_session_lookup(ev->u.set_param.sid);
2446         conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
2447         if (!conn || !session)
2448                 return -EINVAL;
2449
2450         switch (ev->u.set_param.param) {
2451         case ISCSI_PARAM_SESS_RECOVERY_TMO:
2452                 sscanf(data, "%d", &value);
2453                 session->recovery_tmo = value;
2454                 break;
2455         default:
2456                 err = transport->set_param(conn, ev->u.set_param.param,
2457                                            data, ev->u.set_param.len);
2458         }
2459
2460         return err;
2461 }
2462
2463 static int iscsi_if_ep_connect(struct iscsi_transport *transport,
2464                                struct iscsi_uevent *ev, int msg_type)
2465 {
2466         struct iscsi_endpoint *ep;
2467         struct sockaddr *dst_addr;
2468         struct Scsi_Host *shost = NULL;
2469         int non_blocking, err = 0;
2470
2471         if (!transport->ep_connect)
2472                 return -EINVAL;
2473
2474         if (msg_type == ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST) {
2475                 shost = scsi_host_lookup(ev->u.ep_connect_through_host.host_no);
2476                 if (!shost) {
2477                         printk(KERN_ERR "ep connect failed. Could not find "
2478                                "host no %u\n",
2479                                ev->u.ep_connect_through_host.host_no);
2480                         return -ENODEV;
2481                 }
2482                 non_blocking = ev->u.ep_connect_through_host.non_blocking;
2483         } else
2484                 non_blocking = ev->u.ep_connect.non_blocking;
2485
2486         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
2487         ep = transport->ep_connect(shost, dst_addr, non_blocking);
2488         if (IS_ERR(ep)) {
2489                 err = PTR_ERR(ep);
2490                 goto release_host;
2491         }
2492
2493         ev->r.ep_connect_ret.handle = ep->id;
2494 release_host:
2495         if (shost)
2496                 scsi_host_put(shost);
2497         return err;
2498 }
2499
2500 static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
2501                                   u64 ep_handle)
2502 {
2503         struct iscsi_cls_conn *conn;
2504         struct iscsi_endpoint *ep;
2505
2506         if (!transport->ep_disconnect)
2507                 return -EINVAL;
2508
2509         ep = iscsi_lookup_endpoint(ep_handle);
2510         if (!ep)
2511                 return -EINVAL;
2512         conn = ep->conn;
2513         if (conn) {
2514                 mutex_lock(&conn->ep_mutex);
2515                 conn->ep = NULL;
2516                 mutex_unlock(&conn->ep_mutex);
2517         }
2518
2519         transport->ep_disconnect(ep);
2520         return 0;
2521 }
2522
2523 static int
2524 iscsi_if_transport_ep(struct iscsi_transport *transport,
2525                       struct iscsi_uevent *ev, int msg_type)
2526 {
2527         struct iscsi_endpoint *ep;
2528         int rc = 0;
2529
2530         switch (msg_type) {
2531         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
2532         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
2533                 rc = iscsi_if_ep_connect(transport, ev, msg_type);
2534                 break;
2535         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
2536                 if (!transport->ep_poll)
2537                         return -EINVAL;
2538
2539                 ep = iscsi_lookup_endpoint(ev->u.ep_poll.ep_handle);
2540                 if (!ep)
2541                         return -EINVAL;
2542
2543                 ev->r.retcode = transport->ep_poll(ep,
2544                                                    ev->u.ep_poll.timeout_ms);
2545                 break;
2546         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
2547                 rc = iscsi_if_ep_disconnect(transport,
2548                                             ev->u.ep_disconnect.ep_handle);
2549                 break;
2550         }
2551         return rc;
2552 }
2553
2554 static int
2555 iscsi_tgt_dscvr(struct iscsi_transport *transport,
2556                 struct iscsi_uevent *ev)
2557 {
2558         struct Scsi_Host *shost;
2559         struct sockaddr *dst_addr;
2560         int err;
2561
2562         if (!transport->tgt_dscvr)
2563                 return -EINVAL;
2564
2565         shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
2566         if (!shost) {
2567                 printk(KERN_ERR "target discovery could not find host no %u\n",
2568                        ev->u.tgt_dscvr.host_no);
2569                 return -ENODEV;
2570         }
2571
2572
2573         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
2574         err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type,
2575                                    ev->u.tgt_dscvr.enable, dst_addr);
2576         scsi_host_put(shost);
2577         return err;
2578 }
2579
2580 static int
2581 iscsi_set_host_param(struct iscsi_transport *transport,
2582                      struct iscsi_uevent *ev)
2583 {
2584         char *data = (char*)ev + sizeof(*ev);
2585         struct Scsi_Host *shost;
2586         int err;
2587
2588         if (!transport->set_host_param)
2589                 return -ENOSYS;
2590
2591         shost = scsi_host_lookup(ev->u.set_host_param.host_no);
2592         if (!shost) {
2593                 printk(KERN_ERR "set_host_param could not find host no %u\n",
2594                        ev->u.set_host_param.host_no);
2595                 return -ENODEV;
2596         }
2597
2598         err = transport->set_host_param(shost, ev->u.set_host_param.param,
2599                                         data, ev->u.set_host_param.len);
2600         scsi_host_put(shost);
2601         return err;
2602 }
2603
2604 static int
2605 iscsi_set_path(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2606 {
2607         struct Scsi_Host *shost;
2608         struct iscsi_path *params;
2609         int err;
2610
2611         if (!transport->set_path)
2612                 return -ENOSYS;
2613
2614         shost = scsi_host_lookup(ev->u.set_path.host_no);
2615         if (!shost) {
2616                 printk(KERN_ERR "set path could not find host no %u\n",
2617                        ev->u.set_path.host_no);
2618                 return -ENODEV;
2619         }
2620
2621         params = (struct iscsi_path *)((char *)ev + sizeof(*ev));
2622         err = transport->set_path(shost, params);
2623
2624         scsi_host_put(shost);
2625         return err;
2626 }
2627
2628 static int
2629 iscsi_set_iface_params(struct iscsi_transport *transport,
2630                        struct iscsi_uevent *ev, uint32_t len)
2631 {
2632         char *data = (char *)ev + sizeof(*ev);
2633         struct Scsi_Host *shost;
2634         int err;
2635
2636         if (!transport->set_iface_param)
2637                 return -ENOSYS;
2638
2639         shost = scsi_host_lookup(ev->u.set_iface_params.host_no);
2640         if (!shost) {
2641                 printk(KERN_ERR "set_iface_params could not find host no %u\n",
2642                        ev->u.set_iface_params.host_no);
2643                 return -ENODEV;
2644         }
2645
2646         err = transport->set_iface_param(shost, data, len);
2647         scsi_host_put(shost);
2648         return err;
2649 }
2650
2651 static int
2652 iscsi_send_ping(struct iscsi_transport *transport, struct iscsi_uevent *ev)
2653 {
2654         struct Scsi_Host *shost;
2655         struct sockaddr *dst_addr;
2656         int err;
2657
2658         if (!transport->send_ping)
2659                 return -ENOSYS;
2660
2661         shost = scsi_host_lookup(ev->u.iscsi_ping.host_no);
2662         if (!shost) {
2663                 printk(KERN_ERR "iscsi_ping could not find host no %u\n",
2664                        ev->u.iscsi_ping.host_no);
2665                 return -ENODEV;
2666         }
2667
2668         dst_addr = (struct sockaddr *)((char *)ev + sizeof(*ev));
2669         err = transport->send_ping(shost, ev->u.iscsi_ping.iface_num,
2670                                    ev->u.iscsi_ping.iface_type,
2671                                    ev->u.iscsi_ping.payload_size,
2672                                    ev->u.iscsi_ping.pid,
2673                                    dst_addr);
2674         scsi_host_put(shost);
2675         return err;
2676 }
2677
2678 static int
2679 iscsi_get_chap(struct iscsi_transport *transport, struct nlmsghdr *nlh)
2680 {
2681         struct iscsi_uevent *ev = nlmsg_data(nlh);
2682         struct Scsi_Host *shost = NULL;
2683         struct iscsi_chap_rec *chap_rec;
2684         struct iscsi_internal *priv;
2685         struct sk_buff *skbchap;
2686         struct nlmsghdr *nlhchap;
2687         struct iscsi_uevent *evchap;
2688         uint32_t chap_buf_size;
2689         int len, err = 0;
2690         char *buf;
2691
2692         if (!transport->get_chap)
2693                 return -EINVAL;
2694
2695         priv = iscsi_if_transport_lookup(transport);
2696         if (!priv)
2697                 return -EINVAL;
2698
2699         chap_buf_size = (ev->u.get_chap.num_entries * sizeof(*chap_rec));
2700         len = nlmsg_total_size(sizeof(*ev) + chap_buf_size);
2701
2702         shost = scsi_host_lookup(ev->u.get_chap.host_no);
2703         if (!shost) {
2704                 printk(KERN_ERR "%s: failed. Cound not find host no %u\n",
2705                        __func__, ev->u.get_chap.host_no);
2706                 return -ENODEV;
2707         }
2708
2709         do {
2710                 int actual_size;
2711
2712                 skbchap = alloc_skb(len, GFP_KERNEL);
2713                 if (!skbchap) {
2714                         printk(KERN_ERR "can not deliver chap: OOM\n");
2715                         err = -ENOMEM;
2716                         goto exit_get_chap;
2717                 }
2718
2719                 nlhchap = __nlmsg_put(skbchap, 0, 0, 0,
2720                                       (len - sizeof(*nlhchap)), 0);
2721                 evchap = nlmsg_data(nlhchap);
2722                 memset(evchap, 0, sizeof(*evchap));
2723                 evchap->transport_handle = iscsi_handle(transport);
2724                 evchap->type = nlh->nlmsg_type;
2725                 evchap->u.get_chap.host_no = ev->u.get_chap.host_no;
2726                 evchap->u.get_chap.chap_tbl_idx = ev->u.get_chap.chap_tbl_idx;
2727                 evchap->u.get_chap.num_entries = ev->u.get_chap.num_entries;
2728                 buf = (char *) ((char *)evchap + sizeof(*evchap));
2729                 memset(buf, 0, chap_buf_size);
2730
2731                 err = transport->get_chap(shost, ev->u.get_chap.chap_tbl_idx,
2732                                     &evchap->u.get_chap.num_entries, buf);
2733
2734                 actual_size = nlmsg_total_size(sizeof(*ev) + chap_buf_size);
2735                 skb_trim(skbchap, NLMSG_ALIGN(actual_size));
2736                 nlhchap->nlmsg_len = actual_size;
2737
2738                 err = iscsi_multicast_skb(skbchap, ISCSI_NL_GRP_ISCSID,
2739                                           GFP_KERNEL);
2740         } while (err < 0 && err != -ECONNREFUSED);
2741
2742 exit_get_chap:
2743         scsi_host_put(shost);
2744         return err;
2745 }
2746
2747 static int iscsi_set_chap(struct iscsi_transport *transport,
2748                           struct iscsi_uevent *ev, uint32_t len)
2749 {
2750         char *data = (char *)ev + sizeof(*ev);
2751         struct Scsi_Host *shost;
2752         int err = 0;
2753
2754         if (!transport->set_chap)
2755                 return -ENOSYS;
2756
2757         shost = scsi_host_lookup(ev->u.set_path.host_no);
2758         if (!shost) {
2759                 pr_err("%s could not find host no %u\n",
2760                        __func__, ev->u.set_path.host_no);
2761                 return -ENODEV;
2762         }
2763
2764         err = transport->set_chap(shost, data, len);
2765         scsi_host_put(shost);
2766         return err;
2767 }
2768
2769 static int iscsi_delete_chap(struct iscsi_transport *transport,
2770                              struct iscsi_uevent *ev)
2771 {
2772         struct Scsi_Host *shost;
2773         int err = 0;
2774
2775         if (!transport->delete_chap)
2776                 return -ENOSYS;
2777
2778         shost = scsi_host_lookup(ev->u.delete_chap.host_no);
2779         if (!shost) {
2780                 printk(KERN_ERR "%s could not find host no %u\n",
2781                        __func__, ev->u.delete_chap.host_no);
2782                 return -ENODEV;
2783         }
2784
2785         err = transport->delete_chap(shost, ev->u.delete_chap.chap_tbl_idx);
2786         scsi_host_put(shost);
2787         return err;
2788 }
2789
2790 static const struct {
2791         enum iscsi_discovery_parent_type value;
2792         char                            *name;
2793 } iscsi_discovery_parent_names[] = {
2794         {ISCSI_DISC_PARENT_UNKNOWN,     "Unknown" },
2795         {ISCSI_DISC_PARENT_SENDTGT,     "Sendtarget" },
2796         {ISCSI_DISC_PARENT_ISNS,        "isns" },
2797 };
2798
2799 char *iscsi_get_discovery_parent_name(int parent_type)
2800 {
2801         int i;
2802         char *state = "Unknown!";
2803
2804         for (i = 0; i < ARRAY_SIZE(iscsi_discovery_parent_names); i++) {
2805                 if (iscsi_discovery_parent_names[i].value & parent_type) {
2806                         state = iscsi_discovery_parent_names[i].name;
2807                         break;
2808                 }
2809         }
2810         return state;
2811 }
2812 EXPORT_SYMBOL_GPL(iscsi_get_discovery_parent_name);
2813
2814 static int iscsi_set_flashnode_param(struct iscsi_transport *transport,
2815                                      struct iscsi_uevent *ev, uint32_t len)
2816 {
2817         char *data = (char *)ev + sizeof(*ev);
2818         struct Scsi_Host *shost;
2819         struct iscsi_bus_flash_session *fnode_sess;
2820         struct iscsi_bus_flash_conn *fnode_conn;
2821         struct device *dev;
2822         uint32_t idx;
2823         int err = 0;
2824
2825         if (!transport->set_flashnode_param) {
2826                 err = -ENOSYS;
2827                 goto exit_set_fnode;
2828         }
2829
2830         shost = scsi_host_lookup(ev->u.set_flashnode.host_no);
2831         if (!shost) {
2832                 pr_err("%s could not find host no %u\n",
2833                        __func__, ev->u.set_flashnode.host_no);
2834                 err = -ENODEV;
2835                 goto put_host;
2836         }
2837
2838         idx = ev->u.set_flashnode.flashnode_idx;
2839         fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
2840         if (!fnode_sess) {
2841                 pr_err("%s could not find flashnode %u for host no %u\n",
2842                        __func__, idx, ev->u.set_flashnode.host_no);
2843                 err = -ENODEV;
2844                 goto put_host;
2845         }
2846
2847         dev = iscsi_find_flashnode_conn(fnode_sess);
2848         if (!dev) {
2849                 err = -ENODEV;
2850                 goto put_sess;
2851         }
2852
2853         fnode_conn = iscsi_dev_to_flash_conn(dev);
2854         err = transport->set_flashnode_param(fnode_sess, fnode_conn, data, len);
2855         put_device(dev);
2856
2857 put_sess:
2858         put_device(&fnode_sess->dev);
2859
2860 put_host:
2861         scsi_host_put(shost);
2862
2863 exit_set_fnode:
2864         return err;
2865 }
2866
2867 static int iscsi_new_flashnode(struct iscsi_transport *transport,
2868                                struct iscsi_uevent *ev, uint32_t len)
2869 {
2870         char *data = (char *)ev + sizeof(*ev);
2871         struct Scsi_Host *shost;
2872         int index;
2873         int err = 0;
2874
2875         if (!transport->new_flashnode) {
2876                 err = -ENOSYS;
2877                 goto exit_new_fnode;
2878         }
2879
2880         shost = scsi_host_lookup(ev->u.new_flashnode.host_no);
2881         if (!shost) {
2882                 pr_err("%s could not find host no %u\n",
2883                        __func__, ev->u.new_flashnode.host_no);
2884                 err = -ENODEV;
2885                 goto put_host;
2886         }
2887
2888         index = transport->new_flashnode(shost, data, len);
2889
2890         if (index >= 0)
2891                 ev->r.new_flashnode_ret.flashnode_idx = index;
2892         else
2893                 err = -EIO;
2894
2895 put_host:
2896         scsi_host_put(shost);
2897
2898 exit_new_fnode:
2899         return err;
2900 }
2901
2902 static int iscsi_del_flashnode(struct iscsi_transport *transport,
2903                                struct iscsi_uevent *ev)
2904 {
2905         struct Scsi_Host *shost;
2906         struct iscsi_bus_flash_session *fnode_sess;
2907         uint32_t idx;
2908         int err = 0;
2909
2910         if (!transport->del_flashnode) {
2911                 err = -ENOSYS;
2912                 goto exit_del_fnode;
2913         }
2914
2915         shost = scsi_host_lookup(ev->u.del_flashnode.host_no);
2916         if (!shost) {
2917                 pr_err("%s could not find host no %u\n",
2918                        __func__, ev->u.del_flashnode.host_no);
2919                 err = -ENODEV;
2920                 goto put_host;
2921         }
2922
2923         idx = ev->u.del_flashnode.flashnode_idx;
2924         fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
2925         if (!fnode_sess) {
2926                 pr_err("%s could not find flashnode %u for host no %u\n",
2927                        __func__, idx, ev->u.del_flashnode.host_no);
2928                 err = -ENODEV;
2929                 goto put_host;
2930         }
2931
2932         err = transport->del_flashnode(fnode_sess);
2933         put_device(&fnode_sess->dev);
2934
2935 put_host:
2936         scsi_host_put(shost);
2937
2938 exit_del_fnode:
2939         return err;
2940 }
2941
2942 static int iscsi_login_flashnode(struct iscsi_transport *transport,
2943                                  struct iscsi_uevent *ev)
2944 {
2945         struct Scsi_Host *shost;
2946         struct iscsi_bus_flash_session *fnode_sess;
2947         struct iscsi_bus_flash_conn *fnode_conn;
2948         struct device *dev;
2949         uint32_t idx;
2950         int err = 0;
2951
2952         if (!transport->login_flashnode) {
2953                 err = -ENOSYS;
2954                 goto exit_login_fnode;
2955         }
2956
2957         shost = scsi_host_lookup(ev->u.login_flashnode.host_no);
2958         if (!shost) {
2959                 pr_err("%s could not find host no %u\n",
2960                        __func__, ev->u.login_flashnode.host_no);
2961                 err = -ENODEV;
2962                 goto put_host;
2963         }
2964
2965         idx = ev->u.login_flashnode.flashnode_idx;
2966         fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
2967         if (!fnode_sess) {
2968                 pr_err("%s could not find flashnode %u for host no %u\n",
2969                        __func__, idx, ev->u.login_flashnode.host_no);
2970                 err = -ENODEV;
2971                 goto put_host;
2972         }
2973
2974         dev = iscsi_find_flashnode_conn(fnode_sess);
2975         if (!dev) {
2976                 err = -ENODEV;
2977                 goto put_sess;
2978         }
2979
2980         fnode_conn = iscsi_dev_to_flash_conn(dev);
2981         err = transport->login_flashnode(fnode_sess, fnode_conn);
2982         put_device(dev);
2983
2984 put_sess:
2985         put_device(&fnode_sess->dev);
2986
2987 put_host:
2988         scsi_host_put(shost);
2989
2990 exit_login_fnode:
2991         return err;
2992 }
2993
2994 static int iscsi_logout_flashnode(struct iscsi_transport *transport,
2995                                   struct iscsi_uevent *ev)
2996 {
2997         struct Scsi_Host *shost;
2998         struct iscsi_bus_flash_session *fnode_sess;
2999         struct iscsi_bus_flash_conn *fnode_conn;
3000         struct device *dev;
3001         uint32_t idx;
3002         int err = 0;
3003
3004         if (!transport->logout_flashnode) {
3005                 err = -ENOSYS;
3006                 goto exit_logout_fnode;
3007         }
3008
3009         shost = scsi_host_lookup(ev->u.logout_flashnode.host_no);
3010         if (!shost) {
3011                 pr_err("%s could not find host no %u\n",
3012                        __func__, ev->u.logout_flashnode.host_no);
3013                 err = -ENODEV;
3014                 goto put_host;
3015         }
3016
3017         idx = ev->u.logout_flashnode.flashnode_idx;
3018         fnode_sess = iscsi_get_flashnode_by_index(shost, idx);
3019         if (!fnode_sess) {
3020                 pr_err("%s could not find flashnode %u for host no %u\n",
3021                        __func__, idx, ev->u.logout_flashnode.host_no);
3022                 err = -ENODEV;
3023                 goto put_host;
3024         }
3025
3026         dev = iscsi_find_flashnode_conn(fnode_sess);
3027         if (!dev) {
3028                 err = -ENODEV;
3029                 goto put_sess;
3030         }
3031
3032         fnode_conn = iscsi_dev_to_flash_conn(dev);
3033
3034         err = transport->logout_flashnode(fnode_sess, fnode_conn);
3035         put_device(dev);
3036
3037 put_sess:
3038         put_device(&fnode_sess->dev);
3039
3040 put_host:
3041         scsi_host_put(shost);
3042
3043 exit_logout_fnode:
3044         return err;
3045 }
3046
3047 static int iscsi_logout_flashnode_sid(struct iscsi_transport *transport,
3048                                       struct iscsi_uevent *ev)
3049 {
3050         struct Scsi_Host *shost;
3051         struct iscsi_cls_session *session;
3052         int err = 0;
3053
3054         if (!transport->logout_flashnode_sid) {
3055                 err = -ENOSYS;
3056                 goto exit_logout_sid;
3057         }
3058
3059         shost = scsi_host_lookup(ev->u.logout_flashnode_sid.host_no);
3060         if (!shost) {
3061                 pr_err("%s could not find host no %u\n",
3062                        __func__, ev->u.logout_flashnode.host_no);
3063                 err = -ENODEV;
3064                 goto put_host;
3065         }
3066
3067         session = iscsi_session_lookup(ev->u.logout_flashnode_sid.sid);
3068         if (!session) {
3069                 pr_err("%s could not find session id %u\n",
3070                        __func__, ev->u.logout_flashnode_sid.sid);
3071                 err = -EINVAL;
3072                 goto put_host;
3073         }
3074
3075         err = transport->logout_flashnode_sid(session);
3076
3077 put_host:
3078         scsi_host_put(shost);
3079
3080 exit_logout_sid:
3081         return err;
3082 }
3083
3084 static int
3085 iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
3086 {
3087         int err = 0;
3088         struct iscsi_uevent *ev = nlmsg_data(nlh);
3089         struct iscsi_transport *transport = NULL;
3090         struct iscsi_internal *priv;
3091         struct iscsi_cls_session *session;
3092         struct iscsi_cls_conn *conn;
3093         struct iscsi_endpoint *ep = NULL;
3094
3095         if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE)
3096                 *group = ISCSI_NL_GRP_UIP;
3097         else
3098                 *group = ISCSI_NL_GRP_ISCSID;
3099
3100         priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle));
3101         if (!priv)
3102                 return -EINVAL;
3103         transport = priv->iscsi_transport;
3104
3105         if (!try_module_get(transport->owner))
3106                 return -EINVAL;
3107
3108         switch (nlh->nlmsg_type) {
3109         case ISCSI_UEVENT_CREATE_SESSION:
3110                 err = iscsi_if_create_session(priv, ep, ev,
3111                                               NETLINK_CB(skb).portid,
3112                                               ev->u.c_session.initial_cmdsn,
3113                                               ev->u.c_session.cmds_max,
3114                                               ev->u.c_session.queue_depth);
3115                 break;
3116         case ISCSI_UEVENT_CREATE_BOUND_SESSION:
3117                 ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle);
3118                 if (!ep) {
3119                         err = -EINVAL;
3120                         break;
3121                 }
3122
3123                 err = iscsi_if_create_session(priv, ep, ev,
3124                                         NETLINK_CB(skb).portid,
3125                                         ev->u.c_bound_session.initial_cmdsn,
3126                                         ev->u.c_bound_session.cmds_max,
3127                                         ev->u.c_bound_session.queue_depth);
3128                 break;
3129         case ISCSI_UEVENT_DESTROY_SESSION:
3130                 session = iscsi_session_lookup(ev->u.d_session.sid);
3131                 if (session)
3132                         transport->destroy_session(session);
3133                 else
3134                         err = -EINVAL;
3135                 break;
3136         case ISCSI_UEVENT_UNBIND_SESSION:
3137                 session = iscsi_session_lookup(ev->u.d_session.sid);
3138                 if (session)
3139                         scsi_queue_work(iscsi_session_to_shost(session),
3140                                         &session->unbind_work);
3141                 else
3142                         err = -EINVAL;
3143                 break;
3144         case ISCSI_UEVENT_CREATE_CONN:
3145                 err = iscsi_if_create_conn(transport, ev);
3146                 break;
3147         case ISCSI_UEVENT_DESTROY_CONN:
3148                 err = iscsi_if_destroy_conn(transport, ev);
3149                 break;
3150         case ISCSI_UEVENT_BIND_CONN:
3151                 session = iscsi_session_lookup(ev->u.b_conn.sid);
3152                 conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
3153
3154                 if (conn && conn->ep)
3155                         iscsi_if_ep_disconnect(transport, conn->ep->id);
3156
3157                 if (!session || !conn) {
3158                         err = -EINVAL;
3159                         break;
3160                 }
3161
3162                 ev->r.retcode = transport->bind_conn(session, conn,
3163                                                 ev->u.b_conn.transport_eph,
3164                                                 ev->u.b_conn.is_leading);
3165                 if (ev->r.retcode || !transport->ep_connect)
3166                         break;
3167
3168                 ep = iscsi_lookup_endpoint(ev->u.b_conn.transport_eph);
3169                 if (ep) {
3170                         ep->conn = conn;
3171
3172                         mutex_lock(&conn->ep_mutex);
3173                         conn->ep = ep;
3174                         mutex_unlock(&conn->ep_mutex);
3175                 } else
3176                         iscsi_cls_conn_printk(KERN_ERR, conn,
3177                                               "Could not set ep conn "
3178                                               "binding\n");
3179                 break;
3180         case ISCSI_UEVENT_SET_PARAM:
3181                 err = iscsi_set_param(transport, ev);
3182                 break;
3183         case ISCSI_UEVENT_START_CONN:
3184                 conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
3185                 if (conn)
3186                         ev->r.retcode = transport->start_conn(conn);
3187                 else
3188                         err = -EINVAL;
3189                 break;
3190         case ISCSI_UEVENT_STOP_CONN:
3191                 conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
3192                 if (conn)
3193                         transport->stop_conn(conn, ev->u.stop_conn.flag);
3194                 else
3195                         err = -EINVAL;
3196                 break;
3197         case ISCSI_UEVENT_SEND_PDU:
3198                 conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
3199                 if (conn)
3200                         ev->r.retcode = transport->send_pdu(conn,
3201                                 (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
3202                                 (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
3203                                 ev->u.send_pdu.data_size);
3204                 else
3205                         err = -EINVAL;
3206                 break;
3207         case ISCSI_UEVENT_GET_STATS:
3208                 err = iscsi_if_get_stats(transport, nlh);
3209                 break;
3210         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
3211         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
3212         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
3213         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
3214                 err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
3215                 break;
3216         case ISCSI_UEVENT_TGT_DSCVR:
3217                 err = iscsi_tgt_dscvr(transport, ev);
3218                 break;
3219         case ISCSI_UEVENT_SET_HOST_PARAM:
3220                 err = iscsi_set_host_param(transport, ev);
3221                 break;
3222         case ISCSI_UEVENT_PATH_UPDATE:
3223                 err = iscsi_set_path(transport, ev);
3224                 break;
3225         case ISCSI_UEVENT_SET_IFACE_PARAMS:
3226                 err = iscsi_set_iface_params(transport, ev,
3227                                              nlmsg_attrlen(nlh, sizeof(*ev)));
3228                 break;
3229         case ISCSI_UEVENT_PING:
3230                 err = iscsi_send_ping(transport, ev);
3231                 break;
3232         case ISCSI_UEVENT_GET_CHAP:
3233                 err = iscsi_get_chap(transport, nlh);
3234                 break;
3235         case ISCSI_UEVENT_DELETE_CHAP:
3236                 err = iscsi_delete_chap(transport, ev);
3237                 break;
3238         case ISCSI_UEVENT_SET_FLASHNODE_PARAMS:
3239                 err = iscsi_set_flashnode_param(transport, ev,
3240                                                 nlmsg_attrlen(nlh,
3241                                                               sizeof(*ev)));
3242                 break;
3243         case ISCSI_UEVENT_NEW_FLASHNODE:
3244                 err = iscsi_new_flashnode(transport, ev,
3245                                           nlmsg_attrlen(nlh, sizeof(*ev)));
3246                 break;
3247         case ISCSI_UEVENT_DEL_FLASHNODE:
3248                 err = iscsi_del_flashnode(transport, ev);
3249                 break;
3250         case ISCSI_UEVENT_LOGIN_FLASHNODE:
3251                 err = iscsi_login_flashnode(transport, ev);
3252                 break;
3253         case ISCSI_UEVENT_LOGOUT_FLASHNODE:
3254                 err = iscsi_logout_flashnode(transport, ev);
3255                 break;
3256         case ISCSI_UEVENT_LOGOUT_FLASHNODE_SID:
3257                 err = iscsi_logout_flashnode_sid(transport, ev);
3258                 break;
3259         case ISCSI_UEVENT_SET_CHAP:
3260                 err = iscsi_set_chap(transport, ev,
3261                                      nlmsg_attrlen(nlh, sizeof(*ev)));
3262                 break;
3263         default:
3264                 err = -ENOSYS;
3265                 break;
3266         }
3267
3268         module_put(transport->owner);
3269         return err;
3270 }
3271
3272 /*
3273  * Get message from skb.  Each message is processed by iscsi_if_recv_msg.
3274  * Malformed skbs with wrong lengths or invalid creds are not processed.
3275  */
3276 static void
3277 iscsi_if_rx(struct sk_buff *skb)
3278 {
3279         mutex_lock(&rx_queue_mutex);
3280         while (skb->len >= NLMSG_HDRLEN) {
3281                 int err;
3282                 uint32_t rlen;
3283                 struct nlmsghdr *nlh;
3284                 struct iscsi_uevent *ev;
3285                 uint32_t group;
3286
3287                 nlh = nlmsg_hdr(skb);
3288                 if (nlh->nlmsg_len < sizeof(*nlh) ||
3289                     skb->len < nlh->nlmsg_len) {
3290                         break;
3291                 }
3292
3293                 ev = nlmsg_data(nlh);
3294                 rlen = NLMSG_ALIGN(nlh->nlmsg_len);
3295                 if (rlen > skb->len)
3296                         rlen = skb->len;
3297
3298                 err = iscsi_if_recv_msg(skb, nlh, &group);
3299                 if (err) {
3300                         ev->type = ISCSI_KEVENT_IF_ERROR;
3301                         ev->iferror = err;
3302                 }
3303                 do {
3304                         /*
3305                          * special case for GET_STATS:
3306                          * on success - sending reply and stats from
3307                          * inside of if_recv_msg(),
3308                          * on error - fall through.
3309                          */
3310                         if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
3311                                 break;
3312                         if (ev->type == ISCSI_UEVENT_GET_CHAP && !err)
3313                                 break;
3314                         err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
3315                                 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
3316                 } while (err < 0 && err != -ECONNREFUSED && err != -ESRCH);
3317                 skb_pull(skb, rlen);
3318         }
3319         mutex_unlock(&rx_queue_mutex);
3320 }
3321
3322 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store)              \
3323 struct device_attribute dev_attr_##_prefix##_##_name =  \
3324         __ATTR(_name,_mode,_show,_store)
3325
3326 /*
3327  * iSCSI connection attrs
3328  */
3329 #define iscsi_conn_attr_show(param)                                     \
3330 static ssize_t                                                          \
3331 show_conn_param_##param(struct device *dev,                             \
3332                         struct device_attribute *attr, char *buf)       \
3333 {                                                                       \
3334         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
3335         struct iscsi_transport *t = conn->transport;                    \
3336         return t->get_conn_param(conn, param, buf);                     \
3337 }
3338
3339 #define iscsi_conn_attr(field, param)                                   \
3340         iscsi_conn_attr_show(param)                                     \
3341 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param,  \
3342                         NULL);
3343
3344 iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
3345 iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
3346 iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
3347 iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
3348 iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
3349 iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
3350 iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
3351 iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
3352 iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
3353 iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO);
3354 iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO);
3355 iscsi_conn_attr(local_port, ISCSI_PARAM_LOCAL_PORT);
3356 iscsi_conn_attr(statsn, ISCSI_PARAM_STATSN);
3357 iscsi_conn_attr(keepalive_tmo, ISCSI_PARAM_KEEPALIVE_TMO);
3358 iscsi_conn_attr(max_segment_size, ISCSI_PARAM_MAX_SEGMENT_SIZE);
3359 iscsi_conn_attr(tcp_timestamp_stat, ISCSI_PARAM_TCP_TIMESTAMP_STAT);
3360 iscsi_conn_attr(tcp_wsf_disable, ISCSI_PARAM_TCP_WSF_DISABLE);
3361 iscsi_conn_attr(tcp_nagle_disable, ISCSI_PARAM_TCP_NAGLE_DISABLE);
3362 iscsi_conn_attr(tcp_timer_scale, ISCSI_PARAM_TCP_TIMER_SCALE);
3363 iscsi_conn_attr(tcp_timestamp_enable, ISCSI_PARAM_TCP_TIMESTAMP_EN);
3364 iscsi_conn_attr(fragment_disable, ISCSI_PARAM_IP_FRAGMENT_DISABLE);
3365 iscsi_conn_attr(ipv4_tos, ISCSI_PARAM_IPV4_TOS);
3366 iscsi_conn_attr(ipv6_traffic_class, ISCSI_PARAM_IPV6_TC);
3367 iscsi_conn_attr(ipv6_flow_label, ISCSI_PARAM_IPV6_FLOW_LABEL);
3368 iscsi_conn_attr(is_fw_assigned_ipv6, ISCSI_PARAM_IS_FW_ASSIGNED_IPV6);
3369 iscsi_conn_attr(tcp_xmit_wsf, ISCSI_PARAM_TCP_XMIT_WSF);
3370 iscsi_conn_attr(tcp_recv_wsf, ISCSI_PARAM_TCP_RECV_WSF);
3371
3372
3373 #define iscsi_conn_ep_attr_show(param)                                  \
3374 static ssize_t show_conn_ep_param_##param(struct device *dev,           \
3375                                           struct device_attribute *attr,\
3376                                           char *buf)                    \
3377 {                                                                       \
3378         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
3379         struct iscsi_transport *t = conn->transport;                    \
3380         struct iscsi_endpoint *ep;                                      \
3381         ssize_t rc;                                                     \
3382                                                                         \
3383         /*                                                              \
3384          * Need to make sure ep_disconnect does not free the LLD's      \
3385          * interconnect resources while we are trying to read them.     \
3386          */                                                             \
3387         mutex_lock(&conn->ep_mutex);                                    \
3388         ep = conn->ep;                                                  \
3389         if (!ep && t->ep_connect) {                                     \
3390                 mutex_unlock(&conn->ep_mutex);                          \
3391                 return -ENOTCONN;                                       \
3392         }                                                               \
3393                                                                         \
3394         if (ep)                                                         \
3395                 rc = t->get_ep_param(ep, param, buf);                   \
3396         else                                                            \
3397                 rc = t->get_conn_param(conn, param, buf);               \
3398         mutex_unlock(&conn->ep_mutex);                                  \
3399         return rc;                                                      \
3400 }
3401
3402 #define iscsi_conn_ep_attr(field, param)                                \
3403         iscsi_conn_ep_attr_show(param)                                  \
3404 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO,                           \
3405                         show_conn_ep_param_##param, NULL);
3406
3407 iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS);
3408 iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT);
3409
3410 static struct attribute *iscsi_conn_attrs[] = {
3411         &dev_attr_conn_max_recv_dlength.attr,
3412         &dev_attr_conn_max_xmit_dlength.attr,
3413         &dev_attr_conn_header_digest.attr,
3414         &dev_attr_conn_data_digest.attr,
3415         &dev_attr_conn_ifmarker.attr,
3416         &dev_attr_conn_ofmarker.attr,
3417         &dev_attr_conn_address.attr,
3418         &dev_attr_conn_port.attr,
3419         &dev_attr_conn_exp_statsn.attr,
3420         &dev_attr_conn_persistent_address.attr,
3421         &dev_attr_conn_persistent_port.attr,
3422         &dev_attr_conn_ping_tmo.attr,
3423         &dev_attr_conn_recv_tmo.attr,
3424         &dev_attr_conn_local_port.attr,
3425         &dev_attr_conn_statsn.attr,
3426         &dev_attr_conn_keepalive_tmo.attr,
3427         &dev_attr_conn_max_segment_size.attr,
3428         &dev_attr_conn_tcp_timestamp_stat.attr,
3429         &dev_attr_conn_tcp_wsf_disable.attr,
3430         &dev_attr_conn_tcp_nagle_disable.attr,
3431         &dev_attr_conn_tcp_timer_scale.attr,
3432         &dev_attr_conn_tcp_timestamp_enable.attr,
3433         &dev_attr_conn_fragment_disable.attr,
3434         &dev_attr_conn_ipv4_tos.attr,
3435         &dev_attr_conn_ipv6_traffic_class.attr,
3436         &dev_attr_conn_ipv6_flow_label.attr,
3437         &dev_attr_conn_is_fw_assigned_ipv6.attr,
3438         &dev_attr_conn_tcp_xmit_wsf.attr,
3439         &dev_attr_conn_tcp_recv_wsf.attr,
3440         NULL,
3441 };
3442
3443 static umode_t iscsi_conn_attr_is_visible(struct kobject *kobj,
3444                                          struct attribute *attr, int i)
3445 {
3446         struct device *cdev = container_of(kobj, struct device, kobj);
3447         struct iscsi_cls_conn *conn = transport_class_to_conn(cdev);
3448         struct iscsi_transport *t = conn->transport;
3449         int param;
3450
3451         if (attr == &dev_attr_conn_max_recv_dlength.attr)
3452                 param = ISCSI_PARAM_MAX_RECV_DLENGTH;
3453         else if (attr == &dev_attr_conn_max_xmit_dlength.attr)
3454                 param = ISCSI_PARAM_MAX_XMIT_DLENGTH;
3455         else if (attr == &dev_attr_conn_header_digest.attr)
3456                 param = ISCSI_PARAM_HDRDGST_EN;
3457         else if (attr == &dev_attr_conn_data_digest.attr)
3458                 param = ISCSI_PARAM_DATADGST_EN;
3459         else if (attr == &dev_attr_conn_ifmarker.attr)
3460                 param = ISCSI_PARAM_IFMARKER_EN;
3461         else if (attr == &dev_attr_conn_ofmarker.attr)
3462                 param = ISCSI_PARAM_OFMARKER_EN;
3463         else if (attr == &dev_attr_conn_address.attr)
3464                 param = ISCSI_PARAM_CONN_ADDRESS;
3465         else if (attr == &dev_attr_conn_port.attr)
3466                 param = ISCSI_PARAM_CONN_PORT;
3467         else if (attr == &dev_attr_conn_exp_statsn.attr)
3468                 param = ISCSI_PARAM_EXP_STATSN;
3469         else if (attr == &dev_attr_conn_persistent_address.attr)
3470                 param = ISCSI_PARAM_PERSISTENT_ADDRESS;
3471         else if (attr == &dev_attr_conn_persistent_port.attr)
3472                 param = ISCSI_PARAM_PERSISTENT_PORT;
3473         else if (attr == &dev_attr_conn_ping_tmo.attr)
3474                 param = ISCSI_PARAM_PING_TMO;
3475         else if (attr == &dev_attr_conn_recv_tmo.attr)
3476                 param = ISCSI_PARAM_RECV_TMO;
3477         else if (attr == &dev_attr_conn_local_port.attr)
3478                 param = ISCSI_PARAM_LOCAL_PORT;
3479         else if (attr == &dev_attr_conn_statsn.attr)
3480                 param = ISCSI_PARAM_STATSN;
3481         else if (attr == &dev_attr_conn_keepalive_tmo.attr)
3482                 param = ISCSI_PARAM_KEEPALIVE_TMO;
3483         else if (attr == &dev_attr_conn_max_segment_size.attr)
3484                 param = ISCSI_PARAM_MAX_SEGMENT_SIZE;
3485         else if (attr == &dev_attr_conn_tcp_timestamp_stat.attr)
3486                 param = ISCSI_PARAM_TCP_TIMESTAMP_STAT;
3487         else if (attr == &dev_attr_conn_tcp_wsf_disable.attr)
3488                 param = ISCSI_PARAM_TCP_WSF_DISABLE;
3489         else if (attr == &dev_attr_conn_tcp_nagle_disable.attr)
3490                 param = ISCSI_PARAM_TCP_NAGLE_DISABLE;
3491         else if (attr == &dev_attr_conn_tcp_timer_scale.attr)
3492                 param = ISCSI_PARAM_TCP_TIMER_SCALE;
3493         else if (attr == &dev_attr_conn_tcp_timestamp_enable.attr)
3494                 param = ISCSI_PARAM_TCP_TIMESTAMP_EN;
3495         else if (attr == &dev_attr_conn_fragment_disable.attr)
3496                 param = ISCSI_PARAM_IP_FRAGMENT_DISABLE;
3497         else if (attr == &dev_attr_conn_ipv4_tos.attr)
3498                 param = ISCSI_PARAM_IPV4_TOS;
3499         else if (attr == &dev_attr_conn_ipv6_traffic_class.attr)
3500                 param = ISCSI_PARAM_IPV6_TC;
3501         else if (attr == &dev_attr_conn_ipv6_flow_label.attr)
3502                 param = ISCSI_PARAM_IPV6_FLOW_LABEL;
3503         else if (attr == &dev_attr_conn_is_fw_assigned_ipv6.attr)
3504                 param = ISCSI_PARAM_IS_FW_ASSIGNED_IPV6;
3505         else if (attr == &dev_attr_conn_tcp_xmit_wsf.attr)
3506                 param = ISCSI_PARAM_TCP_XMIT_WSF;
3507         else if (attr == &dev_attr_conn_tcp_recv_wsf.attr)
3508                 param = ISCSI_PARAM_TCP_RECV_WSF;
3509         else {
3510                 WARN_ONCE(1, "Invalid conn attr");
3511                 return 0;
3512         }
3513
3514         return t->attr_is_visible(ISCSI_PARAM, param);
3515 }
3516
3517 static struct attribute_group iscsi_conn_group = {
3518         .attrs = iscsi_conn_attrs,
3519         .is_visible = iscsi_conn_attr_is_visible,
3520 };
3521
3522 /*
3523  * iSCSI session attrs
3524  */
3525 #define iscsi_session_attr_show(param, perm)                            \
3526 static ssize_t                                                          \
3527 show_session_param_##param(struct device *dev,                          \
3528                            struct device_attribute *attr, char *buf)    \
3529 {                                                                       \
3530         struct iscsi_cls_session *session =                             \
3531                 iscsi_dev_to_session(dev->parent);                      \
3532         struct iscsi_transport *t = session->transport;                 \
3533                                                                         \
3534         if (perm && !capable(CAP_SYS_ADMIN))                            \
3535                 return -EACCES;                                         \
3536         return t->get_session_param(session, param, buf);               \
3537 }
3538
3539 #define iscsi_session_attr(field, param, perm)                          \
3540         iscsi_session_attr_show(param, perm)                            \
3541 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
3542                         NULL);
3543 iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME, 0);
3544 iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, 0);
3545 iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, 0);
3546 iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, 0);
3547 iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, 0);
3548 iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, 0);
3549 iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, 0);
3550 iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, 0);
3551 iscsi_session_attr(erl, ISCSI_PARAM_ERL, 0);
3552 iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT, 0);
3553 iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1);
3554 iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1);
3555 iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1);
3556 iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1);
3557 iscsi_session_attr(chap_out_idx, ISCSI_PARAM_CHAP_OUT_IDX, 1);
3558 iscsi_session_attr(chap_in_idx, ISCSI_PARAM_CHAP_IN_IDX, 1);
3559 iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0);
3560 iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0);
3561 iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0);
3562 iscsi_session_attr(tgt_reset_tmo, ISCSI_PARAM_TGT_RESET_TMO, 0);
3563 iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0);
3564 iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0);
3565 iscsi_session_attr(targetalias, ISCSI_PARAM_TARGET_ALIAS, 0);
3566 iscsi_session_attr(boot_root, ISCSI_PARAM_BOOT_ROOT, 0);
3567 iscsi_session_attr(boot_nic, ISCSI_PARAM_BOOT_NIC, 0);
3568 iscsi_session_attr(boot_target, ISCSI_PARAM_BOOT_TARGET, 0);
3569 iscsi_session_attr(auto_snd_tgt_disable, ISCSI_PARAM_AUTO_SND_TGT_DISABLE, 0);
3570 iscsi_session_attr(discovery_session, ISCSI_PARAM_DISCOVERY_SESS, 0);
3571 iscsi_session_attr(portal_type, ISCSI_PARAM_PORTAL_TYPE, 0);
3572 iscsi_session_attr(chap_auth, ISCSI_PARAM_CHAP_AUTH_EN, 0);
3573 iscsi_session_attr(discovery_logout, ISCSI_PARAM_DISCOVERY_LOGOUT_EN, 0);
3574 iscsi_session_attr(bidi_chap, ISCSI_PARAM_BIDI_CHAP_EN, 0);
3575 iscsi_session_attr(discovery_auth_optional,
3576                    ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL, 0);
3577 iscsi_session_attr(def_time2wait, ISCSI_PARAM_DEF_TIME2WAIT, 0);
3578 iscsi_session_attr(def_time2retain, ISCSI_PARAM_DEF_TIME2RETAIN, 0);
3579 iscsi_session_attr(isid, ISCSI_PARAM_ISID, 0);
3580 iscsi_session_attr(tsid, ISCSI_PARAM_TSID, 0);
3581 iscsi_session_attr(def_taskmgmt_tmo, ISCSI_PARAM_DEF_TASKMGMT_TMO, 0);
3582 iscsi_session_attr(discovery_parent_idx, ISCSI_PARAM_DISCOVERY_PARENT_IDX, 0);
3583 iscsi_session_attr(discovery_parent_type, ISCSI_PARAM_DISCOVERY_PARENT_TYPE, 0);
3584
3585 static ssize_t
3586 show_priv_session_state(struct device *dev, struct device_attribute *attr,
3587                         char *buf)
3588 {
3589         struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
3590         return sprintf(buf, "%s\n", iscsi_session_state_name(session->state));
3591 }
3592 static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state,
3593                         NULL);
3594 static ssize_t
3595 show_priv_session_creator(struct device *dev, struct device_attribute *attr,
3596                         char *buf)
3597 {
3598         struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
3599         return sprintf(buf, "%d\n", session->creator);
3600 }
3601 static ISCSI_CLASS_ATTR(priv_sess, creator, S_IRUGO, show_priv_session_creator,
3602                         NULL);
3603 static ssize_t
3604 show_priv_session_target_id(struct device *dev, struct device_attribute *attr,
3605                             char *buf)
3606 {
3607         struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
3608         return sprintf(buf, "%d\n", session->target_id);
3609 }
3610 static ISCSI_CLASS_ATTR(priv_sess, target_id, S_IRUGO,
3611                         show_priv_session_target_id, NULL);
3612
3613 #define iscsi_priv_session_attr_show(field, format)                     \
3614 static ssize_t                                                          \
3615 show_priv_session_##field(struct device *dev,                           \
3616                           struct device_attribute *attr, char *buf)     \
3617 {                                                                       \
3618         struct iscsi_cls_session *session =                             \
3619                         iscsi_dev_to_session(dev->parent);              \
3620         if (session->field == -1)                                       \
3621                 return sprintf(buf, "off\n");                           \
3622         return sprintf(buf, format"\n", session->field);                \
3623 }
3624
3625 #define iscsi_priv_session_attr_store(field)                            \
3626 static ssize_t                                                          \
3627 store_priv_session_##field(struct device *dev,                          \
3628                            struct device_attribute *attr,               \
3629                            const char *buf, size_t count)               \
3630 {                                                                       \
3631         int val;                                                        \
3632         char *cp;                                                       \
3633         struct iscsi_cls_session *session =                             \
3634                 iscsi_dev_to_session(dev->parent);                      \
3635         if ((session->state == ISCSI_SESSION_FREE) ||                   \
3636             (session->state == ISCSI_SESSION_FAILED))                   \
3637                 return -EBUSY;                                          \
3638         if (strncmp(buf, "off", 3) == 0)                                \
3639                 session->field = -1;                                    \
3640         else {                                                          \
3641                 val = simple_strtoul(buf, &cp, 0);                      \
3642                 if (*cp != '\0' && *cp != '\n')                         \
3643                         return -EINVAL;                                 \
3644                 session->field = val;                                   \
3645         }                                                               \
3646         return count;                                                   \
3647 }
3648
3649 #define iscsi_priv_session_rw_attr(field, format)                       \
3650         iscsi_priv_session_attr_show(field, format)                     \
3651         iscsi_priv_session_attr_store(field)                            \
3652 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR,            \
3653                         show_priv_session_##field,                      \
3654                         store_priv_session_##field)
3655 iscsi_priv_session_rw_attr(recovery_tmo, "%d");
3656
3657 static struct attribute *iscsi_session_attrs[] = {
3658         &dev_attr_sess_initial_r2t.attr,
3659         &dev_attr_sess_max_outstanding_r2t.attr,
3660         &dev_attr_sess_immediate_data.attr,
3661         &dev_attr_sess_first_burst_len.attr,
3662         &dev_attr_sess_max_burst_len.attr,
3663         &dev_attr_sess_data_pdu_in_order.attr,
3664         &dev_attr_sess_data_seq_in_order.attr,
3665         &dev_attr_sess_erl.attr,
3666         &dev_attr_sess_targetname.attr,
3667         &dev_attr_sess_tpgt.attr,
3668         &dev_attr_sess_password.attr,
3669         &dev_attr_sess_password_in.attr,
3670         &dev_attr_sess_username.attr,
3671         &dev_attr_sess_username_in.attr,
3672         &dev_attr_sess_fast_abort.attr,
3673         &dev_attr_sess_abort_tmo.attr,
3674         &dev_attr_sess_lu_reset_tmo.attr,
3675         &dev_attr_sess_tgt_reset_tmo.attr,
3676         &dev_attr_sess_ifacename.attr,
3677         &dev_attr_sess_initiatorname.attr,
3678         &dev_attr_sess_targetalias.attr,
3679         &dev_attr_sess_boot_root.attr,
3680         &dev_attr_sess_boot_nic.attr,
3681         &dev_attr_sess_boot_target.attr,
3682         &dev_attr_priv_sess_recovery_tmo.attr,
3683         &dev_attr_priv_sess_state.attr,
3684         &dev_attr_priv_sess_creator.attr,
3685         &dev_attr_sess_chap_out_idx.attr,
3686         &dev_attr_sess_chap_in_idx.attr,
3687         &dev_attr_priv_sess_target_id.attr,
3688         &dev_attr_sess_auto_snd_tgt_disable.attr,
3689         &dev_attr_sess_discovery_session.attr,
3690         &dev_attr_sess_portal_type.attr,
3691         &dev_attr_sess_chap_auth.attr,
3692         &dev_attr_sess_discovery_logout.attr,
3693         &dev_attr_sess_bidi_chap.attr,
3694         &dev_attr_sess_discovery_auth_optional.attr,
3695         &dev_attr_sess_def_time2wait.attr,
3696         &dev_attr_sess_def_time2retain.attr,
3697         &dev_attr_sess_isid.attr,
3698         &dev_attr_sess_tsid.attr,
3699         &dev_attr_sess_def_taskmgmt_tmo.attr,
3700         &dev_attr_sess_discovery_parent_idx.attr,
3701         &dev_attr_sess_discovery_parent_type.attr,
3702         NULL,
3703 };
3704
3705 static umode_t iscsi_session_attr_is_visible(struct kobject *kobj,
3706                                             struct attribute *attr, int i)
3707 {
3708         struct device *cdev = container_of(kobj, struct device, kobj);
3709         struct iscsi_cls_session *session = transport_class_to_session(cdev);
3710         struct iscsi_transport *t = session->transport;
3711         int param;
3712
3713         if (attr == &dev_attr_sess_initial_r2t.attr)
3714                 param = ISCSI_PARAM_INITIAL_R2T_EN;
3715         else if (attr == &dev_attr_sess_max_outstanding_r2t.attr)
3716                 param = ISCSI_PARAM_MAX_R2T;
3717         else if (attr == &dev_attr_sess_immediate_data.attr)
3718                 param = ISCSI_PARAM_IMM_DATA_EN;
3719         else if (attr == &dev_attr_sess_first_burst_len.attr)
3720                 param = ISCSI_PARAM_FIRST_BURST;
3721         else if (attr == &dev_attr_sess_max_burst_len.attr)
3722                 param = ISCSI_PARAM_MAX_BURST;
3723         else if (attr == &dev_attr_sess_data_pdu_in_order.attr)
3724                 param = ISCSI_PARAM_PDU_INORDER_EN;
3725         else if (attr == &dev_attr_sess_data_seq_in_order.attr)
3726                 param = ISCSI_PARAM_DATASEQ_INORDER_EN;
3727         else if (attr == &dev_attr_sess_erl.attr)
3728                 param = ISCSI_PARAM_ERL;
3729         else if (attr == &dev_attr_sess_targetname.attr)
3730                 param = ISCSI_PARAM_TARGET_NAME;
3731         else if (attr == &dev_attr_sess_tpgt.attr)
3732                 param = ISCSI_PARAM_TPGT;
3733         else if (attr == &dev_attr_sess_chap_in_idx.attr)
3734                 param = ISCSI_PARAM_CHAP_IN_IDX;
3735         else if (attr == &dev_attr_sess_chap_out_idx.attr)
3736                 param = ISCSI_PARAM_CHAP_OUT_IDX;
3737         else if (attr == &dev_attr_sess_password.attr)
3738                 param = ISCSI_PARAM_USERNAME;
3739         else if (attr == &dev_attr_sess_password_in.attr)
3740                 param = ISCSI_PARAM_USERNAME_IN;
3741         else if (attr == &dev_attr_sess_username.attr)
3742                 param = ISCSI_PARAM_PASSWORD;
3743         else if (attr == &dev_attr_sess_username_in.attr)
3744                 param = ISCSI_PARAM_PASSWORD_IN;
3745         else if (attr == &dev_attr_sess_fast_abort.attr)
3746                 param = ISCSI_PARAM_FAST_ABORT;
3747         else if (attr == &dev_attr_sess_abort_tmo.attr)
3748                 param = ISCSI_PARAM_ABORT_TMO;
3749         else if (attr == &dev_attr_sess_lu_reset_tmo.attr)
3750                 param = ISCSI_PARAM_LU_RESET_TMO;
3751         else if (attr == &dev_attr_sess_tgt_reset_tmo.attr)
3752                 param = ISCSI_PARAM_TGT_RESET_TMO;
3753         else if (attr == &dev_attr_sess_ifacename.attr)
3754                 param = ISCSI_PARAM_IFACE_NAME;
3755         else if (attr == &dev_attr_sess_initiatorname.attr)
3756                 param = ISCSI_PARAM_INITIATOR_NAME;
3757         else if (attr == &dev_attr_sess_targetalias.attr)
3758                 param = ISCSI_PARAM_TARGET_ALIAS;
3759         else if (attr == &dev_attr_sess_boot_root.attr)
3760                 param = ISCSI_PARAM_BOOT_ROOT;
3761         else if (attr == &dev_attr_sess_boot_nic.attr)
3762                 param = ISCSI_PARAM_BOOT_NIC;
3763         else if (attr == &dev_attr_sess_boot_target.attr)
3764                 param = ISCSI_PARAM_BOOT_TARGET;
3765         else if (attr == &dev_attr_sess_auto_snd_tgt_disable.attr)
3766                 param = ISCSI_PARAM_AUTO_SND_TGT_DISABLE;
3767         else if (attr == &dev_attr_sess_discovery_session.attr)
3768                 param = ISCSI_PARAM_DISCOVERY_SESS;
3769         else if (attr == &dev_attr_sess_portal_type.attr)
3770                 param = ISCSI_PARAM_PORTAL_TYPE;
3771         else if (attr == &dev_attr_sess_chap_auth.attr)
3772                 param = ISCSI_PARAM_CHAP_AUTH_EN;
3773         else if (attr == &dev_attr_sess_discovery_logout.attr)
3774                 param = ISCSI_PARAM_DISCOVERY_LOGOUT_EN;
3775         else if (attr == &dev_attr_sess_bidi_chap.attr)
3776                 param = ISCSI_PARAM_BIDI_CHAP_EN;
3777         else if (attr == &dev_attr_sess_discovery_auth_optional.attr)
3778                 param = ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL;
3779         else if (attr == &dev_attr_sess_def_time2wait.attr)
3780                 param = ISCSI_PARAM_DEF_TIME2WAIT;
3781         else if (attr == &dev_attr_sess_def_time2retain.attr)
3782                 param = ISCSI_PARAM_DEF_TIME2RETAIN;
3783         else if (attr == &dev_attr_sess_isid.attr)
3784                 param = ISCSI_PARAM_ISID;
3785         else if (attr == &dev_attr_sess_tsid.attr)
3786                 param = ISCSI_PARAM_TSID;
3787         else if (attr == &dev_attr_sess_def_taskmgmt_tmo.attr)
3788                 param = ISCSI_PARAM_DEF_TASKMGMT_TMO;
3789         else if (attr == &dev_attr_sess_discovery_parent_idx.attr)
3790                 param = ISCSI_PARAM_DISCOVERY_PARENT_IDX;
3791         else if (attr == &dev_attr_sess_discovery_parent_type.attr)
3792                 param = ISCSI_PARAM_DISCOVERY_PARENT_TYPE;
3793         else if (attr == &dev_attr_priv_sess_recovery_tmo.attr)
3794                 return S_IRUGO | S_IWUSR;
3795         else if (attr == &dev_attr_priv_sess_state.attr)
3796                 return S_IRUGO;
3797         else if (attr == &dev_attr_priv_sess_creator.attr)
3798                 return S_IRUGO;
3799         else if (attr == &dev_attr_priv_sess_target_id.attr)
3800                 return S_IRUGO;
3801         else {
3802                 WARN_ONCE(1, "Invalid session attr");
3803                 return 0;
3804         }
3805
3806         return t->attr_is_visible(ISCSI_PARAM, param);
3807 }
3808
3809 static struct attribute_group iscsi_session_group = {
3810         .attrs = iscsi_session_attrs,
3811         .is_visible = iscsi_session_attr_is_visible,
3812 };
3813
3814 /*
3815  * iSCSI host attrs
3816  */
3817 #define iscsi_host_attr_show(param)                                     \
3818 static ssize_t                                                          \
3819 show_host_param_##param(struct device *dev,                             \
3820                         struct device_attribute *attr, char *buf)       \
3821 {                                                                       \
3822         struct Scsi_Host *shost = transport_class_to_shost(dev);        \
3823         struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
3824         return priv->iscsi_transport->get_host_param(shost, param, buf); \
3825 }
3826
3827 #define iscsi_host_attr(field, param)                                   \
3828         iscsi_host_attr_show(param)                                     \
3829 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param,  \
3830                         NULL);
3831
3832 iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME);
3833 iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
3834 iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
3835 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
3836 iscsi_host_attr(port_state, ISCSI_HOST_PARAM_PORT_STATE);
3837 iscsi_host_attr(port_speed, ISCSI_HOST_PARAM_PORT_SPEED);
3838
3839 static struct attribute *iscsi_host_attrs[] = {
3840         &dev_attr_host_netdev.attr,
3841         &dev_attr_host_hwaddress.attr,
3842         &dev_attr_host_ipaddress.attr,
3843         &dev_attr_host_initiatorname.attr,
3844         &dev_attr_host_port_state.attr,
3845         &dev_attr_host_port_speed.attr,
3846         NULL,
3847 };
3848
3849 static umode_t iscsi_host_attr_is_visible(struct kobject *kobj,
3850                                          struct attribute *attr, int i)
3851 {
3852         struct device *cdev = container_of(kobj, struct device, kobj);
3853         struct Scsi_Host *shost = transport_class_to_shost(cdev);
3854         struct iscsi_internal *priv = to_iscsi_internal(shost->transportt);
3855         int param;
3856
3857         if (attr == &dev_attr_host_netdev.attr)
3858                 param = ISCSI_HOST_PARAM_NETDEV_NAME;
3859         else if (attr == &dev_attr_host_hwaddress.attr)
3860                 param = ISCSI_HOST_PARAM_HWADDRESS;
3861         else if (attr == &dev_attr_host_ipaddress.attr)
3862                 param = ISCSI_HOST_PARAM_IPADDRESS;
3863         else if (attr == &dev_attr_host_initiatorname.attr)
3864                 param = ISCSI_HOST_PARAM_INITIATOR_NAME;
3865         else if (attr == &dev_attr_host_port_state.attr)
3866                 param = ISCSI_HOST_PARAM_PORT_STATE;
3867         else if (attr == &dev_attr_host_port_speed.attr)
3868                 param = ISCSI_HOST_PARAM_PORT_SPEED;
3869         else {
3870                 WARN_ONCE(1, "Invalid host attr");
3871                 return 0;
3872         }
3873
3874         return priv->iscsi_transport->attr_is_visible(ISCSI_HOST_PARAM, param);
3875 }
3876
3877 static struct attribute_group iscsi_host_group = {
3878         .attrs = iscsi_host_attrs,
3879         .is_visible = iscsi_host_attr_is_visible,
3880 };
3881
3882 /* convert iscsi_port_speed values to ascii string name */
3883 static const struct {
3884         enum iscsi_port_speed   value;
3885         char                    *name;
3886 } iscsi_port_speed_names[] = {
3887         {ISCSI_PORT_SPEED_UNKNOWN,      "Unknown" },
3888         {ISCSI_PORT_SPEED_10MBPS,       "10 Mbps" },
3889         {ISCSI_PORT_SPEED_100MBPS,      "100 Mbps" },
3890         {ISCSI_PORT_SPEED_1GBPS,        "1 Gbps" },
3891         {ISCSI_PORT_SPEED_10GBPS,       "10 Gbps" },
3892 };
3893
3894 char *iscsi_get_port_speed_name(struct Scsi_Host *shost)
3895 {
3896         int i;
3897         char *speed = "Unknown!";
3898         struct iscsi_cls_host *ihost = shost->shost_data;
3899         uint32_t port_speed = ihost->port_speed;
3900
3901         for (i = 0; i < ARRAY_SIZE(iscsi_port_speed_names); i++) {
3902                 if (iscsi_port_speed_names[i].value & port_speed) {
3903                         speed = iscsi_port_speed_names[i].name;
3904                         break;
3905                 }
3906         }
3907         return speed;
3908 }
3909 EXPORT_SYMBOL_GPL(iscsi_get_port_speed_name);
3910
3911 /* convert iscsi_port_state values to ascii string name */
3912 static const struct {
3913         enum iscsi_port_state   value;
3914         char                    *name;
3915 } iscsi_port_state_names[] = {
3916         {ISCSI_PORT_STATE_DOWN,         "LINK DOWN" },
3917         {ISCSI_PORT_STATE_UP,           "LINK UP" },
3918 };
3919
3920 char *iscsi_get_port_state_name(struct Scsi_Host *shost)
3921 {
3922         int i;
3923         char *state = "Unknown!";
3924         struct iscsi_cls_host *ihost = shost->shost_data;
3925         uint32_t port_state = ihost->port_state;
3926
3927         for (i = 0; i < ARRAY_SIZE(iscsi_port_state_names); i++) {
3928                 if (iscsi_port_state_names[i].value & port_state) {
3929                         state = iscsi_port_state_names[i].name;
3930                         break;
3931                 }
3932         }
3933         return state;
3934 }
3935 EXPORT_SYMBOL_GPL(iscsi_get_port_state_name);
3936
3937 static int iscsi_session_match(struct attribute_container *cont,
3938                            struct device *dev)
3939 {
3940         struct iscsi_cls_session *session;
3941         struct Scsi_Host *shost;
3942         struct iscsi_internal *priv;
3943
3944         if (!iscsi_is_session_dev(dev))
3945                 return 0;
3946
3947         session = iscsi_dev_to_session(dev);
3948         shost = iscsi_session_to_shost(session);
3949         if (!shost->transportt)
3950                 return 0;
3951
3952         priv = to_iscsi_internal(shost->transportt);
3953         if (priv->session_cont.ac.class != &iscsi_session_class.class)
3954                 return 0;
3955
3956         return &priv->session_cont.ac == cont;
3957 }
3958
3959 static int iscsi_conn_match(struct attribute_container *cont,
3960                            struct device *dev)
3961 {
3962         struct iscsi_cls_session *session;
3963         struct iscsi_cls_conn *conn;
3964         struct Scsi_Host *shost;
3965         struct iscsi_internal *priv;
3966
3967         if (!iscsi_is_conn_dev(dev))
3968                 return 0;
3969
3970         conn = iscsi_dev_to_conn(dev);
3971         session = iscsi_dev_to_session(conn->dev.parent);
3972         shost = iscsi_session_to_shost(session);
3973
3974         if (!shost->transportt)
3975                 return 0;
3976
3977         priv = to_iscsi_internal(shost->transportt);
3978         if (priv->conn_cont.ac.class != &iscsi_connection_class.class)
3979                 return 0;
3980
3981         return &priv->conn_cont.ac == cont;
3982 }
3983
3984 static int iscsi_host_match(struct attribute_container *cont,
3985                             struct device *dev)
3986 {
3987         struct Scsi_Host *shost;
3988         struct iscsi_internal *priv;
3989
3990         if (!scsi_is_host_device(dev))
3991                 return 0;
3992
3993         shost = dev_to_shost(dev);
3994         if (!shost->transportt  ||
3995             shost->transportt->host_attrs.ac.class != &iscsi_host_class.class)
3996                 return 0;
3997
3998         priv = to_iscsi_internal(shost->transportt);
3999         return &priv->t.host_attrs.ac == cont;
4000 }
4001
4002 struct scsi_transport_template *
4003 iscsi_register_transport(struct iscsi_transport *tt)
4004 {
4005         struct iscsi_internal *priv;
4006         unsigned long flags;
4007         int err;
4008
4009         BUG_ON(!tt);
4010
4011         priv = iscsi_if_transport_lookup(tt);
4012         if (priv)
4013                 return NULL;
4014
4015         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
4016         if (!priv)
4017                 return NULL;
4018         INIT_LIST_HEAD(&priv->list);
4019         priv->iscsi_transport = tt;
4020         priv->t.user_scan = iscsi_user_scan;
4021         priv->t.create_work_queue = 1;
4022
4023         priv->dev.class = &iscsi_transport_class;
4024         dev_set_name(&priv->dev, "%s", tt->name);
4025         err = device_register(&priv->dev);
4026         if (err)
4027                 goto free_priv;
4028
4029         err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
4030         if (err)
4031                 goto unregister_dev;
4032
4033         /* host parameters */
4034         priv->t.host_attrs.ac.class = &iscsi_host_class.class;
4035         priv->t.host_attrs.ac.match = iscsi_host_match;
4036         priv->t.host_attrs.ac.grp = &iscsi_host_group;
4037         priv->t.host_size = sizeof(struct iscsi_cls_host);
4038         transport_container_register(&priv->t.host_attrs);
4039
4040         /* connection parameters */
4041         priv->conn_cont.ac.class = &iscsi_connection_class.class;
4042         priv->conn_cont.ac.match = iscsi_conn_match;
4043         priv->conn_cont.ac.grp = &iscsi_conn_group;
4044         transport_container_register(&priv->conn_cont);
4045
4046         /* session parameters */
4047         priv->session_cont.ac.class = &iscsi_session_class.class;
4048         priv->session_cont.ac.match = iscsi_session_match;
4049         priv->session_cont.ac.grp = &iscsi_session_group;
4050         transport_container_register(&priv->session_cont);
4051
4052         spin_lock_irqsave(&iscsi_transport_lock, flags);
4053         list_add(&priv->list, &iscsi_transports);
4054         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
4055
4056         printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name);
4057         return &priv->t;
4058
4059 unregister_dev:
4060         device_unregister(&priv->dev);
4061         return NULL;
4062 free_priv:
4063         kfree(priv);
4064         return NULL;
4065 }
4066 EXPORT_SYMBOL_GPL(iscsi_register_transport);
4067
4068 int iscsi_unregister_transport(struct iscsi_transport *tt)
4069 {
4070         struct iscsi_internal *priv;
4071         unsigned long flags;
4072
4073         BUG_ON(!tt);
4074
4075         mutex_lock(&rx_queue_mutex);
4076
4077         priv = iscsi_if_transport_lookup(tt);
4078         BUG_ON (!priv);
4079
4080         spin_lock_irqsave(&iscsi_transport_lock, flags);
4081         list_del(&priv->list);
4082         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
4083
4084         transport_container_unregister(&priv->conn_cont);
4085         transport_container_unregister(&priv->session_cont);
4086         transport_container_unregister(&priv->t.host_attrs);
4087
4088         sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group);
4089         device_unregister(&priv->dev);
4090         mutex_unlock(&rx_queue_mutex);
4091
4092         return 0;
4093 }
4094 EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
4095
4096 static __init int iscsi_transport_init(void)
4097 {
4098         int err;
4099         struct netlink_kernel_cfg cfg = {
4100                 .groups = 1,
4101                 .input  = iscsi_if_rx,
4102         };
4103         printk(KERN_INFO "Loading iSCSI transport class v%s.\n",
4104                 ISCSI_TRANSPORT_VERSION);
4105
4106         atomic_set(&iscsi_session_nr, 0);
4107
4108         err = class_register(&iscsi_transport_class);
4109         if (err)
4110                 return err;
4111
4112         err = class_register(&iscsi_endpoint_class);
4113         if (err)
4114                 goto unregister_transport_class;
4115
4116         err = class_register(&iscsi_iface_class);
4117         if (err)
4118                 goto unregister_endpoint_class;
4119
4120         err = transport_class_register(&iscsi_host_class);
4121         if (err)
4122                 goto unregister_iface_class;
4123
4124         err = transport_class_register(&iscsi_connection_class);
4125         if (err)
4126                 goto unregister_host_class;
4127
4128         err = transport_class_register(&iscsi_session_class);
4129         if (err)
4130                 goto unregister_conn_class;
4131
4132         err = bus_register(&iscsi_flashnode_bus);
4133         if (err)
4134                 goto unregister_session_class;
4135
4136         nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, &cfg);
4137         if (!nls) {
4138                 err = -ENOBUFS;
4139                 goto unregister_flashnode_bus;
4140         }
4141
4142         iscsi_eh_timer_workq = create_singlethread_workqueue("iscsi_eh");
4143         if (!iscsi_eh_timer_workq) {
4144                 err = -ENOMEM;
4145                 goto release_nls;
4146         }
4147
4148         return 0;
4149
4150 release_nls:
4151         netlink_kernel_release(nls);
4152 unregister_flashnode_bus:
4153         bus_unregister(&iscsi_flashnode_bus);
4154 unregister_session_class:
4155         transport_class_unregister(&iscsi_session_class);
4156 unregister_conn_class:
4157         transport_class_unregister(&iscsi_connection_class);
4158 unregister_host_class:
4159         transport_class_unregister(&iscsi_host_class);
4160 unregister_iface_class:
4161         class_unregister(&iscsi_iface_class);
4162 unregister_endpoint_class:
4163         class_unregister(&iscsi_endpoint_class);
4164 unregister_transport_class:
4165         class_unregister(&iscsi_transport_class);
4166         return err;
4167 }
4168
4169 static void __exit iscsi_transport_exit(void)
4170 {
4171         destroy_workqueue(iscsi_eh_timer_workq);
4172         netlink_kernel_release(nls);
4173         bus_unregister(&iscsi_flashnode_bus);
4174         transport_class_unregister(&iscsi_connection_class);
4175         transport_class_unregister(&iscsi_session_class);
4176         transport_class_unregister(&iscsi_host_class);
4177         class_unregister(&iscsi_endpoint_class);
4178         class_unregister(&iscsi_iface_class);
4179         class_unregister(&iscsi_transport_class);
4180 }
4181
4182 module_init(iscsi_transport_init);
4183 module_exit(iscsi_transport_exit);
4184
4185 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
4186               "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
4187               "Alex Aizman <itn780@yahoo.com>");
4188 MODULE_DESCRIPTION("iSCSI Transport Interface");
4189 MODULE_LICENSE("GPL");
4190 MODULE_VERSION(ISCSI_TRANSPORT_VERSION);
4191 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_ISCSI);