]> Pileus Git - ~andy/linux/blob - drivers/scsi/scsi_transport_iscsi.c
[SCSI] iscsi class: remove iface param mask
[~andy/linux] / 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 <net/tcp.h>
27 #include <scsi/scsi.h>
28 #include <scsi/scsi_host.h>
29 #include <scsi/scsi_device.h>
30 #include <scsi/scsi_transport.h>
31 #include <scsi/scsi_transport_iscsi.h>
32 #include <scsi/iscsi_if.h>
33 #include <scsi/scsi_cmnd.h>
34
35 #define ISCSI_HOST_ATTRS 4
36
37 #define ISCSI_TRANSPORT_VERSION "2.0-870"
38
39 static int dbg_session;
40 module_param_named(debug_session, dbg_session, int,
41                    S_IRUGO | S_IWUSR);
42 MODULE_PARM_DESC(debug_session,
43                  "Turn on debugging for sessions in scsi_transport_iscsi "
44                  "module. Set to 1 to turn on, and zero to turn off. Default "
45                  "is off.");
46
47 static int dbg_conn;
48 module_param_named(debug_conn, dbg_conn, int,
49                    S_IRUGO | S_IWUSR);
50 MODULE_PARM_DESC(debug_conn,
51                  "Turn on debugging for connections in scsi_transport_iscsi "
52                  "module. Set to 1 to turn on, and zero to turn off. Default "
53                  "is off.");
54
55 #define ISCSI_DBG_TRANS_SESSION(_session, dbg_fmt, arg...)              \
56         do {                                                            \
57                 if (dbg_session)                                        \
58                         iscsi_cls_session_printk(KERN_INFO, _session,   \
59                                                  "%s: " dbg_fmt,        \
60                                                  __func__, ##arg);      \
61         } while (0);
62
63 #define ISCSI_DBG_TRANS_CONN(_conn, dbg_fmt, arg...)                    \
64         do {                                                            \
65                 if (dbg_conn)                                           \
66                         iscsi_cls_conn_printk(KERN_INFO, _conn,         \
67                                               "%s: " dbg_fmt,           \
68                                               __func__, ##arg); \
69         } while (0);
70
71 struct iscsi_internal {
72         struct scsi_transport_template t;
73         struct iscsi_transport *iscsi_transport;
74         struct list_head list;
75         struct device dev;
76
77         struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
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 /*
86  * list of registered transports and lock that must
87  * be held while accessing list. The iscsi_transport_lock must
88  * be acquired after the rx_queue_mutex.
89  */
90 static LIST_HEAD(iscsi_transports);
91 static DEFINE_SPINLOCK(iscsi_transport_lock);
92
93 #define to_iscsi_internal(tmpl) \
94         container_of(tmpl, struct iscsi_internal, t)
95
96 #define dev_to_iscsi_internal(_dev) \
97         container_of(_dev, struct iscsi_internal, dev)
98
99 static void iscsi_transport_release(struct device *dev)
100 {
101         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
102         kfree(priv);
103 }
104
105 /*
106  * iscsi_transport_class represents the iscsi_transports that are
107  * registered.
108  */
109 static struct class iscsi_transport_class = {
110         .name = "iscsi_transport",
111         .dev_release = iscsi_transport_release,
112 };
113
114 static ssize_t
115 show_transport_handle(struct device *dev, struct device_attribute *attr,
116                       char *buf)
117 {
118         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
119         return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
120 }
121 static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
122
123 #define show_transport_attr(name, format)                               \
124 static ssize_t                                                          \
125 show_transport_##name(struct device *dev,                               \
126                       struct device_attribute *attr,char *buf)          \
127 {                                                                       \
128         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);       \
129         return sprintf(buf, format"\n", priv->iscsi_transport->name);   \
130 }                                                                       \
131 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
132
133 show_transport_attr(caps, "0x%x");
134
135 static struct attribute *iscsi_transport_attrs[] = {
136         &dev_attr_handle.attr,
137         &dev_attr_caps.attr,
138         NULL,
139 };
140
141 static struct attribute_group iscsi_transport_group = {
142         .attrs = iscsi_transport_attrs,
143 };
144
145 /*
146  * iSCSI endpoint attrs
147  */
148 #define iscsi_dev_to_endpoint(_dev) \
149         container_of(_dev, struct iscsi_endpoint, dev)
150
151 #define ISCSI_ATTR(_prefix,_name,_mode,_show,_store)    \
152 struct device_attribute dev_attr_##_prefix##_##_name =  \
153         __ATTR(_name,_mode,_show,_store)
154
155 static void iscsi_endpoint_release(struct device *dev)
156 {
157         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
158         kfree(ep);
159 }
160
161 static struct class iscsi_endpoint_class = {
162         .name = "iscsi_endpoint",
163         .dev_release = iscsi_endpoint_release,
164 };
165
166 static ssize_t
167 show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf)
168 {
169         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
170         return sprintf(buf, "%llu\n", (unsigned long long) ep->id);
171 }
172 static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
173
174 static struct attribute *iscsi_endpoint_attrs[] = {
175         &dev_attr_ep_handle.attr,
176         NULL,
177 };
178
179 static struct attribute_group iscsi_endpoint_group = {
180         .attrs = iscsi_endpoint_attrs,
181 };
182
183 #define ISCSI_MAX_EPID -1
184
185 static int iscsi_match_epid(struct device *dev, void *data)
186 {
187         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
188         uint64_t *epid = (uint64_t *) data;
189
190         return *epid == ep->id;
191 }
192
193 struct iscsi_endpoint *
194 iscsi_create_endpoint(int dd_size)
195 {
196         struct device *dev;
197         struct iscsi_endpoint *ep;
198         uint64_t id;
199         int err;
200
201         for (id = 1; id < ISCSI_MAX_EPID; id++) {
202                 dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
203                                         iscsi_match_epid);
204                 if (!dev)
205                         break;
206         }
207         if (id == ISCSI_MAX_EPID) {
208                 printk(KERN_ERR "Too many connections. Max supported %u\n",
209                        ISCSI_MAX_EPID - 1);
210                 return NULL;
211         }
212
213         ep = kzalloc(sizeof(*ep) + dd_size, GFP_KERNEL);
214         if (!ep)
215                 return NULL;
216
217         ep->id = id;
218         ep->dev.class = &iscsi_endpoint_class;
219         dev_set_name(&ep->dev, "ep-%llu", (unsigned long long) id);
220         err = device_register(&ep->dev);
221         if (err)
222                 goto free_ep;
223
224         err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
225         if (err)
226                 goto unregister_dev;
227
228         if (dd_size)
229                 ep->dd_data = &ep[1];
230         return ep;
231
232 unregister_dev:
233         device_unregister(&ep->dev);
234         return NULL;
235
236 free_ep:
237         kfree(ep);
238         return NULL;
239 }
240 EXPORT_SYMBOL_GPL(iscsi_create_endpoint);
241
242 void iscsi_destroy_endpoint(struct iscsi_endpoint *ep)
243 {
244         sysfs_remove_group(&ep->dev.kobj, &iscsi_endpoint_group);
245         device_unregister(&ep->dev);
246 }
247 EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint);
248
249 struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
250 {
251         struct iscsi_endpoint *ep;
252         struct device *dev;
253
254         dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
255                                 iscsi_match_epid);
256         if (!dev)
257                 return NULL;
258
259         ep = iscsi_dev_to_endpoint(dev);
260         /*
261          * we can drop this now because the interface will prevent
262          * removals and lookups from racing.
263          */
264         put_device(dev);
265         return ep;
266 }
267 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint);
268
269 /*
270  * Interface to display network param to sysfs
271  */
272
273 static void iscsi_iface_release(struct device *dev)
274 {
275         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
276         struct device *parent = iface->dev.parent;
277
278         kfree(iface);
279         put_device(parent);
280 }
281
282
283 static struct class iscsi_iface_class = {
284         .name = "iscsi_iface",
285         .dev_release = iscsi_iface_release,
286 };
287
288 #define ISCSI_IFACE_ATTR(_prefix, _name, _mode, _show, _store)  \
289 struct device_attribute dev_attr_##_prefix##_##_name =          \
290         __ATTR(_name, _mode, _show, _store)
291
292 /* iface attrs show */
293 #define iscsi_iface_attr_show(type, name, param_type, param)            \
294 static ssize_t                                                          \
295 show_##type##_##name(struct device *dev, struct device_attribute *attr, \
296                      char *buf)                                         \
297 {                                                                       \
298         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);            \
299         struct iscsi_transport *t = iface->transport;                   \
300         return t->get_iface_param(iface, param_type, param, buf);       \
301 }                                                                       \
302
303 #define iscsi_iface_net_attr(type, name, param)                         \
304         iscsi_iface_attr_show(type, name, ISCSI_NET_PARAM, param)       \
305 static ISCSI_IFACE_ATTR(type, name, S_IRUGO, show_##type##_##name, NULL);
306
307 /* generic read only ipvi4 attribute */
308 iscsi_iface_net_attr(ipv4_iface, ipaddress, ISCSI_NET_PARAM_IPV4_ADDR);
309 iscsi_iface_net_attr(ipv4_iface, gateway, ISCSI_NET_PARAM_IPV4_GW);
310 iscsi_iface_net_attr(ipv4_iface, subnet, ISCSI_NET_PARAM_IPV4_SUBNET);
311 iscsi_iface_net_attr(ipv4_iface, bootproto, ISCSI_NET_PARAM_IPV4_BOOTPROTO);
312
313 /* generic read only ipv6 attribute */
314 iscsi_iface_net_attr(ipv6_iface, ipaddress, ISCSI_NET_PARAM_IPV6_ADDR);
315 iscsi_iface_net_attr(ipv6_iface, link_local_addr, ISCSI_NET_PARAM_IPV6_LINKLOCAL);
316 iscsi_iface_net_attr(ipv6_iface, router_addr, ISCSI_NET_PARAM_IPV6_ROUTER);
317 iscsi_iface_net_attr(ipv6_iface, ipaddr_autocfg,
318                      ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG);
319 iscsi_iface_net_attr(ipv6_iface, linklocal_autocfg,
320                      ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG);
321
322 /* common read only iface attribute */
323 iscsi_iface_net_attr(iface, enabled, ISCSI_NET_PARAM_IFACE_ENABLE);
324 iscsi_iface_net_attr(iface, vlan, ISCSI_NET_PARAM_VLAN_ID);
325
326 static mode_t iscsi_iface_attr_is_visible(struct kobject *kobj,
327                                           struct attribute *attr, int i)
328 {
329         struct device *dev = container_of(kobj, struct device, kobj);
330         struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
331         struct iscsi_transport *t = iface->transport;
332         int param;
333
334         if (attr == &dev_attr_iface_enabled.attr)
335                 param = ISCSI_NET_PARAM_IFACE_ENABLE;
336         else if (attr == &dev_attr_iface_vlan.attr)
337                 param = ISCSI_NET_PARAM_VLAN_ID;
338         else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
339                 if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
340                         param = ISCSI_NET_PARAM_IPV4_ADDR;
341                 else if (attr == &dev_attr_ipv4_iface_gateway.attr)
342                         param = ISCSI_NET_PARAM_IPV4_GW;
343                 else if (attr == &dev_attr_ipv4_iface_subnet.attr)
344                         param = ISCSI_NET_PARAM_IPV4_SUBNET;
345                 else if (attr == &dev_attr_ipv4_iface_bootproto.attr)
346                         param = ISCSI_NET_PARAM_IPV4_BOOTPROTO;
347                 else
348                         return 0;
349         } else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6) {
350                 if (attr == &dev_attr_ipv6_iface_ipaddress.attr)
351                         param = ISCSI_NET_PARAM_IPV6_ADDR;
352                 else if (attr == &dev_attr_ipv6_iface_link_local_addr.attr)
353                         param = ISCSI_NET_PARAM_IPV6_LINKLOCAL;
354                 else if (attr == &dev_attr_ipv6_iface_router_addr.attr)
355                         param = ISCSI_NET_PARAM_IPV6_ROUTER;
356                 else if (attr == &dev_attr_ipv6_iface_ipaddr_autocfg.attr)
357                         param = ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG;
358                 else if (attr == &dev_attr_ipv6_iface_linklocal_autocfg.attr)
359                         param = ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG;
360                 else
361                         return 0;
362         } else {
363                 WARN_ONCE(1, "Invalid iface attr");
364                 return 0;
365         }
366
367         return t->attr_is_visible(ISCSI_NET_PARAM, param);
368 }
369
370 static struct attribute *iscsi_iface_attrs[] = {
371         &dev_attr_iface_enabled.attr,
372         &dev_attr_iface_vlan.attr,
373         &dev_attr_ipv4_iface_ipaddress.attr,
374         &dev_attr_ipv4_iface_gateway.attr,
375         &dev_attr_ipv4_iface_subnet.attr,
376         &dev_attr_ipv4_iface_bootproto.attr,
377         &dev_attr_ipv6_iface_ipaddress.attr,
378         &dev_attr_ipv6_iface_link_local_addr.attr,
379         &dev_attr_ipv6_iface_router_addr.attr,
380         &dev_attr_ipv6_iface_ipaddr_autocfg.attr,
381         &dev_attr_ipv6_iface_linklocal_autocfg.attr,
382         NULL,
383 };
384
385 static struct attribute_group iscsi_iface_group = {
386         .attrs = iscsi_iface_attrs,
387         .is_visible = iscsi_iface_attr_is_visible,
388 };
389
390 struct iscsi_iface *
391 iscsi_create_iface(struct Scsi_Host *shost, struct iscsi_transport *transport,
392                    uint32_t iface_type, uint32_t iface_num, int dd_size)
393 {
394         struct iscsi_iface *iface;
395         int err;
396
397         iface = kzalloc(sizeof(*iface) + dd_size, GFP_KERNEL);
398         if (!iface)
399                 return NULL;
400
401         iface->transport = transport;
402         iface->iface_type = iface_type;
403         iface->iface_num = iface_num;
404         iface->dev.release = iscsi_iface_release;
405         iface->dev.class = &iscsi_iface_class;
406         /* parent reference released in iscsi_iface_release */
407         iface->dev.parent = get_device(&shost->shost_gendev);
408         if (iface_type == ISCSI_IFACE_TYPE_IPV4)
409                 dev_set_name(&iface->dev, "ipv4-iface-%u-%u", shost->host_no,
410                              iface_num);
411         else
412                 dev_set_name(&iface->dev, "ipv6-iface-%u-%u", shost->host_no,
413                              iface_num);
414
415         err = device_register(&iface->dev);
416         if (err)
417                 goto free_iface;
418
419         err = sysfs_create_group(&iface->dev.kobj, &iscsi_iface_group);
420         if (err)
421                 goto unreg_iface;
422
423         if (dd_size)
424                 iface->dd_data = &iface[1];
425         return iface;
426
427 unreg_iface:
428         device_unregister(&iface->dev);
429         return NULL;
430
431 free_iface:
432         put_device(iface->dev.parent);
433         kfree(iface);
434         return NULL;
435 }
436 EXPORT_SYMBOL_GPL(iscsi_create_iface);
437
438 void iscsi_destroy_iface(struct iscsi_iface *iface)
439 {
440         sysfs_remove_group(&iface->dev.kobj, &iscsi_iface_group);
441         device_unregister(&iface->dev);
442 }
443 EXPORT_SYMBOL_GPL(iscsi_destroy_iface);
444
445 static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
446                             struct device *cdev)
447 {
448         struct Scsi_Host *shost = dev_to_shost(dev);
449         struct iscsi_cls_host *ihost = shost->shost_data;
450
451         memset(ihost, 0, sizeof(*ihost));
452         atomic_set(&ihost->nr_scans, 0);
453         mutex_init(&ihost->mutex);
454         return 0;
455 }
456
457 static DECLARE_TRANSPORT_CLASS(iscsi_host_class,
458                                "iscsi_host",
459                                iscsi_setup_host,
460                                NULL,
461                                NULL);
462
463 static DECLARE_TRANSPORT_CLASS(iscsi_session_class,
464                                "iscsi_session",
465                                NULL,
466                                NULL,
467                                NULL);
468
469 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
470                                "iscsi_connection",
471                                NULL,
472                                NULL,
473                                NULL);
474
475 static struct sock *nls;
476 static DEFINE_MUTEX(rx_queue_mutex);
477
478 static LIST_HEAD(sesslist);
479 static DEFINE_SPINLOCK(sesslock);
480 static LIST_HEAD(connlist);
481 static DEFINE_SPINLOCK(connlock);
482
483 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
484 {
485         struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
486         return sess->sid;
487 }
488
489 /*
490  * Returns the matching session to a given sid
491  */
492 static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
493 {
494         unsigned long flags;
495         struct iscsi_cls_session *sess;
496
497         spin_lock_irqsave(&sesslock, flags);
498         list_for_each_entry(sess, &sesslist, sess_list) {
499                 if (sess->sid == sid) {
500                         spin_unlock_irqrestore(&sesslock, flags);
501                         return sess;
502                 }
503         }
504         spin_unlock_irqrestore(&sesslock, flags);
505         return NULL;
506 }
507
508 /*
509  * Returns the matching connection to a given sid / cid tuple
510  */
511 static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid)
512 {
513         unsigned long flags;
514         struct iscsi_cls_conn *conn;
515
516         spin_lock_irqsave(&connlock, flags);
517         list_for_each_entry(conn, &connlist, conn_list) {
518                 if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) {
519                         spin_unlock_irqrestore(&connlock, flags);
520                         return conn;
521                 }
522         }
523         spin_unlock_irqrestore(&connlock, flags);
524         return NULL;
525 }
526
527 /*
528  * The following functions can be used by LLDs that allocate
529  * their own scsi_hosts or by software iscsi LLDs
530  */
531 static struct {
532         int value;
533         char *name;
534 } iscsi_session_state_names[] = {
535         { ISCSI_SESSION_LOGGED_IN,      "LOGGED_IN" },
536         { ISCSI_SESSION_FAILED,         "FAILED" },
537         { ISCSI_SESSION_FREE,           "FREE" },
538 };
539
540 static const char *iscsi_session_state_name(int state)
541 {
542         int i;
543         char *name = NULL;
544
545         for (i = 0; i < ARRAY_SIZE(iscsi_session_state_names); i++) {
546                 if (iscsi_session_state_names[i].value == state) {
547                         name = iscsi_session_state_names[i].name;
548                         break;
549                 }
550         }
551         return name;
552 }
553
554 int iscsi_session_chkready(struct iscsi_cls_session *session)
555 {
556         unsigned long flags;
557         int err;
558
559         spin_lock_irqsave(&session->lock, flags);
560         switch (session->state) {
561         case ISCSI_SESSION_LOGGED_IN:
562                 err = 0;
563                 break;
564         case ISCSI_SESSION_FAILED:
565                 err = DID_IMM_RETRY << 16;
566                 break;
567         case ISCSI_SESSION_FREE:
568                 err = DID_TRANSPORT_FAILFAST << 16;
569                 break;
570         default:
571                 err = DID_NO_CONNECT << 16;
572                 break;
573         }
574         spin_unlock_irqrestore(&session->lock, flags);
575         return err;
576 }
577 EXPORT_SYMBOL_GPL(iscsi_session_chkready);
578
579 static void iscsi_session_release(struct device *dev)
580 {
581         struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
582         struct Scsi_Host *shost;
583
584         shost = iscsi_session_to_shost(session);
585         scsi_host_put(shost);
586         ISCSI_DBG_TRANS_SESSION(session, "Completing session release\n");
587         kfree(session);
588 }
589
590 static int iscsi_is_session_dev(const struct device *dev)
591 {
592         return dev->release == iscsi_session_release;
593 }
594
595 static int iscsi_iter_session_fn(struct device *dev, void *data)
596 {
597         void (* fn) (struct iscsi_cls_session *) = data;
598
599         if (!iscsi_is_session_dev(dev))
600                 return 0;
601         fn(iscsi_dev_to_session(dev));
602         return 0;
603 }
604
605 void iscsi_host_for_each_session(struct Scsi_Host *shost,
606                                  void (*fn)(struct iscsi_cls_session *))
607 {
608         device_for_each_child(&shost->shost_gendev, fn,
609                               iscsi_iter_session_fn);
610 }
611 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session);
612
613 /**
614  * iscsi_scan_finished - helper to report when running scans are done
615  * @shost: scsi host
616  * @time: scan run time
617  *
618  * This function can be used by drives like qla4xxx to report to the scsi
619  * layer when the scans it kicked off at module load time are done.
620  */
621 int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time)
622 {
623         struct iscsi_cls_host *ihost = shost->shost_data;
624         /*
625          * qla4xxx will have kicked off some session unblocks before calling
626          * scsi_scan_host, so just wait for them to complete.
627          */
628         return !atomic_read(&ihost->nr_scans);
629 }
630 EXPORT_SYMBOL_GPL(iscsi_scan_finished);
631
632 struct iscsi_scan_data {
633         unsigned int channel;
634         unsigned int id;
635         unsigned int lun;
636 };
637
638 static int iscsi_user_scan_session(struct device *dev, void *data)
639 {
640         struct iscsi_scan_data *scan_data = data;
641         struct iscsi_cls_session *session;
642         struct Scsi_Host *shost;
643         struct iscsi_cls_host *ihost;
644         unsigned long flags;
645         unsigned int id;
646
647         if (!iscsi_is_session_dev(dev))
648                 return 0;
649
650         session = iscsi_dev_to_session(dev);
651
652         ISCSI_DBG_TRANS_SESSION(session, "Scanning session\n");
653
654         shost = iscsi_session_to_shost(session);
655         ihost = shost->shost_data;
656
657         mutex_lock(&ihost->mutex);
658         spin_lock_irqsave(&session->lock, flags);
659         if (session->state != ISCSI_SESSION_LOGGED_IN) {
660                 spin_unlock_irqrestore(&session->lock, flags);
661                 goto user_scan_exit;
662         }
663         id = session->target_id;
664         spin_unlock_irqrestore(&session->lock, flags);
665
666         if (id != ISCSI_MAX_TARGET) {
667                 if ((scan_data->channel == SCAN_WILD_CARD ||
668                      scan_data->channel == 0) &&
669                     (scan_data->id == SCAN_WILD_CARD ||
670                      scan_data->id == id))
671                         scsi_scan_target(&session->dev, 0, id,
672                                          scan_data->lun, 1);
673         }
674
675 user_scan_exit:
676         mutex_unlock(&ihost->mutex);
677         ISCSI_DBG_TRANS_SESSION(session, "Completed session scan\n");
678         return 0;
679 }
680
681 static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
682                            uint id, uint lun)
683 {
684         struct iscsi_scan_data scan_data;
685
686         scan_data.channel = channel;
687         scan_data.id = id;
688         scan_data.lun = lun;
689
690         return device_for_each_child(&shost->shost_gendev, &scan_data,
691                                      iscsi_user_scan_session);
692 }
693
694 static void iscsi_scan_session(struct work_struct *work)
695 {
696         struct iscsi_cls_session *session =
697                         container_of(work, struct iscsi_cls_session, scan_work);
698         struct Scsi_Host *shost = iscsi_session_to_shost(session);
699         struct iscsi_cls_host *ihost = shost->shost_data;
700         struct iscsi_scan_data scan_data;
701
702         scan_data.channel = 0;
703         scan_data.id = SCAN_WILD_CARD;
704         scan_data.lun = SCAN_WILD_CARD;
705
706         iscsi_user_scan_session(&session->dev, &scan_data);
707         atomic_dec(&ihost->nr_scans);
708 }
709
710 /**
711  * iscsi_block_scsi_eh - block scsi eh until session state has transistioned
712  * @cmd: scsi cmd passed to scsi eh handler
713  *
714  * If the session is down this function will wait for the recovery
715  * timer to fire or for the session to be logged back in. If the
716  * recovery timer fires then FAST_IO_FAIL is returned. The caller
717  * should pass this error value to the scsi eh.
718  */
719 int iscsi_block_scsi_eh(struct scsi_cmnd *cmd)
720 {
721         struct iscsi_cls_session *session =
722                         starget_to_session(scsi_target(cmd->device));
723         unsigned long flags;
724         int ret = 0;
725
726         spin_lock_irqsave(&session->lock, flags);
727         while (session->state != ISCSI_SESSION_LOGGED_IN) {
728                 if (session->state == ISCSI_SESSION_FREE) {
729                         ret = FAST_IO_FAIL;
730                         break;
731                 }
732                 spin_unlock_irqrestore(&session->lock, flags);
733                 msleep(1000);
734                 spin_lock_irqsave(&session->lock, flags);
735         }
736         spin_unlock_irqrestore(&session->lock, flags);
737         return ret;
738 }
739 EXPORT_SYMBOL_GPL(iscsi_block_scsi_eh);
740
741 static void session_recovery_timedout(struct work_struct *work)
742 {
743         struct iscsi_cls_session *session =
744                 container_of(work, struct iscsi_cls_session,
745                              recovery_work.work);
746         unsigned long flags;
747
748         iscsi_cls_session_printk(KERN_INFO, session,
749                                  "session recovery timed out after %d secs\n",
750                                  session->recovery_tmo);
751
752         spin_lock_irqsave(&session->lock, flags);
753         switch (session->state) {
754         case ISCSI_SESSION_FAILED:
755                 session->state = ISCSI_SESSION_FREE;
756                 break;
757         case ISCSI_SESSION_LOGGED_IN:
758         case ISCSI_SESSION_FREE:
759                 /* we raced with the unblock's flush */
760                 spin_unlock_irqrestore(&session->lock, flags);
761                 return;
762         }
763         spin_unlock_irqrestore(&session->lock, flags);
764
765         if (session->transport->session_recovery_timedout)
766                 session->transport->session_recovery_timedout(session);
767
768         ISCSI_DBG_TRANS_SESSION(session, "Unblocking SCSI target\n");
769         scsi_target_unblock(&session->dev);
770         ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking SCSI target\n");
771 }
772
773 static void __iscsi_unblock_session(struct work_struct *work)
774 {
775         struct iscsi_cls_session *session =
776                         container_of(work, struct iscsi_cls_session,
777                                      unblock_work);
778         struct Scsi_Host *shost = iscsi_session_to_shost(session);
779         struct iscsi_cls_host *ihost = shost->shost_data;
780         unsigned long flags;
781
782         ISCSI_DBG_TRANS_SESSION(session, "Unblocking session\n");
783         /*
784          * The recovery and unblock work get run from the same workqueue,
785          * so try to cancel it if it was going to run after this unblock.
786          */
787         cancel_delayed_work(&session->recovery_work);
788         spin_lock_irqsave(&session->lock, flags);
789         session->state = ISCSI_SESSION_LOGGED_IN;
790         spin_unlock_irqrestore(&session->lock, flags);
791         /* start IO */
792         scsi_target_unblock(&session->dev);
793         /*
794          * Only do kernel scanning if the driver is properly hooked into
795          * the async scanning code (drivers like iscsi_tcp do login and
796          * scanning from userspace).
797          */
798         if (shost->hostt->scan_finished) {
799                 if (scsi_queue_work(shost, &session->scan_work))
800                         atomic_inc(&ihost->nr_scans);
801         }
802         ISCSI_DBG_TRANS_SESSION(session, "Completed unblocking session\n");
803 }
804
805 /**
806  * iscsi_unblock_session - set a session as logged in and start IO.
807  * @session: iscsi session
808  *
809  * Mark a session as ready to accept IO.
810  */
811 void iscsi_unblock_session(struct iscsi_cls_session *session)
812 {
813         queue_work(iscsi_eh_timer_workq, &session->unblock_work);
814         /*
815          * make sure all the events have completed before tell the driver
816          * it is safe
817          */
818         flush_workqueue(iscsi_eh_timer_workq);
819 }
820 EXPORT_SYMBOL_GPL(iscsi_unblock_session);
821
822 static void __iscsi_block_session(struct work_struct *work)
823 {
824         struct iscsi_cls_session *session =
825                         container_of(work, struct iscsi_cls_session,
826                                      block_work);
827         unsigned long flags;
828
829         ISCSI_DBG_TRANS_SESSION(session, "Blocking session\n");
830         spin_lock_irqsave(&session->lock, flags);
831         session->state = ISCSI_SESSION_FAILED;
832         spin_unlock_irqrestore(&session->lock, flags);
833         scsi_target_block(&session->dev);
834         ISCSI_DBG_TRANS_SESSION(session, "Completed SCSI target blocking\n");
835         if (session->recovery_tmo >= 0)
836                 queue_delayed_work(iscsi_eh_timer_workq,
837                                    &session->recovery_work,
838                                    session->recovery_tmo * HZ);
839 }
840
841 void iscsi_block_session(struct iscsi_cls_session *session)
842 {
843         queue_work(iscsi_eh_timer_workq, &session->block_work);
844 }
845 EXPORT_SYMBOL_GPL(iscsi_block_session);
846
847 static void __iscsi_unbind_session(struct work_struct *work)
848 {
849         struct iscsi_cls_session *session =
850                         container_of(work, struct iscsi_cls_session,
851                                      unbind_work);
852         struct Scsi_Host *shost = iscsi_session_to_shost(session);
853         struct iscsi_cls_host *ihost = shost->shost_data;
854         unsigned long flags;
855
856         ISCSI_DBG_TRANS_SESSION(session, "Unbinding session\n");
857
858         /* Prevent new scans and make sure scanning is not in progress */
859         mutex_lock(&ihost->mutex);
860         spin_lock_irqsave(&session->lock, flags);
861         if (session->target_id == ISCSI_MAX_TARGET) {
862                 spin_unlock_irqrestore(&session->lock, flags);
863                 mutex_unlock(&ihost->mutex);
864                 return;
865         }
866         session->target_id = ISCSI_MAX_TARGET;
867         spin_unlock_irqrestore(&session->lock, flags);
868         mutex_unlock(&ihost->mutex);
869
870         scsi_remove_target(&session->dev);
871         iscsi_session_event(session, ISCSI_KEVENT_UNBIND_SESSION);
872         ISCSI_DBG_TRANS_SESSION(session, "Completed target removal\n");
873 }
874
875 struct iscsi_cls_session *
876 iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
877                     int dd_size)
878 {
879         struct iscsi_cls_session *session;
880
881         session = kzalloc(sizeof(*session) + dd_size,
882                           GFP_KERNEL);
883         if (!session)
884                 return NULL;
885
886         session->transport = transport;
887         session->recovery_tmo = 120;
888         session->state = ISCSI_SESSION_FREE;
889         INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
890         INIT_LIST_HEAD(&session->sess_list);
891         INIT_WORK(&session->unblock_work, __iscsi_unblock_session);
892         INIT_WORK(&session->block_work, __iscsi_block_session);
893         INIT_WORK(&session->unbind_work, __iscsi_unbind_session);
894         INIT_WORK(&session->scan_work, iscsi_scan_session);
895         spin_lock_init(&session->lock);
896
897         /* this is released in the dev's release function */
898         scsi_host_get(shost);
899         session->dev.parent = &shost->shost_gendev;
900         session->dev.release = iscsi_session_release;
901         device_initialize(&session->dev);
902         if (dd_size)
903                 session->dd_data = &session[1];
904
905         ISCSI_DBG_TRANS_SESSION(session, "Completed session allocation\n");
906         return session;
907 }
908 EXPORT_SYMBOL_GPL(iscsi_alloc_session);
909
910 static int iscsi_get_next_target_id(struct device *dev, void *data)
911 {
912         struct iscsi_cls_session *session;
913         unsigned long flags;
914         int err = 0;
915
916         if (!iscsi_is_session_dev(dev))
917                 return 0;
918
919         session = iscsi_dev_to_session(dev);
920         spin_lock_irqsave(&session->lock, flags);
921         if (*((unsigned int *) data) == session->target_id)
922                 err = -EEXIST;
923         spin_unlock_irqrestore(&session->lock, flags);
924         return err;
925 }
926
927 int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
928 {
929         struct Scsi_Host *shost = iscsi_session_to_shost(session);
930         struct iscsi_cls_host *ihost;
931         unsigned long flags;
932         unsigned int id = target_id;
933         int err;
934
935         ihost = shost->shost_data;
936         session->sid = atomic_add_return(1, &iscsi_session_nr);
937
938         if (id == ISCSI_MAX_TARGET) {
939                 for (id = 0; id < ISCSI_MAX_TARGET; id++) {
940                         err = device_for_each_child(&shost->shost_gendev, &id,
941                                                     iscsi_get_next_target_id);
942                         if (!err)
943                                 break;
944                 }
945
946                 if (id == ISCSI_MAX_TARGET) {
947                         iscsi_cls_session_printk(KERN_ERR, session,
948                                                  "Too many iscsi targets. Max "
949                                                  "number of targets is %d.\n",
950                                                  ISCSI_MAX_TARGET - 1);
951                         err = -EOVERFLOW;
952                         goto release_host;
953                 }
954         }
955         session->target_id = id;
956
957         dev_set_name(&session->dev, "session%u", session->sid);
958         err = device_add(&session->dev);
959         if (err) {
960                 iscsi_cls_session_printk(KERN_ERR, session,
961                                          "could not register session's dev\n");
962                 goto release_host;
963         }
964         transport_register_device(&session->dev);
965
966         spin_lock_irqsave(&sesslock, flags);
967         list_add(&session->sess_list, &sesslist);
968         spin_unlock_irqrestore(&sesslock, flags);
969
970         iscsi_session_event(session, ISCSI_KEVENT_CREATE_SESSION);
971         ISCSI_DBG_TRANS_SESSION(session, "Completed session adding\n");
972         return 0;
973
974 release_host:
975         scsi_host_put(shost);
976         return err;
977 }
978 EXPORT_SYMBOL_GPL(iscsi_add_session);
979
980 /**
981  * iscsi_create_session - create iscsi class session
982  * @shost: scsi host
983  * @transport: iscsi transport
984  * @dd_size: private driver data size
985  * @target_id: which target
986  *
987  * This can be called from a LLD or iscsi_transport.
988  */
989 struct iscsi_cls_session *
990 iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
991                      int dd_size, unsigned int target_id)
992 {
993         struct iscsi_cls_session *session;
994
995         session = iscsi_alloc_session(shost, transport, dd_size);
996         if (!session)
997                 return NULL;
998
999         if (iscsi_add_session(session, target_id)) {
1000                 iscsi_free_session(session);
1001                 return NULL;
1002         }
1003         return session;
1004 }
1005 EXPORT_SYMBOL_GPL(iscsi_create_session);
1006
1007 static void iscsi_conn_release(struct device *dev)
1008 {
1009         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
1010         struct device *parent = conn->dev.parent;
1011
1012         ISCSI_DBG_TRANS_CONN(conn, "Releasing conn\n");
1013         kfree(conn);
1014         put_device(parent);
1015 }
1016
1017 static int iscsi_is_conn_dev(const struct device *dev)
1018 {
1019         return dev->release == iscsi_conn_release;
1020 }
1021
1022 static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data)
1023 {
1024         if (!iscsi_is_conn_dev(dev))
1025                 return 0;
1026         return iscsi_destroy_conn(iscsi_dev_to_conn(dev));
1027 }
1028
1029 void iscsi_remove_session(struct iscsi_cls_session *session)
1030 {
1031         struct Scsi_Host *shost = iscsi_session_to_shost(session);
1032         unsigned long flags;
1033         int err;
1034
1035         ISCSI_DBG_TRANS_SESSION(session, "Removing session\n");
1036
1037         spin_lock_irqsave(&sesslock, flags);
1038         list_del(&session->sess_list);
1039         spin_unlock_irqrestore(&sesslock, flags);
1040
1041         /* make sure there are no blocks/unblocks queued */
1042         flush_workqueue(iscsi_eh_timer_workq);
1043         /* make sure the timedout callout is not running */
1044         if (!cancel_delayed_work(&session->recovery_work))
1045                 flush_workqueue(iscsi_eh_timer_workq);
1046         /*
1047          * If we are blocked let commands flow again. The lld or iscsi
1048          * layer should set up the queuecommand to fail commands.
1049          * We assume that LLD will not be calling block/unblock while
1050          * removing the session.
1051          */
1052         spin_lock_irqsave(&session->lock, flags);
1053         session->state = ISCSI_SESSION_FREE;
1054         spin_unlock_irqrestore(&session->lock, flags);
1055
1056         scsi_target_unblock(&session->dev);
1057         /* flush running scans then delete devices */
1058         scsi_flush_work(shost);
1059         __iscsi_unbind_session(&session->unbind_work);
1060
1061         /* hw iscsi may not have removed all connections from session */
1062         err = device_for_each_child(&session->dev, NULL,
1063                                     iscsi_iter_destroy_conn_fn);
1064         if (err)
1065                 iscsi_cls_session_printk(KERN_ERR, session,
1066                                          "Could not delete all connections "
1067                                          "for session. Error %d.\n", err);
1068
1069         transport_unregister_device(&session->dev);
1070
1071         ISCSI_DBG_TRANS_SESSION(session, "Completing session removal\n");
1072         device_del(&session->dev);
1073 }
1074 EXPORT_SYMBOL_GPL(iscsi_remove_session);
1075
1076 void iscsi_free_session(struct iscsi_cls_session *session)
1077 {
1078         ISCSI_DBG_TRANS_SESSION(session, "Freeing session\n");
1079         iscsi_session_event(session, ISCSI_KEVENT_DESTROY_SESSION);
1080         put_device(&session->dev);
1081 }
1082 EXPORT_SYMBOL_GPL(iscsi_free_session);
1083
1084 /**
1085  * iscsi_destroy_session - destroy iscsi session
1086  * @session: iscsi_session
1087  *
1088  * Can be called by a LLD or iscsi_transport. There must not be
1089  * any running connections.
1090  */
1091 int iscsi_destroy_session(struct iscsi_cls_session *session)
1092 {
1093         iscsi_remove_session(session);
1094         ISCSI_DBG_TRANS_SESSION(session, "Completing session destruction\n");
1095         iscsi_free_session(session);
1096         return 0;
1097 }
1098 EXPORT_SYMBOL_GPL(iscsi_destroy_session);
1099
1100 /**
1101  * iscsi_create_conn - create iscsi class connection
1102  * @session: iscsi cls session
1103  * @dd_size: private driver data size
1104  * @cid: connection id
1105  *
1106  * This can be called from a LLD or iscsi_transport. The connection
1107  * is child of the session so cid must be unique for all connections
1108  * on the session.
1109  *
1110  * Since we do not support MCS, cid will normally be zero. In some cases
1111  * for software iscsi we could be trying to preallocate a connection struct
1112  * in which case there could be two connection structs and cid would be
1113  * non-zero.
1114  */
1115 struct iscsi_cls_conn *
1116 iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid)
1117 {
1118         struct iscsi_transport *transport = session->transport;
1119         struct iscsi_cls_conn *conn;
1120         unsigned long flags;
1121         int err;
1122
1123         conn = kzalloc(sizeof(*conn) + dd_size, GFP_KERNEL);
1124         if (!conn)
1125                 return NULL;
1126         if (dd_size)
1127                 conn->dd_data = &conn[1];
1128
1129         mutex_init(&conn->ep_mutex);
1130         INIT_LIST_HEAD(&conn->conn_list);
1131         conn->transport = transport;
1132         conn->cid = cid;
1133
1134         /* this is released in the dev's release function */
1135         if (!get_device(&session->dev))
1136                 goto free_conn;
1137
1138         dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid);
1139         conn->dev.parent = &session->dev;
1140         conn->dev.release = iscsi_conn_release;
1141         err = device_register(&conn->dev);
1142         if (err) {
1143                 iscsi_cls_session_printk(KERN_ERR, session, "could not "
1144                                          "register connection's dev\n");
1145                 goto release_parent_ref;
1146         }
1147         transport_register_device(&conn->dev);
1148
1149         spin_lock_irqsave(&connlock, flags);
1150         list_add(&conn->conn_list, &connlist);
1151         spin_unlock_irqrestore(&connlock, flags);
1152
1153         ISCSI_DBG_TRANS_CONN(conn, "Completed conn creation\n");
1154         return conn;
1155
1156 release_parent_ref:
1157         put_device(&session->dev);
1158 free_conn:
1159         kfree(conn);
1160         return NULL;
1161 }
1162
1163 EXPORT_SYMBOL_GPL(iscsi_create_conn);
1164
1165 /**
1166  * iscsi_destroy_conn - destroy iscsi class connection
1167  * @conn: iscsi cls session
1168  *
1169  * This can be called from a LLD or iscsi_transport.
1170  */
1171 int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
1172 {
1173         unsigned long flags;
1174
1175         spin_lock_irqsave(&connlock, flags);
1176         list_del(&conn->conn_list);
1177         spin_unlock_irqrestore(&connlock, flags);
1178
1179         transport_unregister_device(&conn->dev);
1180         ISCSI_DBG_TRANS_CONN(conn, "Completing conn destruction\n");
1181         device_unregister(&conn->dev);
1182         return 0;
1183 }
1184 EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
1185
1186 /*
1187  * iscsi interface functions
1188  */
1189 static struct iscsi_internal *
1190 iscsi_if_transport_lookup(struct iscsi_transport *tt)
1191 {
1192         struct iscsi_internal *priv;
1193         unsigned long flags;
1194
1195         spin_lock_irqsave(&iscsi_transport_lock, flags);
1196         list_for_each_entry(priv, &iscsi_transports, list) {
1197                 if (tt == priv->iscsi_transport) {
1198                         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
1199                         return priv;
1200                 }
1201         }
1202         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
1203         return NULL;
1204 }
1205
1206 static int
1207 iscsi_multicast_skb(struct sk_buff *skb, uint32_t group, gfp_t gfp)
1208 {
1209         return nlmsg_multicast(nls, skb, 0, group, gfp);
1210 }
1211
1212 int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
1213                    char *data, uint32_t data_size)
1214 {
1215         struct nlmsghdr *nlh;
1216         struct sk_buff *skb;
1217         struct iscsi_uevent *ev;
1218         char *pdu;
1219         struct iscsi_internal *priv;
1220         int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) +
1221                               data_size);
1222
1223         priv = iscsi_if_transport_lookup(conn->transport);
1224         if (!priv)
1225                 return -EINVAL;
1226
1227         skb = alloc_skb(len, GFP_ATOMIC);
1228         if (!skb) {
1229                 iscsi_conn_error_event(conn, ISCSI_ERR_CONN_FAILED);
1230                 iscsi_cls_conn_printk(KERN_ERR, conn, "can not deliver "
1231                                       "control PDU: OOM\n");
1232                 return -ENOMEM;
1233         }
1234
1235         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1236         ev = NLMSG_DATA(nlh);
1237         memset(ev, 0, sizeof(*ev));
1238         ev->transport_handle = iscsi_handle(conn->transport);
1239         ev->type = ISCSI_KEVENT_RECV_PDU;
1240         ev->r.recv_req.cid = conn->cid;
1241         ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
1242         pdu = (char*)ev + sizeof(*ev);
1243         memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
1244         memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
1245
1246         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
1247 }
1248 EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
1249
1250 int iscsi_offload_mesg(struct Scsi_Host *shost,
1251                        struct iscsi_transport *transport, uint32_t type,
1252                        char *data, uint16_t data_size)
1253 {
1254         struct nlmsghdr *nlh;
1255         struct sk_buff *skb;
1256         struct iscsi_uevent *ev;
1257         int len = NLMSG_SPACE(sizeof(*ev) + data_size);
1258
1259         skb = alloc_skb(len, GFP_ATOMIC);
1260         if (!skb) {
1261                 printk(KERN_ERR "can not deliver iscsi offload message:OOM\n");
1262                 return -ENOMEM;
1263         }
1264
1265         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1266         ev = NLMSG_DATA(nlh);
1267         memset(ev, 0, sizeof(*ev));
1268         ev->type = type;
1269         ev->transport_handle = iscsi_handle(transport);
1270         switch (type) {
1271         case ISCSI_KEVENT_PATH_REQ:
1272                 ev->r.req_path.host_no = shost->host_no;
1273                 break;
1274         case ISCSI_KEVENT_IF_DOWN:
1275                 ev->r.notify_if_down.host_no = shost->host_no;
1276                 break;
1277         }
1278
1279         memcpy((char *)ev + sizeof(*ev), data, data_size);
1280
1281         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC);
1282 }
1283 EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
1284
1285 void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)
1286 {
1287         struct nlmsghdr *nlh;
1288         struct sk_buff  *skb;
1289         struct iscsi_uevent *ev;
1290         struct iscsi_internal *priv;
1291         int len = NLMSG_SPACE(sizeof(*ev));
1292
1293         priv = iscsi_if_transport_lookup(conn->transport);
1294         if (!priv)
1295                 return;
1296
1297         skb = alloc_skb(len, GFP_ATOMIC);
1298         if (!skb) {
1299                 iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
1300                                       "conn error (%d)\n", error);
1301                 return;
1302         }
1303
1304         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1305         ev = NLMSG_DATA(nlh);
1306         ev->transport_handle = iscsi_handle(conn->transport);
1307         ev->type = ISCSI_KEVENT_CONN_ERROR;
1308         ev->r.connerror.error = error;
1309         ev->r.connerror.cid = conn->cid;
1310         ev->r.connerror.sid = iscsi_conn_get_sid(conn);
1311
1312         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
1313
1314         iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn error (%d)\n",
1315                               error);
1316 }
1317 EXPORT_SYMBOL_GPL(iscsi_conn_error_event);
1318
1319 static int
1320 iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi,
1321                     void *payload, int size)
1322 {
1323         struct sk_buff  *skb;
1324         struct nlmsghdr *nlh;
1325         int len = NLMSG_SPACE(size);
1326         int flags = multi ? NLM_F_MULTI : 0;
1327         int t = done ? NLMSG_DONE : type;
1328
1329         skb = alloc_skb(len, GFP_ATOMIC);
1330         if (!skb) {
1331                 printk(KERN_ERR "Could not allocate skb to send reply.\n");
1332                 return -ENOMEM;
1333         }
1334
1335         nlh = __nlmsg_put(skb, 0, 0, t, (len - sizeof(*nlh)), 0);
1336         nlh->nlmsg_flags = flags;
1337         memcpy(NLMSG_DATA(nlh), payload, size);
1338         return iscsi_multicast_skb(skb, group, GFP_ATOMIC);
1339 }
1340
1341 static int
1342 iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
1343 {
1344         struct iscsi_uevent *ev = NLMSG_DATA(nlh);
1345         struct iscsi_stats *stats;
1346         struct sk_buff *skbstat;
1347         struct iscsi_cls_conn *conn;
1348         struct nlmsghdr *nlhstat;
1349         struct iscsi_uevent *evstat;
1350         struct iscsi_internal *priv;
1351         int len = NLMSG_SPACE(sizeof(*ev) +
1352                               sizeof(struct iscsi_stats) +
1353                               sizeof(struct iscsi_stats_custom) *
1354                               ISCSI_STATS_CUSTOM_MAX);
1355         int err = 0;
1356
1357         priv = iscsi_if_transport_lookup(transport);
1358         if (!priv)
1359                 return -EINVAL;
1360
1361         conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
1362         if (!conn)
1363                 return -EEXIST;
1364
1365         do {
1366                 int actual_size;
1367
1368                 skbstat = alloc_skb(len, GFP_ATOMIC);
1369                 if (!skbstat) {
1370                         iscsi_cls_conn_printk(KERN_ERR, conn, "can not "
1371                                               "deliver stats: OOM\n");
1372                         return -ENOMEM;
1373                 }
1374
1375                 nlhstat = __nlmsg_put(skbstat, 0, 0, 0,
1376                                       (len - sizeof(*nlhstat)), 0);
1377                 evstat = NLMSG_DATA(nlhstat);
1378                 memset(evstat, 0, sizeof(*evstat));
1379                 evstat->transport_handle = iscsi_handle(conn->transport);
1380                 evstat->type = nlh->nlmsg_type;
1381                 evstat->u.get_stats.cid =
1382                         ev->u.get_stats.cid;
1383                 evstat->u.get_stats.sid =
1384                         ev->u.get_stats.sid;
1385                 stats = (struct iscsi_stats *)
1386                         ((char*)evstat + sizeof(*evstat));
1387                 memset(stats, 0, sizeof(*stats));
1388
1389                 transport->get_stats(conn, stats);
1390                 actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) +
1391                                           sizeof(struct iscsi_stats) +
1392                                           sizeof(struct iscsi_stats_custom) *
1393                                           stats->custom_length);
1394                 actual_size -= sizeof(*nlhstat);
1395                 actual_size = NLMSG_LENGTH(actual_size);
1396                 skb_trim(skbstat, NLMSG_ALIGN(actual_size));
1397                 nlhstat->nlmsg_len = actual_size;
1398
1399                 err = iscsi_multicast_skb(skbstat, ISCSI_NL_GRP_ISCSID,
1400                                           GFP_ATOMIC);
1401         } while (err < 0 && err != -ECONNREFUSED);
1402
1403         return err;
1404 }
1405
1406 /**
1407  * iscsi_session_event - send session destr. completion event
1408  * @session: iscsi class session
1409  * @event: type of event
1410  */
1411 int iscsi_session_event(struct iscsi_cls_session *session,
1412                         enum iscsi_uevent_e event)
1413 {
1414         struct iscsi_internal *priv;
1415         struct Scsi_Host *shost;
1416         struct iscsi_uevent *ev;
1417         struct sk_buff  *skb;
1418         struct nlmsghdr *nlh;
1419         int rc, len = NLMSG_SPACE(sizeof(*ev));
1420
1421         priv = iscsi_if_transport_lookup(session->transport);
1422         if (!priv)
1423                 return -EINVAL;
1424         shost = iscsi_session_to_shost(session);
1425
1426         skb = alloc_skb(len, GFP_KERNEL);
1427         if (!skb) {
1428                 iscsi_cls_session_printk(KERN_ERR, session,
1429                                          "Cannot notify userspace of session "
1430                                          "event %u\n", event);
1431                 return -ENOMEM;
1432         }
1433
1434         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1435         ev = NLMSG_DATA(nlh);
1436         ev->transport_handle = iscsi_handle(session->transport);
1437
1438         ev->type = event;
1439         switch (event) {
1440         case ISCSI_KEVENT_DESTROY_SESSION:
1441                 ev->r.d_session.host_no = shost->host_no;
1442                 ev->r.d_session.sid = session->sid;
1443                 break;
1444         case ISCSI_KEVENT_CREATE_SESSION:
1445                 ev->r.c_session_ret.host_no = shost->host_no;
1446                 ev->r.c_session_ret.sid = session->sid;
1447                 break;
1448         case ISCSI_KEVENT_UNBIND_SESSION:
1449                 ev->r.unbind_session.host_no = shost->host_no;
1450                 ev->r.unbind_session.sid = session->sid;
1451                 break;
1452         default:
1453                 iscsi_cls_session_printk(KERN_ERR, session, "Invalid event "
1454                                          "%u.\n", event);
1455                 kfree_skb(skb);
1456                 return -EINVAL;
1457         }
1458
1459         /*
1460          * this will occur if the daemon is not up, so we just warn
1461          * the user and when the daemon is restarted it will handle it
1462          */
1463         rc = iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
1464         if (rc == -ESRCH)
1465                 iscsi_cls_session_printk(KERN_ERR, session,
1466                                          "Cannot notify userspace of session "
1467                                          "event %u. Check iscsi daemon\n",
1468                                          event);
1469
1470         ISCSI_DBG_TRANS_SESSION(session, "Completed handling event %d rc %d\n",
1471                                 event, rc);
1472         return rc;
1473 }
1474 EXPORT_SYMBOL_GPL(iscsi_session_event);
1475
1476 static int
1477 iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_endpoint *ep,
1478                         struct iscsi_uevent *ev, uint32_t initial_cmdsn,
1479                         uint16_t cmds_max, uint16_t queue_depth)
1480 {
1481         struct iscsi_transport *transport = priv->iscsi_transport;
1482         struct iscsi_cls_session *session;
1483         struct Scsi_Host *shost;
1484
1485         session = transport->create_session(ep, cmds_max, queue_depth,
1486                                             initial_cmdsn);
1487         if (!session)
1488                 return -ENOMEM;
1489
1490         shost = iscsi_session_to_shost(session);
1491         ev->r.c_session_ret.host_no = shost->host_no;
1492         ev->r.c_session_ret.sid = session->sid;
1493         ISCSI_DBG_TRANS_SESSION(session,
1494                                 "Completed creating transport session\n");
1495         return 0;
1496 }
1497
1498 static int
1499 iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1500 {
1501         struct iscsi_cls_conn *conn;
1502         struct iscsi_cls_session *session;
1503
1504         session = iscsi_session_lookup(ev->u.c_conn.sid);
1505         if (!session) {
1506                 printk(KERN_ERR "iscsi: invalid session %d.\n",
1507                        ev->u.c_conn.sid);
1508                 return -EINVAL;
1509         }
1510
1511         conn = transport->create_conn(session, ev->u.c_conn.cid);
1512         if (!conn) {
1513                 iscsi_cls_session_printk(KERN_ERR, session,
1514                                          "couldn't create a new connection.");
1515                 return -ENOMEM;
1516         }
1517
1518         ev->r.c_conn_ret.sid = session->sid;
1519         ev->r.c_conn_ret.cid = conn->cid;
1520
1521         ISCSI_DBG_TRANS_CONN(conn, "Completed creating transport conn\n");
1522         return 0;
1523 }
1524
1525 static int
1526 iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1527 {
1528         struct iscsi_cls_conn *conn;
1529
1530         conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid);
1531         if (!conn)
1532                 return -EINVAL;
1533
1534         ISCSI_DBG_TRANS_CONN(conn, "Destroying transport conn\n");
1535         if (transport->destroy_conn)
1536                 transport->destroy_conn(conn);
1537
1538         return 0;
1539 }
1540
1541 static int
1542 iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1543 {
1544         char *data = (char*)ev + sizeof(*ev);
1545         struct iscsi_cls_conn *conn;
1546         struct iscsi_cls_session *session;
1547         int err = 0, value = 0;
1548
1549         session = iscsi_session_lookup(ev->u.set_param.sid);
1550         conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
1551         if (!conn || !session)
1552                 return -EINVAL;
1553
1554         switch (ev->u.set_param.param) {
1555         case ISCSI_PARAM_SESS_RECOVERY_TMO:
1556                 sscanf(data, "%d", &value);
1557                 session->recovery_tmo = value;
1558                 break;
1559         default:
1560                 err = transport->set_param(conn, ev->u.set_param.param,
1561                                            data, ev->u.set_param.len);
1562         }
1563
1564         return err;
1565 }
1566
1567 static int iscsi_if_ep_connect(struct iscsi_transport *transport,
1568                                struct iscsi_uevent *ev, int msg_type)
1569 {
1570         struct iscsi_endpoint *ep;
1571         struct sockaddr *dst_addr;
1572         struct Scsi_Host *shost = NULL;
1573         int non_blocking, err = 0;
1574
1575         if (!transport->ep_connect)
1576                 return -EINVAL;
1577
1578         if (msg_type == ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST) {
1579                 shost = scsi_host_lookup(ev->u.ep_connect_through_host.host_no);
1580                 if (!shost) {
1581                         printk(KERN_ERR "ep connect failed. Could not find "
1582                                "host no %u\n",
1583                                ev->u.ep_connect_through_host.host_no);
1584                         return -ENODEV;
1585                 }
1586                 non_blocking = ev->u.ep_connect_through_host.non_blocking;
1587         } else
1588                 non_blocking = ev->u.ep_connect.non_blocking;
1589
1590         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
1591         ep = transport->ep_connect(shost, dst_addr, non_blocking);
1592         if (IS_ERR(ep)) {
1593                 err = PTR_ERR(ep);
1594                 goto release_host;
1595         }
1596
1597         ev->r.ep_connect_ret.handle = ep->id;
1598 release_host:
1599         if (shost)
1600                 scsi_host_put(shost);
1601         return err;
1602 }
1603
1604 static int iscsi_if_ep_disconnect(struct iscsi_transport *transport,
1605                                   u64 ep_handle)
1606 {
1607         struct iscsi_cls_conn *conn;
1608         struct iscsi_endpoint *ep;
1609
1610         if (!transport->ep_disconnect)
1611                 return -EINVAL;
1612
1613         ep = iscsi_lookup_endpoint(ep_handle);
1614         if (!ep)
1615                 return -EINVAL;
1616         conn = ep->conn;
1617         if (conn) {
1618                 mutex_lock(&conn->ep_mutex);
1619                 conn->ep = NULL;
1620                 mutex_unlock(&conn->ep_mutex);
1621         }
1622
1623         transport->ep_disconnect(ep);
1624         return 0;
1625 }
1626
1627 static int
1628 iscsi_if_transport_ep(struct iscsi_transport *transport,
1629                       struct iscsi_uevent *ev, int msg_type)
1630 {
1631         struct iscsi_endpoint *ep;
1632         int rc = 0;
1633
1634         switch (msg_type) {
1635         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
1636         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
1637                 rc = iscsi_if_ep_connect(transport, ev, msg_type);
1638                 break;
1639         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
1640                 if (!transport->ep_poll)
1641                         return -EINVAL;
1642
1643                 ep = iscsi_lookup_endpoint(ev->u.ep_poll.ep_handle);
1644                 if (!ep)
1645                         return -EINVAL;
1646
1647                 ev->r.retcode = transport->ep_poll(ep,
1648                                                    ev->u.ep_poll.timeout_ms);
1649                 break;
1650         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
1651                 rc = iscsi_if_ep_disconnect(transport,
1652                                             ev->u.ep_disconnect.ep_handle);
1653                 break;
1654         }
1655         return rc;
1656 }
1657
1658 static int
1659 iscsi_tgt_dscvr(struct iscsi_transport *transport,
1660                 struct iscsi_uevent *ev)
1661 {
1662         struct Scsi_Host *shost;
1663         struct sockaddr *dst_addr;
1664         int err;
1665
1666         if (!transport->tgt_dscvr)
1667                 return -EINVAL;
1668
1669         shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
1670         if (!shost) {
1671                 printk(KERN_ERR "target discovery could not find host no %u\n",
1672                        ev->u.tgt_dscvr.host_no);
1673                 return -ENODEV;
1674         }
1675
1676
1677         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
1678         err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type,
1679                                    ev->u.tgt_dscvr.enable, dst_addr);
1680         scsi_host_put(shost);
1681         return err;
1682 }
1683
1684 static int
1685 iscsi_set_host_param(struct iscsi_transport *transport,
1686                      struct iscsi_uevent *ev)
1687 {
1688         char *data = (char*)ev + sizeof(*ev);
1689         struct Scsi_Host *shost;
1690         int err;
1691
1692         if (!transport->set_host_param)
1693                 return -ENOSYS;
1694
1695         shost = scsi_host_lookup(ev->u.set_host_param.host_no);
1696         if (!shost) {
1697                 printk(KERN_ERR "set_host_param could not find host no %u\n",
1698                        ev->u.set_host_param.host_no);
1699                 return -ENODEV;
1700         }
1701
1702         err = transport->set_host_param(shost, ev->u.set_host_param.param,
1703                                         data, ev->u.set_host_param.len);
1704         scsi_host_put(shost);
1705         return err;
1706 }
1707
1708 static int
1709 iscsi_set_path(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1710 {
1711         struct Scsi_Host *shost;
1712         struct iscsi_path *params;
1713         int err;
1714
1715         if (!transport->set_path)
1716                 return -ENOSYS;
1717
1718         shost = scsi_host_lookup(ev->u.set_path.host_no);
1719         if (!shost) {
1720                 printk(KERN_ERR "set path could not find host no %u\n",
1721                        ev->u.set_path.host_no);
1722                 return -ENODEV;
1723         }
1724
1725         params = (struct iscsi_path *)((char *)ev + sizeof(*ev));
1726         err = transport->set_path(shost, params);
1727
1728         scsi_host_put(shost);
1729         return err;
1730 }
1731
1732 static int
1733 iscsi_set_iface_params(struct iscsi_transport *transport,
1734                        struct iscsi_uevent *ev)
1735 {
1736         char *data = (char *)ev + sizeof(*ev);
1737         struct Scsi_Host *shost;
1738         int err;
1739
1740         if (!transport->set_iface_param)
1741                 return -ENOSYS;
1742
1743         shost = scsi_host_lookup(ev->u.set_iface_params.host_no);
1744         if (!shost) {
1745                 printk(KERN_ERR "set_iface_params could not find host no %u\n",
1746                        ev->u.set_iface_params.host_no);
1747                 return -ENODEV;
1748         }
1749
1750         err = transport->set_iface_param(shost, data,
1751                                          ev->u.set_iface_params.count);
1752         scsi_host_put(shost);
1753         return err;
1754 }
1755
1756 static int
1757 iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
1758 {
1759         int err = 0;
1760         struct iscsi_uevent *ev = NLMSG_DATA(nlh);
1761         struct iscsi_transport *transport = NULL;
1762         struct iscsi_internal *priv;
1763         struct iscsi_cls_session *session;
1764         struct iscsi_cls_conn *conn;
1765         struct iscsi_endpoint *ep = NULL;
1766
1767         if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE)
1768                 *group = ISCSI_NL_GRP_UIP;
1769         else
1770                 *group = ISCSI_NL_GRP_ISCSID;
1771
1772         priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle));
1773         if (!priv)
1774                 return -EINVAL;
1775         transport = priv->iscsi_transport;
1776
1777         if (!try_module_get(transport->owner))
1778                 return -EINVAL;
1779
1780         switch (nlh->nlmsg_type) {
1781         case ISCSI_UEVENT_CREATE_SESSION:
1782                 err = iscsi_if_create_session(priv, ep, ev,
1783                                               ev->u.c_session.initial_cmdsn,
1784                                               ev->u.c_session.cmds_max,
1785                                               ev->u.c_session.queue_depth);
1786                 break;
1787         case ISCSI_UEVENT_CREATE_BOUND_SESSION:
1788                 ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle);
1789                 if (!ep) {
1790                         err = -EINVAL;
1791                         break;
1792                 }
1793
1794                 err = iscsi_if_create_session(priv, ep, ev,
1795                                         ev->u.c_bound_session.initial_cmdsn,
1796                                         ev->u.c_bound_session.cmds_max,
1797                                         ev->u.c_bound_session.queue_depth);
1798                 break;
1799         case ISCSI_UEVENT_DESTROY_SESSION:
1800                 session = iscsi_session_lookup(ev->u.d_session.sid);
1801                 if (session)
1802                         transport->destroy_session(session);
1803                 else
1804                         err = -EINVAL;
1805                 break;
1806         case ISCSI_UEVENT_UNBIND_SESSION:
1807                 session = iscsi_session_lookup(ev->u.d_session.sid);
1808                 if (session)
1809                         scsi_queue_work(iscsi_session_to_shost(session),
1810                                         &session->unbind_work);
1811                 else
1812                         err = -EINVAL;
1813                 break;
1814         case ISCSI_UEVENT_CREATE_CONN:
1815                 err = iscsi_if_create_conn(transport, ev);
1816                 break;
1817         case ISCSI_UEVENT_DESTROY_CONN:
1818                 err = iscsi_if_destroy_conn(transport, ev);
1819                 break;
1820         case ISCSI_UEVENT_BIND_CONN:
1821                 session = iscsi_session_lookup(ev->u.b_conn.sid);
1822                 conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
1823
1824                 if (conn && conn->ep)
1825                         iscsi_if_ep_disconnect(transport, conn->ep->id);
1826
1827                 if (!session || !conn) {
1828                         err = -EINVAL;
1829                         break;
1830                 }
1831
1832                 ev->r.retcode = transport->bind_conn(session, conn,
1833                                                 ev->u.b_conn.transport_eph,
1834                                                 ev->u.b_conn.is_leading);
1835                 if (ev->r.retcode || !transport->ep_connect)
1836                         break;
1837
1838                 ep = iscsi_lookup_endpoint(ev->u.b_conn.transport_eph);
1839                 if (ep) {
1840                         ep->conn = conn;
1841
1842                         mutex_lock(&conn->ep_mutex);
1843                         conn->ep = ep;
1844                         mutex_unlock(&conn->ep_mutex);
1845                 } else
1846                         iscsi_cls_conn_printk(KERN_ERR, conn,
1847                                               "Could not set ep conn "
1848                                               "binding\n");
1849                 break;
1850         case ISCSI_UEVENT_SET_PARAM:
1851                 err = iscsi_set_param(transport, ev);
1852                 break;
1853         case ISCSI_UEVENT_START_CONN:
1854                 conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
1855                 if (conn)
1856                         ev->r.retcode = transport->start_conn(conn);
1857                 else
1858                         err = -EINVAL;
1859                 break;
1860         case ISCSI_UEVENT_STOP_CONN:
1861                 conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
1862                 if (conn)
1863                         transport->stop_conn(conn, ev->u.stop_conn.flag);
1864                 else
1865                         err = -EINVAL;
1866                 break;
1867         case ISCSI_UEVENT_SEND_PDU:
1868                 conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
1869                 if (conn)
1870                         ev->r.retcode = transport->send_pdu(conn,
1871                                 (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
1872                                 (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
1873                                 ev->u.send_pdu.data_size);
1874                 else
1875                         err = -EINVAL;
1876                 break;
1877         case ISCSI_UEVENT_GET_STATS:
1878                 err = iscsi_if_get_stats(transport, nlh);
1879                 break;
1880         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
1881         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
1882         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
1883         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
1884                 err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
1885                 break;
1886         case ISCSI_UEVENT_TGT_DSCVR:
1887                 err = iscsi_tgt_dscvr(transport, ev);
1888                 break;
1889         case ISCSI_UEVENT_SET_HOST_PARAM:
1890                 err = iscsi_set_host_param(transport, ev);
1891                 break;
1892         case ISCSI_UEVENT_PATH_UPDATE:
1893                 err = iscsi_set_path(transport, ev);
1894                 break;
1895         case ISCSI_UEVENT_SET_IFACE_PARAMS:
1896                 err = iscsi_set_iface_params(transport, ev);
1897                 break;
1898         default:
1899                 err = -ENOSYS;
1900                 break;
1901         }
1902
1903         module_put(transport->owner);
1904         return err;
1905 }
1906
1907 /*
1908  * Get message from skb.  Each message is processed by iscsi_if_recv_msg.
1909  * Malformed skbs with wrong lengths or invalid creds are not processed.
1910  */
1911 static void
1912 iscsi_if_rx(struct sk_buff *skb)
1913 {
1914         mutex_lock(&rx_queue_mutex);
1915         while (skb->len >= NLMSG_SPACE(0)) {
1916                 int err;
1917                 uint32_t rlen;
1918                 struct nlmsghdr *nlh;
1919                 struct iscsi_uevent *ev;
1920                 uint32_t group;
1921
1922                 nlh = nlmsg_hdr(skb);
1923                 if (nlh->nlmsg_len < sizeof(*nlh) ||
1924                     skb->len < nlh->nlmsg_len) {
1925                         break;
1926                 }
1927
1928                 ev = NLMSG_DATA(nlh);
1929                 rlen = NLMSG_ALIGN(nlh->nlmsg_len);
1930                 if (rlen > skb->len)
1931                         rlen = skb->len;
1932
1933                 err = iscsi_if_recv_msg(skb, nlh, &group);
1934                 if (err) {
1935                         ev->type = ISCSI_KEVENT_IF_ERROR;
1936                         ev->iferror = err;
1937                 }
1938                 do {
1939                         /*
1940                          * special case for GET_STATS:
1941                          * on success - sending reply and stats from
1942                          * inside of if_recv_msg(),
1943                          * on error - fall through.
1944                          */
1945                         if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
1946                                 break;
1947                         err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
1948                                 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
1949                 } while (err < 0 && err != -ECONNREFUSED);
1950                 skb_pull(skb, rlen);
1951         }
1952         mutex_unlock(&rx_queue_mutex);
1953 }
1954
1955 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store)              \
1956 struct device_attribute dev_attr_##_prefix##_##_name =  \
1957         __ATTR(_name,_mode,_show,_store)
1958
1959 /*
1960  * iSCSI connection attrs
1961  */
1962 #define iscsi_conn_attr_show(param)                                     \
1963 static ssize_t                                                          \
1964 show_conn_param_##param(struct device *dev,                             \
1965                         struct device_attribute *attr, char *buf)       \
1966 {                                                                       \
1967         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
1968         struct iscsi_transport *t = conn->transport;                    \
1969         return t->get_conn_param(conn, param, buf);                     \
1970 }
1971
1972 #define iscsi_conn_attr(field, param)                                   \
1973         iscsi_conn_attr_show(param)                                     \
1974 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param,  \
1975                         NULL);
1976
1977 iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
1978 iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
1979 iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
1980 iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
1981 iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
1982 iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
1983 iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
1984 iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
1985 iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
1986 iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO);
1987 iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO);
1988
1989 #define iscsi_conn_ep_attr_show(param)                                  \
1990 static ssize_t show_conn_ep_param_##param(struct device *dev,           \
1991                                           struct device_attribute *attr,\
1992                                           char *buf)                    \
1993 {                                                                       \
1994         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
1995         struct iscsi_transport *t = conn->transport;                    \
1996         struct iscsi_endpoint *ep;                                      \
1997         ssize_t rc;                                                     \
1998                                                                         \
1999         /*                                                              \
2000          * Need to make sure ep_disconnect does not free the LLD's      \
2001          * interconnect resources while we are trying to read them.     \
2002          */                                                             \
2003         mutex_lock(&conn->ep_mutex);                                    \
2004         ep = conn->ep;                                                  \
2005         if (!ep && t->ep_connect) {                                     \
2006                 mutex_unlock(&conn->ep_mutex);                          \
2007                 return -ENOTCONN;                                       \
2008         }                                                               \
2009                                                                         \
2010         if (ep)                                                         \
2011                 rc = t->get_ep_param(ep, param, buf);                   \
2012         else                                                            \
2013                 rc = t->get_conn_param(conn, param, buf);               \
2014         mutex_unlock(&conn->ep_mutex);                                  \
2015         return rc;                                                      \
2016 }
2017
2018 #define iscsi_conn_ep_attr(field, param)                                \
2019         iscsi_conn_ep_attr_show(param)                                  \
2020 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO,                           \
2021                         show_conn_ep_param_##param, NULL);
2022
2023 iscsi_conn_ep_attr(address, ISCSI_PARAM_CONN_ADDRESS);
2024 iscsi_conn_ep_attr(port, ISCSI_PARAM_CONN_PORT);
2025
2026 static struct attribute *iscsi_conn_attrs[] = {
2027         &dev_attr_conn_max_recv_dlength.attr,
2028         &dev_attr_conn_max_xmit_dlength.attr,
2029         &dev_attr_conn_header_digest.attr,
2030         &dev_attr_conn_data_digest.attr,
2031         &dev_attr_conn_ifmarker.attr,
2032         &dev_attr_conn_ofmarker.attr,
2033         &dev_attr_conn_address.attr,
2034         &dev_attr_conn_port.attr,
2035         &dev_attr_conn_exp_statsn.attr,
2036         &dev_attr_conn_persistent_address.attr,
2037         &dev_attr_conn_persistent_port.attr,
2038         &dev_attr_conn_ping_tmo.attr,
2039         &dev_attr_conn_recv_tmo.attr,
2040         NULL,
2041 };
2042
2043 static mode_t iscsi_conn_attr_is_visible(struct kobject *kobj,
2044                                          struct attribute *attr, int i)
2045 {
2046         struct device *cdev = container_of(kobj, struct device, kobj);
2047         struct iscsi_cls_conn *conn = transport_class_to_conn(cdev);
2048         struct iscsi_transport *t = conn->transport;
2049         int param;
2050
2051         if (attr == &dev_attr_conn_max_recv_dlength.attr)
2052                 param = ISCSI_PARAM_MAX_RECV_DLENGTH;
2053         else if (attr == &dev_attr_conn_max_xmit_dlength.attr)
2054                 param = ISCSI_PARAM_MAX_XMIT_DLENGTH;
2055         else if (attr == &dev_attr_conn_header_digest.attr)
2056                 param = ISCSI_PARAM_HDRDGST_EN;
2057         else if (attr == &dev_attr_conn_data_digest.attr)
2058                 param = ISCSI_PARAM_DATADGST_EN;
2059         else if (attr == &dev_attr_conn_ifmarker.attr)
2060                 param = ISCSI_PARAM_IFMARKER_EN;
2061         else if (attr == &dev_attr_conn_ofmarker.attr)
2062                 param = ISCSI_PARAM_OFMARKER_EN;
2063         else if (attr == &dev_attr_conn_address.attr)
2064                 param = ISCSI_PARAM_CONN_ADDRESS;
2065         else if (attr == &dev_attr_conn_port.attr)
2066                 param = ISCSI_PARAM_CONN_PORT;
2067         else if (attr == &dev_attr_conn_exp_statsn.attr)
2068                 param = ISCSI_PARAM_EXP_STATSN;
2069         else if (attr == &dev_attr_conn_persistent_address.attr)
2070                 param = ISCSI_PARAM_PERSISTENT_ADDRESS;
2071         else if (attr == &dev_attr_conn_persistent_port.attr)
2072                 param = ISCSI_PARAM_PERSISTENT_PORT;
2073         else if (attr == &dev_attr_conn_ping_tmo.attr)
2074                 param = ISCSI_PARAM_PING_TMO;
2075         else if (attr == &dev_attr_conn_recv_tmo.attr)
2076                 param = ISCSI_PARAM_RECV_TMO;
2077         else {
2078                 WARN_ONCE(1, "Invalid conn attr");
2079                 return 0;
2080         }
2081
2082         return t->attr_is_visible(ISCSI_PARAM, param);
2083 }
2084
2085 static struct attribute_group iscsi_conn_group = {
2086         .attrs = iscsi_conn_attrs,
2087         .is_visible = iscsi_conn_attr_is_visible,
2088 };
2089
2090 /*
2091  * iSCSI session attrs
2092  */
2093 #define iscsi_session_attr_show(param, perm)                            \
2094 static ssize_t                                                          \
2095 show_session_param_##param(struct device *dev,                          \
2096                            struct device_attribute *attr, char *buf)    \
2097 {                                                                       \
2098         struct iscsi_cls_session *session =                             \
2099                 iscsi_dev_to_session(dev->parent);                      \
2100         struct iscsi_transport *t = session->transport;                 \
2101                                                                         \
2102         if (perm && !capable(CAP_SYS_ADMIN))                            \
2103                 return -EACCES;                                         \
2104         return t->get_session_param(session, param, buf);               \
2105 }
2106
2107 #define iscsi_session_attr(field, param, perm)                          \
2108         iscsi_session_attr_show(param, perm)                            \
2109 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
2110                         NULL);
2111 iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME, 0);
2112 iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, 0);
2113 iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, 0);
2114 iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, 0);
2115 iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, 0);
2116 iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, 0);
2117 iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, 0);
2118 iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, 0);
2119 iscsi_session_attr(erl, ISCSI_PARAM_ERL, 0);
2120 iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT, 0);
2121 iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1);
2122 iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1);
2123 iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1);
2124 iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1);
2125 iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0);
2126 iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0);
2127 iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0);
2128 iscsi_session_attr(tgt_reset_tmo, ISCSI_PARAM_TGT_RESET_TMO, 0);
2129 iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0);
2130 iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0);
2131 iscsi_session_attr(targetalias, ISCSI_PARAM_TARGET_ALIAS, 0);
2132
2133 static ssize_t
2134 show_priv_session_state(struct device *dev, struct device_attribute *attr,
2135                         char *buf)
2136 {
2137         struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
2138         return sprintf(buf, "%s\n", iscsi_session_state_name(session->state));
2139 }
2140 static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state,
2141                         NULL);
2142
2143 #define iscsi_priv_session_attr_show(field, format)                     \
2144 static ssize_t                                                          \
2145 show_priv_session_##field(struct device *dev,                           \
2146                           struct device_attribute *attr, char *buf)     \
2147 {                                                                       \
2148         struct iscsi_cls_session *session =                             \
2149                         iscsi_dev_to_session(dev->parent);              \
2150         if (session->field == -1)                                       \
2151                 return sprintf(buf, "off\n");                           \
2152         return sprintf(buf, format"\n", session->field);                \
2153 }
2154
2155 #define iscsi_priv_session_attr_store(field)                            \
2156 static ssize_t                                                          \
2157 store_priv_session_##field(struct device *dev,                          \
2158                            struct device_attribute *attr,               \
2159                            const char *buf, size_t count)               \
2160 {                                                                       \
2161         int val;                                                        \
2162         char *cp;                                                       \
2163         struct iscsi_cls_session *session =                             \
2164                 iscsi_dev_to_session(dev->parent);                      \
2165         if ((session->state == ISCSI_SESSION_FREE) ||                   \
2166             (session->state == ISCSI_SESSION_FAILED))                   \
2167                 return -EBUSY;                                          \
2168         if (strncmp(buf, "off", 3) == 0)                                \
2169                 session->field = -1;                                    \
2170         else {                                                          \
2171                 val = simple_strtoul(buf, &cp, 0);                      \
2172                 if (*cp != '\0' && *cp != '\n')                         \
2173                         return -EINVAL;                                 \
2174                 session->field = val;                                   \
2175         }                                                               \
2176         return count;                                                   \
2177 }
2178
2179 #define iscsi_priv_session_rw_attr(field, format)                       \
2180         iscsi_priv_session_attr_show(field, format)                     \
2181         iscsi_priv_session_attr_store(field)                            \
2182 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO | S_IWUSR,            \
2183                         show_priv_session_##field,                      \
2184                         store_priv_session_##field)
2185 iscsi_priv_session_rw_attr(recovery_tmo, "%d");
2186
2187 static struct attribute *iscsi_session_attrs[] = {
2188         &dev_attr_sess_initial_r2t.attr,
2189         &dev_attr_sess_max_outstanding_r2t.attr,
2190         &dev_attr_sess_immediate_data.attr,
2191         &dev_attr_sess_first_burst_len.attr,
2192         &dev_attr_sess_max_burst_len.attr,
2193         &dev_attr_sess_data_pdu_in_order.attr,
2194         &dev_attr_sess_data_seq_in_order.attr,
2195         &dev_attr_sess_erl.attr,
2196         &dev_attr_sess_targetname.attr,
2197         &dev_attr_sess_tpgt.attr,
2198         &dev_attr_sess_password.attr,
2199         &dev_attr_sess_password_in.attr,
2200         &dev_attr_sess_username.attr,
2201         &dev_attr_sess_username_in.attr,
2202         &dev_attr_sess_fast_abort.attr,
2203         &dev_attr_sess_abort_tmo.attr,
2204         &dev_attr_sess_lu_reset_tmo.attr,
2205         &dev_attr_sess_tgt_reset_tmo.attr,
2206         &dev_attr_sess_ifacename.attr,
2207         &dev_attr_sess_initiatorname.attr,
2208         &dev_attr_sess_targetalias.attr,
2209         &dev_attr_priv_sess_recovery_tmo.attr,
2210         &dev_attr_priv_sess_state.attr,
2211         NULL,
2212 };
2213
2214 static mode_t iscsi_session_attr_is_visible(struct kobject *kobj,
2215                                             struct attribute *attr, int i)
2216 {
2217         struct device *cdev = container_of(kobj, struct device, kobj);
2218         struct iscsi_cls_session *session = transport_class_to_session(cdev);
2219         struct iscsi_transport *t = session->transport;
2220         int param;
2221
2222         if (attr == &dev_attr_sess_initial_r2t.attr)
2223                 param = ISCSI_PARAM_INITIAL_R2T_EN;
2224         else if (attr == &dev_attr_sess_max_outstanding_r2t.attr)
2225                 param = ISCSI_PARAM_MAX_R2T;
2226         else if (attr == &dev_attr_sess_immediate_data.attr)
2227                 param = ISCSI_PARAM_IMM_DATA_EN;
2228         else if (attr == &dev_attr_sess_first_burst_len.attr)
2229                 param = ISCSI_PARAM_FIRST_BURST;
2230         else if (attr == &dev_attr_sess_max_burst_len.attr)
2231                 param = ISCSI_PARAM_MAX_BURST;
2232         else if (attr == &dev_attr_sess_data_pdu_in_order.attr)
2233                 param = ISCSI_PARAM_PDU_INORDER_EN;
2234         else if (attr == &dev_attr_sess_data_seq_in_order.attr)
2235                 param = ISCSI_PARAM_DATASEQ_INORDER_EN;
2236         else if (attr == &dev_attr_sess_erl.attr)
2237                 param = ISCSI_PARAM_ERL;
2238         else if (attr == &dev_attr_sess_targetname.attr)
2239                 param = ISCSI_PARAM_TARGET_NAME;
2240         else if (attr == &dev_attr_sess_tpgt.attr)
2241                 param = ISCSI_PARAM_TPGT;
2242         else if (attr == &dev_attr_sess_password.attr)
2243                 param = ISCSI_PARAM_USERNAME;
2244         else if (attr == &dev_attr_sess_password_in.attr)
2245                 param = ISCSI_PARAM_USERNAME_IN;
2246         else if (attr == &dev_attr_sess_username.attr)
2247                 param = ISCSI_PARAM_PASSWORD;
2248         else if (attr == &dev_attr_sess_username_in.attr)
2249                 param = ISCSI_PARAM_PASSWORD_IN;
2250         else if (attr == &dev_attr_sess_fast_abort.attr)
2251                 param = ISCSI_PARAM_FAST_ABORT;
2252         else if (attr == &dev_attr_sess_abort_tmo.attr)
2253                 param = ISCSI_PARAM_ABORT_TMO;
2254         else if (attr == &dev_attr_sess_lu_reset_tmo.attr)
2255                 param = ISCSI_PARAM_LU_RESET_TMO;
2256         else if (attr == &dev_attr_sess_tgt_reset_tmo.attr)
2257                 param = ISCSI_PARAM_TGT_RESET_TMO;
2258         else if (attr == &dev_attr_sess_ifacename.attr)
2259                 param = ISCSI_PARAM_IFACE_NAME;
2260         else if (attr == &dev_attr_sess_initiatorname.attr)
2261                 param = ISCSI_PARAM_INITIATOR_NAME;
2262         else if (attr == &dev_attr_sess_targetalias.attr)
2263                 param = ISCSI_PARAM_TARGET_ALIAS;
2264         else if (attr == &dev_attr_priv_sess_recovery_tmo.attr)
2265                 return S_IRUGO | S_IWUSR;
2266         else if (attr == &dev_attr_priv_sess_state.attr)
2267                 return S_IRUGO;
2268         else {
2269                 WARN_ONCE(1, "Invalid session attr");
2270                 return 0;
2271         }
2272
2273         return t->attr_is_visible(ISCSI_PARAM, param);
2274 }
2275
2276 static struct attribute_group iscsi_session_group = {
2277         .attrs = iscsi_session_attrs,
2278         .is_visible = iscsi_session_attr_is_visible,
2279 };
2280
2281 /*
2282  * iSCSI host attrs
2283  */
2284 #define iscsi_host_attr_show(param)                                     \
2285 static ssize_t                                                          \
2286 show_host_param_##param(struct device *dev,                             \
2287                         struct device_attribute *attr, char *buf)       \
2288 {                                                                       \
2289         struct Scsi_Host *shost = transport_class_to_shost(dev);        \
2290         struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
2291         return priv->iscsi_transport->get_host_param(shost, param, buf); \
2292 }
2293
2294 #define iscsi_host_attr(field, param)                                   \
2295         iscsi_host_attr_show(param)                                     \
2296 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param,  \
2297                         NULL);
2298
2299 iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME);
2300 iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
2301 iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
2302 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
2303
2304 #define SETUP_HOST_RD_ATTR(field, param_flag)                           \
2305 do {                                                                    \
2306         if (tt->host_param_mask & param_flag) {                         \
2307                 priv->host_attrs[count] = &dev_attr_host_##field; \
2308                 count++;                                                \
2309         }                                                               \
2310 } while (0)
2311
2312 static int iscsi_session_match(struct attribute_container *cont,
2313                            struct device *dev)
2314 {
2315         struct iscsi_cls_session *session;
2316         struct Scsi_Host *shost;
2317         struct iscsi_internal *priv;
2318
2319         if (!iscsi_is_session_dev(dev))
2320                 return 0;
2321
2322         session = iscsi_dev_to_session(dev);
2323         shost = iscsi_session_to_shost(session);
2324         if (!shost->transportt)
2325                 return 0;
2326
2327         priv = to_iscsi_internal(shost->transportt);
2328         if (priv->session_cont.ac.class != &iscsi_session_class.class)
2329                 return 0;
2330
2331         return &priv->session_cont.ac == cont;
2332 }
2333
2334 static int iscsi_conn_match(struct attribute_container *cont,
2335                            struct device *dev)
2336 {
2337         struct iscsi_cls_session *session;
2338         struct iscsi_cls_conn *conn;
2339         struct Scsi_Host *shost;
2340         struct iscsi_internal *priv;
2341
2342         if (!iscsi_is_conn_dev(dev))
2343                 return 0;
2344
2345         conn = iscsi_dev_to_conn(dev);
2346         session = iscsi_dev_to_session(conn->dev.parent);
2347         shost = iscsi_session_to_shost(session);
2348
2349         if (!shost->transportt)
2350                 return 0;
2351
2352         priv = to_iscsi_internal(shost->transportt);
2353         if (priv->conn_cont.ac.class != &iscsi_connection_class.class)
2354                 return 0;
2355
2356         return &priv->conn_cont.ac == cont;
2357 }
2358
2359 static int iscsi_host_match(struct attribute_container *cont,
2360                             struct device *dev)
2361 {
2362         struct Scsi_Host *shost;
2363         struct iscsi_internal *priv;
2364
2365         if (!scsi_is_host_device(dev))
2366                 return 0;
2367
2368         shost = dev_to_shost(dev);
2369         if (!shost->transportt  ||
2370             shost->transportt->host_attrs.ac.class != &iscsi_host_class.class)
2371                 return 0;
2372
2373         priv = to_iscsi_internal(shost->transportt);
2374         return &priv->t.host_attrs.ac == cont;
2375 }
2376
2377 struct scsi_transport_template *
2378 iscsi_register_transport(struct iscsi_transport *tt)
2379 {
2380         struct iscsi_internal *priv;
2381         unsigned long flags;
2382         int count = 0, err;
2383
2384         BUG_ON(!tt);
2385
2386         priv = iscsi_if_transport_lookup(tt);
2387         if (priv)
2388                 return NULL;
2389
2390         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
2391         if (!priv)
2392                 return NULL;
2393         INIT_LIST_HEAD(&priv->list);
2394         priv->iscsi_transport = tt;
2395         priv->t.user_scan = iscsi_user_scan;
2396         priv->t.create_work_queue = 1;
2397
2398         priv->dev.class = &iscsi_transport_class;
2399         dev_set_name(&priv->dev, "%s", tt->name);
2400         err = device_register(&priv->dev);
2401         if (err)
2402                 goto free_priv;
2403
2404         err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
2405         if (err)
2406                 goto unregister_dev;
2407
2408         /* host parameters */
2409         priv->t.host_attrs.ac.attrs = &priv->host_attrs[0];
2410         priv->t.host_attrs.ac.class = &iscsi_host_class.class;
2411         priv->t.host_attrs.ac.match = iscsi_host_match;
2412         priv->t.host_size = sizeof(struct iscsi_cls_host);
2413         transport_container_register(&priv->t.host_attrs);
2414
2415         SETUP_HOST_RD_ATTR(netdev, ISCSI_HOST_NETDEV_NAME);
2416         SETUP_HOST_RD_ATTR(ipaddress, ISCSI_HOST_IPADDRESS);
2417         SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS);
2418         SETUP_HOST_RD_ATTR(initiatorname, ISCSI_HOST_INITIATOR_NAME);
2419         BUG_ON(count > ISCSI_HOST_ATTRS);
2420         priv->host_attrs[count] = NULL;
2421         count = 0;
2422
2423         /* connection parameters */
2424         priv->conn_cont.ac.class = &iscsi_connection_class.class;
2425         priv->conn_cont.ac.match = iscsi_conn_match;
2426         priv->conn_cont.ac.grp = &iscsi_conn_group;
2427         transport_container_register(&priv->conn_cont);
2428
2429         /* session parameters */
2430         priv->session_cont.ac.class = &iscsi_session_class.class;
2431         priv->session_cont.ac.match = iscsi_session_match;
2432         priv->session_cont.ac.grp = &iscsi_session_group;
2433         transport_container_register(&priv->session_cont);
2434
2435         spin_lock_irqsave(&iscsi_transport_lock, flags);
2436         list_add(&priv->list, &iscsi_transports);
2437         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
2438
2439         printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name);
2440         return &priv->t;
2441
2442 unregister_dev:
2443         device_unregister(&priv->dev);
2444         return NULL;
2445 free_priv:
2446         kfree(priv);
2447         return NULL;
2448 }
2449 EXPORT_SYMBOL_GPL(iscsi_register_transport);
2450
2451 int iscsi_unregister_transport(struct iscsi_transport *tt)
2452 {
2453         struct iscsi_internal *priv;
2454         unsigned long flags;
2455
2456         BUG_ON(!tt);
2457
2458         mutex_lock(&rx_queue_mutex);
2459
2460         priv = iscsi_if_transport_lookup(tt);
2461         BUG_ON (!priv);
2462
2463         spin_lock_irqsave(&iscsi_transport_lock, flags);
2464         list_del(&priv->list);
2465         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
2466
2467         transport_container_unregister(&priv->conn_cont);
2468         transport_container_unregister(&priv->session_cont);
2469         transport_container_unregister(&priv->t.host_attrs);
2470
2471         sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group);
2472         device_unregister(&priv->dev);
2473         mutex_unlock(&rx_queue_mutex);
2474
2475         return 0;
2476 }
2477 EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
2478
2479 static __init int iscsi_transport_init(void)
2480 {
2481         int err;
2482
2483         printk(KERN_INFO "Loading iSCSI transport class v%s.\n",
2484                 ISCSI_TRANSPORT_VERSION);
2485
2486         atomic_set(&iscsi_session_nr, 0);
2487
2488         err = class_register(&iscsi_transport_class);
2489         if (err)
2490                 return err;
2491
2492         err = class_register(&iscsi_endpoint_class);
2493         if (err)
2494                 goto unregister_transport_class;
2495
2496         err = class_register(&iscsi_iface_class);
2497         if (err)
2498                 goto unregister_endpoint_class;
2499
2500         err = transport_class_register(&iscsi_host_class);
2501         if (err)
2502                 goto unregister_iface_class;
2503
2504         err = transport_class_register(&iscsi_connection_class);
2505         if (err)
2506                 goto unregister_host_class;
2507
2508         err = transport_class_register(&iscsi_session_class);
2509         if (err)
2510                 goto unregister_conn_class;
2511
2512         nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, 1, iscsi_if_rx,
2513                                     NULL, THIS_MODULE);
2514         if (!nls) {
2515                 err = -ENOBUFS;
2516                 goto unregister_session_class;
2517         }
2518
2519         iscsi_eh_timer_workq = create_singlethread_workqueue("iscsi_eh");
2520         if (!iscsi_eh_timer_workq)
2521                 goto release_nls;
2522
2523         return 0;
2524
2525 release_nls:
2526         netlink_kernel_release(nls);
2527 unregister_session_class:
2528         transport_class_unregister(&iscsi_session_class);
2529 unregister_conn_class:
2530         transport_class_unregister(&iscsi_connection_class);
2531 unregister_host_class:
2532         transport_class_unregister(&iscsi_host_class);
2533 unregister_iface_class:
2534         class_unregister(&iscsi_iface_class);
2535 unregister_endpoint_class:
2536         class_unregister(&iscsi_endpoint_class);
2537 unregister_transport_class:
2538         class_unregister(&iscsi_transport_class);
2539         return err;
2540 }
2541
2542 static void __exit iscsi_transport_exit(void)
2543 {
2544         destroy_workqueue(iscsi_eh_timer_workq);
2545         netlink_kernel_release(nls);
2546         transport_class_unregister(&iscsi_connection_class);
2547         transport_class_unregister(&iscsi_session_class);
2548         transport_class_unregister(&iscsi_host_class);
2549         class_unregister(&iscsi_endpoint_class);
2550         class_unregister(&iscsi_iface_class);
2551         class_unregister(&iscsi_transport_class);
2552 }
2553
2554 module_init(iscsi_transport_init);
2555 module_exit(iscsi_transport_exit);
2556
2557 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
2558               "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
2559               "Alex Aizman <itn780@yahoo.com>");
2560 MODULE_DESCRIPTION("iSCSI Transport Interface");
2561 MODULE_LICENSE("GPL");
2562 MODULE_VERSION(ISCSI_TRANSPORT_VERSION);
2563 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_ISCSI);