Merge branch 'topic/soundcore-preclaim' into for-linus
[pandora-kernel.git] / drivers / scsi / scsi_transport_iscsi.c
1 /*
2  * iSCSI transport class definitions
3  *
4  * Copyright (C) IBM Corporation, 2004
5  * Copyright (C) Mike Christie, 2004 - 2005
6  * Copyright (C) Dmitry Yusupov, 2004 - 2005
7  * Copyright (C) Alex Aizman, 2004 - 2005
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22  */
23 #include <linux/module.h>
24 #include <linux/mutex.h>
25 #include <net/tcp.h>
26 #include <scsi/scsi.h>
27 #include <scsi/scsi_host.h>
28 #include <scsi/scsi_device.h>
29 #include <scsi/scsi_transport.h>
30 #include <scsi/scsi_transport_iscsi.h>
31 #include <scsi/iscsi_if.h>
32
33 #define ISCSI_SESSION_ATTRS 21
34 #define ISCSI_CONN_ATTRS 13
35 #define ISCSI_HOST_ATTRS 4
36
37 #define ISCSI_TRANSPORT_VERSION "2.0-870"
38
39 struct iscsi_internal {
40         struct scsi_transport_template t;
41         struct iscsi_transport *iscsi_transport;
42         struct list_head list;
43         struct device dev;
44
45         struct device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
46         struct transport_container conn_cont;
47         struct device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1];
48         struct transport_container session_cont;
49         struct device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1];
50 };
51
52 static atomic_t iscsi_session_nr; /* sysfs session id for next new session */
53 static struct workqueue_struct *iscsi_eh_timer_workq;
54
55 /*
56  * list of registered transports and lock that must
57  * be held while accessing list. The iscsi_transport_lock must
58  * be acquired after the rx_queue_mutex.
59  */
60 static LIST_HEAD(iscsi_transports);
61 static DEFINE_SPINLOCK(iscsi_transport_lock);
62
63 #define to_iscsi_internal(tmpl) \
64         container_of(tmpl, struct iscsi_internal, t)
65
66 #define dev_to_iscsi_internal(_dev) \
67         container_of(_dev, struct iscsi_internal, dev)
68
69 static void iscsi_transport_release(struct device *dev)
70 {
71         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
72         kfree(priv);
73 }
74
75 /*
76  * iscsi_transport_class represents the iscsi_transports that are
77  * registered.
78  */
79 static struct class iscsi_transport_class = {
80         .name = "iscsi_transport",
81         .dev_release = iscsi_transport_release,
82 };
83
84 static ssize_t
85 show_transport_handle(struct device *dev, struct device_attribute *attr,
86                       char *buf)
87 {
88         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);
89         return sprintf(buf, "%llu\n", (unsigned long long)iscsi_handle(priv->iscsi_transport));
90 }
91 static DEVICE_ATTR(handle, S_IRUGO, show_transport_handle, NULL);
92
93 #define show_transport_attr(name, format)                               \
94 static ssize_t                                                          \
95 show_transport_##name(struct device *dev,                               \
96                       struct device_attribute *attr,char *buf)          \
97 {                                                                       \
98         struct iscsi_internal *priv = dev_to_iscsi_internal(dev);       \
99         return sprintf(buf, format"\n", priv->iscsi_transport->name);   \
100 }                                                                       \
101 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
102
103 show_transport_attr(caps, "0x%x");
104
105 static struct attribute *iscsi_transport_attrs[] = {
106         &dev_attr_handle.attr,
107         &dev_attr_caps.attr,
108         NULL,
109 };
110
111 static struct attribute_group iscsi_transport_group = {
112         .attrs = iscsi_transport_attrs,
113 };
114
115 /*
116  * iSCSI endpoint attrs
117  */
118 #define iscsi_dev_to_endpoint(_dev) \
119         container_of(_dev, struct iscsi_endpoint, dev)
120
121 #define ISCSI_ATTR(_prefix,_name,_mode,_show,_store)    \
122 struct device_attribute dev_attr_##_prefix##_##_name =  \
123         __ATTR(_name,_mode,_show,_store)
124
125 static void iscsi_endpoint_release(struct device *dev)
126 {
127         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
128         kfree(ep);
129 }
130
131 static struct class iscsi_endpoint_class = {
132         .name = "iscsi_endpoint",
133         .dev_release = iscsi_endpoint_release,
134 };
135
136 static ssize_t
137 show_ep_handle(struct device *dev, struct device_attribute *attr, char *buf)
138 {
139         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
140         return sprintf(buf, "%llu\n", (unsigned long long) ep->id);
141 }
142 static ISCSI_ATTR(ep, handle, S_IRUGO, show_ep_handle, NULL);
143
144 static struct attribute *iscsi_endpoint_attrs[] = {
145         &dev_attr_ep_handle.attr,
146         NULL,
147 };
148
149 static struct attribute_group iscsi_endpoint_group = {
150         .attrs = iscsi_endpoint_attrs,
151 };
152
153 #define ISCSI_MAX_EPID -1
154
155 static int iscsi_match_epid(struct device *dev, void *data)
156 {
157         struct iscsi_endpoint *ep = iscsi_dev_to_endpoint(dev);
158         uint64_t *epid = (uint64_t *) data;
159
160         return *epid == ep->id;
161 }
162
163 struct iscsi_endpoint *
164 iscsi_create_endpoint(int dd_size)
165 {
166         struct device *dev;
167         struct iscsi_endpoint *ep;
168         uint64_t id;
169         int err;
170
171         for (id = 1; id < ISCSI_MAX_EPID; id++) {
172                 dev = class_find_device(&iscsi_endpoint_class, NULL, &id,
173                                         iscsi_match_epid);
174                 if (!dev)
175                         break;
176         }
177         if (id == ISCSI_MAX_EPID) {
178                 printk(KERN_ERR "Too many connections. Max supported %u\n",
179                        ISCSI_MAX_EPID - 1);
180                 return NULL;
181         }
182
183         ep = kzalloc(sizeof(*ep) + dd_size, GFP_KERNEL);
184         if (!ep)
185                 return NULL;
186
187         ep->id = id;
188         ep->dev.class = &iscsi_endpoint_class;
189         dev_set_name(&ep->dev, "ep-%llu", (unsigned long long) id);
190         err = device_register(&ep->dev);
191         if (err)
192                 goto free_ep;
193
194         err = sysfs_create_group(&ep->dev.kobj, &iscsi_endpoint_group);
195         if (err)
196                 goto unregister_dev;
197
198         if (dd_size)
199                 ep->dd_data = &ep[1];
200         return ep;
201
202 unregister_dev:
203         device_unregister(&ep->dev);
204         return NULL;
205
206 free_ep:
207         kfree(ep);
208         return NULL;
209 }
210 EXPORT_SYMBOL_GPL(iscsi_create_endpoint);
211
212 void iscsi_destroy_endpoint(struct iscsi_endpoint *ep)
213 {
214         sysfs_remove_group(&ep->dev.kobj, &iscsi_endpoint_group);
215         device_unregister(&ep->dev);
216 }
217 EXPORT_SYMBOL_GPL(iscsi_destroy_endpoint);
218
219 struct iscsi_endpoint *iscsi_lookup_endpoint(u64 handle)
220 {
221         struct iscsi_endpoint *ep;
222         struct device *dev;
223
224         dev = class_find_device(&iscsi_endpoint_class, NULL, &handle,
225                                 iscsi_match_epid);
226         if (!dev)
227                 return NULL;
228
229         ep = iscsi_dev_to_endpoint(dev);
230         /*
231          * we can drop this now because the interface will prevent
232          * removals and lookups from racing.
233          */
234         put_device(dev);
235         return ep;
236 }
237 EXPORT_SYMBOL_GPL(iscsi_lookup_endpoint);
238
239 static int iscsi_setup_host(struct transport_container *tc, struct device *dev,
240                             struct device *cdev)
241 {
242         struct Scsi_Host *shost = dev_to_shost(dev);
243         struct iscsi_cls_host *ihost = shost->shost_data;
244
245         memset(ihost, 0, sizeof(*ihost));
246         atomic_set(&ihost->nr_scans, 0);
247         mutex_init(&ihost->mutex);
248         return 0;
249 }
250
251 static DECLARE_TRANSPORT_CLASS(iscsi_host_class,
252                                "iscsi_host",
253                                iscsi_setup_host,
254                                NULL,
255                                NULL);
256
257 static DECLARE_TRANSPORT_CLASS(iscsi_session_class,
258                                "iscsi_session",
259                                NULL,
260                                NULL,
261                                NULL);
262
263 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class,
264                                "iscsi_connection",
265                                NULL,
266                                NULL,
267                                NULL);
268
269 static struct sock *nls;
270 static DEFINE_MUTEX(rx_queue_mutex);
271
272 static LIST_HEAD(sesslist);
273 static DEFINE_SPINLOCK(sesslock);
274 static LIST_HEAD(connlist);
275 static DEFINE_SPINLOCK(connlock);
276
277 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
278 {
279         struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
280         return sess->sid;
281 }
282
283 /*
284  * Returns the matching session to a given sid
285  */
286 static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
287 {
288         unsigned long flags;
289         struct iscsi_cls_session *sess;
290
291         spin_lock_irqsave(&sesslock, flags);
292         list_for_each_entry(sess, &sesslist, sess_list) {
293                 if (sess->sid == sid) {
294                         spin_unlock_irqrestore(&sesslock, flags);
295                         return sess;
296                 }
297         }
298         spin_unlock_irqrestore(&sesslock, flags);
299         return NULL;
300 }
301
302 /*
303  * Returns the matching connection to a given sid / cid tuple
304  */
305 static struct iscsi_cls_conn *iscsi_conn_lookup(uint32_t sid, uint32_t cid)
306 {
307         unsigned long flags;
308         struct iscsi_cls_conn *conn;
309
310         spin_lock_irqsave(&connlock, flags);
311         list_for_each_entry(conn, &connlist, conn_list) {
312                 if ((conn->cid == cid) && (iscsi_conn_get_sid(conn) == sid)) {
313                         spin_unlock_irqrestore(&connlock, flags);
314                         return conn;
315                 }
316         }
317         spin_unlock_irqrestore(&connlock, flags);
318         return NULL;
319 }
320
321 /*
322  * The following functions can be used by LLDs that allocate
323  * their own scsi_hosts or by software iscsi LLDs
324  */
325 static struct {
326         int value;
327         char *name;
328 } iscsi_session_state_names[] = {
329         { ISCSI_SESSION_LOGGED_IN,      "LOGGED_IN" },
330         { ISCSI_SESSION_FAILED,         "FAILED" },
331         { ISCSI_SESSION_FREE,           "FREE" },
332 };
333
334 static const char *iscsi_session_state_name(int state)
335 {
336         int i;
337         char *name = NULL;
338
339         for (i = 0; i < ARRAY_SIZE(iscsi_session_state_names); i++) {
340                 if (iscsi_session_state_names[i].value == state) {
341                         name = iscsi_session_state_names[i].name;
342                         break;
343                 }
344         }
345         return name;
346 }
347
348 int iscsi_session_chkready(struct iscsi_cls_session *session)
349 {
350         unsigned long flags;
351         int err;
352
353         spin_lock_irqsave(&session->lock, flags);
354         switch (session->state) {
355         case ISCSI_SESSION_LOGGED_IN:
356                 err = 0;
357                 break;
358         case ISCSI_SESSION_FAILED:
359                 err = DID_IMM_RETRY << 16;
360                 break;
361         case ISCSI_SESSION_FREE:
362                 err = DID_TRANSPORT_FAILFAST << 16;
363                 break;
364         default:
365                 err = DID_NO_CONNECT << 16;
366                 break;
367         }
368         spin_unlock_irqrestore(&session->lock, flags);
369         return err;
370 }
371 EXPORT_SYMBOL_GPL(iscsi_session_chkready);
372
373 static void iscsi_session_release(struct device *dev)
374 {
375         struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
376         struct Scsi_Host *shost;
377
378         shost = iscsi_session_to_shost(session);
379         scsi_host_put(shost);
380         kfree(session);
381 }
382
383 static int iscsi_is_session_dev(const struct device *dev)
384 {
385         return dev->release == iscsi_session_release;
386 }
387
388 static int iscsi_iter_session_fn(struct device *dev, void *data)
389 {
390         void (* fn) (struct iscsi_cls_session *) = data;
391
392         if (!iscsi_is_session_dev(dev))
393                 return 0;
394         fn(iscsi_dev_to_session(dev));
395         return 0;
396 }
397
398 void iscsi_host_for_each_session(struct Scsi_Host *shost,
399                                  void (*fn)(struct iscsi_cls_session *))
400 {
401         device_for_each_child(&shost->shost_gendev, fn,
402                               iscsi_iter_session_fn);
403 }
404 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session);
405
406 /**
407  * iscsi_scan_finished - helper to report when running scans are done
408  * @shost: scsi host
409  * @time: scan run time
410  *
411  * This function can be used by drives like qla4xxx to report to the scsi
412  * layer when the scans it kicked off at module load time are done.
413  */
414 int iscsi_scan_finished(struct Scsi_Host *shost, unsigned long time)
415 {
416         struct iscsi_cls_host *ihost = shost->shost_data;
417         /*
418          * qla4xxx will have kicked off some session unblocks before calling
419          * scsi_scan_host, so just wait for them to complete.
420          */
421         return !atomic_read(&ihost->nr_scans);
422 }
423 EXPORT_SYMBOL_GPL(iscsi_scan_finished);
424
425 struct iscsi_scan_data {
426         unsigned int channel;
427         unsigned int id;
428         unsigned int lun;
429 };
430
431 static int iscsi_user_scan_session(struct device *dev, void *data)
432 {
433         struct iscsi_scan_data *scan_data = data;
434         struct iscsi_cls_session *session;
435         struct Scsi_Host *shost;
436         struct iscsi_cls_host *ihost;
437         unsigned long flags;
438         unsigned int id;
439
440         if (!iscsi_is_session_dev(dev))
441                 return 0;
442
443         session = iscsi_dev_to_session(dev);
444         shost = iscsi_session_to_shost(session);
445         ihost = shost->shost_data;
446
447         mutex_lock(&ihost->mutex);
448         spin_lock_irqsave(&session->lock, flags);
449         if (session->state != ISCSI_SESSION_LOGGED_IN) {
450                 spin_unlock_irqrestore(&session->lock, flags);
451                 mutex_unlock(&ihost->mutex);
452                 return 0;
453         }
454         id = session->target_id;
455         spin_unlock_irqrestore(&session->lock, flags);
456
457         if (id != ISCSI_MAX_TARGET) {
458                 if ((scan_data->channel == SCAN_WILD_CARD ||
459                      scan_data->channel == 0) &&
460                     (scan_data->id == SCAN_WILD_CARD ||
461                      scan_data->id == id))
462                         scsi_scan_target(&session->dev, 0, id,
463                                          scan_data->lun, 1);
464         }
465         mutex_unlock(&ihost->mutex);
466         return 0;
467 }
468
469 static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
470                            uint id, uint lun)
471 {
472         struct iscsi_scan_data scan_data;
473
474         scan_data.channel = channel;
475         scan_data.id = id;
476         scan_data.lun = lun;
477
478         return device_for_each_child(&shost->shost_gendev, &scan_data,
479                                      iscsi_user_scan_session);
480 }
481
482 static void iscsi_scan_session(struct work_struct *work)
483 {
484         struct iscsi_cls_session *session =
485                         container_of(work, struct iscsi_cls_session, scan_work);
486         struct Scsi_Host *shost = iscsi_session_to_shost(session);
487         struct iscsi_cls_host *ihost = shost->shost_data;
488         struct iscsi_scan_data scan_data;
489
490         scan_data.channel = 0;
491         scan_data.id = SCAN_WILD_CARD;
492         scan_data.lun = SCAN_WILD_CARD;
493
494         iscsi_user_scan_session(&session->dev, &scan_data);
495         atomic_dec(&ihost->nr_scans);
496 }
497
498 static void session_recovery_timedout(struct work_struct *work)
499 {
500         struct iscsi_cls_session *session =
501                 container_of(work, struct iscsi_cls_session,
502                              recovery_work.work);
503         unsigned long flags;
504
505         iscsi_cls_session_printk(KERN_INFO, session,
506                                  "session recovery timed out after %d secs\n",
507                                  session->recovery_tmo);
508
509         spin_lock_irqsave(&session->lock, flags);
510         switch (session->state) {
511         case ISCSI_SESSION_FAILED:
512                 session->state = ISCSI_SESSION_FREE;
513                 break;
514         case ISCSI_SESSION_LOGGED_IN:
515         case ISCSI_SESSION_FREE:
516                 /* we raced with the unblock's flush */
517                 spin_unlock_irqrestore(&session->lock, flags);
518                 return;
519         }
520         spin_unlock_irqrestore(&session->lock, flags);
521
522         if (session->transport->session_recovery_timedout)
523                 session->transport->session_recovery_timedout(session);
524
525         scsi_target_unblock(&session->dev);
526 }
527
528 static void __iscsi_unblock_session(struct work_struct *work)
529 {
530         struct iscsi_cls_session *session =
531                         container_of(work, struct iscsi_cls_session,
532                                      unblock_work);
533         struct Scsi_Host *shost = iscsi_session_to_shost(session);
534         struct iscsi_cls_host *ihost = shost->shost_data;
535         unsigned long flags;
536
537         /*
538          * The recovery and unblock work get run from the same workqueue,
539          * so try to cancel it if it was going to run after this unblock.
540          */
541         cancel_delayed_work(&session->recovery_work);
542         spin_lock_irqsave(&session->lock, flags);
543         session->state = ISCSI_SESSION_LOGGED_IN;
544         spin_unlock_irqrestore(&session->lock, flags);
545         /* start IO */
546         scsi_target_unblock(&session->dev);
547         /*
548          * Only do kernel scanning if the driver is properly hooked into
549          * the async scanning code (drivers like iscsi_tcp do login and
550          * scanning from userspace).
551          */
552         if (shost->hostt->scan_finished) {
553                 if (scsi_queue_work(shost, &session->scan_work))
554                         atomic_inc(&ihost->nr_scans);
555         }
556 }
557
558 /**
559  * iscsi_unblock_session - set a session as logged in and start IO.
560  * @session: iscsi session
561  *
562  * Mark a session as ready to accept IO.
563  */
564 void iscsi_unblock_session(struct iscsi_cls_session *session)
565 {
566         queue_work(iscsi_eh_timer_workq, &session->unblock_work);
567         /*
568          * make sure all the events have completed before tell the driver
569          * it is safe
570          */
571         flush_workqueue(iscsi_eh_timer_workq);
572 }
573 EXPORT_SYMBOL_GPL(iscsi_unblock_session);
574
575 static void __iscsi_block_session(struct work_struct *work)
576 {
577         struct iscsi_cls_session *session =
578                         container_of(work, struct iscsi_cls_session,
579                                      block_work);
580         unsigned long flags;
581
582         spin_lock_irqsave(&session->lock, flags);
583         session->state = ISCSI_SESSION_FAILED;
584         spin_unlock_irqrestore(&session->lock, flags);
585         scsi_target_block(&session->dev);
586         queue_delayed_work(iscsi_eh_timer_workq, &session->recovery_work,
587                            session->recovery_tmo * HZ);
588 }
589
590 void iscsi_block_session(struct iscsi_cls_session *session)
591 {
592         queue_work(iscsi_eh_timer_workq, &session->block_work);
593 }
594 EXPORT_SYMBOL_GPL(iscsi_block_session);
595
596 static void __iscsi_unbind_session(struct work_struct *work)
597 {
598         struct iscsi_cls_session *session =
599                         container_of(work, struct iscsi_cls_session,
600                                      unbind_work);
601         struct Scsi_Host *shost = iscsi_session_to_shost(session);
602         struct iscsi_cls_host *ihost = shost->shost_data;
603         unsigned long flags;
604
605         /* Prevent new scans and make sure scanning is not in progress */
606         mutex_lock(&ihost->mutex);
607         spin_lock_irqsave(&session->lock, flags);
608         if (session->target_id == ISCSI_MAX_TARGET) {
609                 spin_unlock_irqrestore(&session->lock, flags);
610                 mutex_unlock(&ihost->mutex);
611                 return;
612         }
613         session->target_id = ISCSI_MAX_TARGET;
614         spin_unlock_irqrestore(&session->lock, flags);
615         mutex_unlock(&ihost->mutex);
616
617         scsi_remove_target(&session->dev);
618         iscsi_session_event(session, ISCSI_KEVENT_UNBIND_SESSION);
619 }
620
621 struct iscsi_cls_session *
622 iscsi_alloc_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
623                     int dd_size)
624 {
625         struct iscsi_cls_session *session;
626
627         session = kzalloc(sizeof(*session) + dd_size,
628                           GFP_KERNEL);
629         if (!session)
630                 return NULL;
631
632         session->transport = transport;
633         session->recovery_tmo = 120;
634         session->state = ISCSI_SESSION_FREE;
635         INIT_DELAYED_WORK(&session->recovery_work, session_recovery_timedout);
636         INIT_LIST_HEAD(&session->sess_list);
637         INIT_WORK(&session->unblock_work, __iscsi_unblock_session);
638         INIT_WORK(&session->block_work, __iscsi_block_session);
639         INIT_WORK(&session->unbind_work, __iscsi_unbind_session);
640         INIT_WORK(&session->scan_work, iscsi_scan_session);
641         spin_lock_init(&session->lock);
642
643         /* this is released in the dev's release function */
644         scsi_host_get(shost);
645         session->dev.parent = &shost->shost_gendev;
646         session->dev.release = iscsi_session_release;
647         device_initialize(&session->dev);
648         if (dd_size)
649                 session->dd_data = &session[1];
650         return session;
651 }
652 EXPORT_SYMBOL_GPL(iscsi_alloc_session);
653
654 static int iscsi_get_next_target_id(struct device *dev, void *data)
655 {
656         struct iscsi_cls_session *session;
657         unsigned long flags;
658         int err = 0;
659
660         if (!iscsi_is_session_dev(dev))
661                 return 0;
662
663         session = iscsi_dev_to_session(dev);
664         spin_lock_irqsave(&session->lock, flags);
665         if (*((unsigned int *) data) == session->target_id)
666                 err = -EEXIST;
667         spin_unlock_irqrestore(&session->lock, flags);
668         return err;
669 }
670
671 int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
672 {
673         struct Scsi_Host *shost = iscsi_session_to_shost(session);
674         struct iscsi_cls_host *ihost;
675         unsigned long flags;
676         unsigned int id = target_id;
677         int err;
678
679         ihost = shost->shost_data;
680         session->sid = atomic_add_return(1, &iscsi_session_nr);
681
682         if (id == ISCSI_MAX_TARGET) {
683                 for (id = 0; id < ISCSI_MAX_TARGET; id++) {
684                         err = device_for_each_child(&shost->shost_gendev, &id,
685                                                     iscsi_get_next_target_id);
686                         if (!err)
687                                 break;
688                 }
689
690                 if (id == ISCSI_MAX_TARGET) {
691                         iscsi_cls_session_printk(KERN_ERR, session,
692                                                  "Too many iscsi targets. Max "
693                                                  "number of targets is %d.\n",
694                                                  ISCSI_MAX_TARGET - 1);
695                         err = -EOVERFLOW;
696                         goto release_host;
697                 }
698         }
699         session->target_id = id;
700
701         dev_set_name(&session->dev, "session%u", session->sid);
702         err = device_add(&session->dev);
703         if (err) {
704                 iscsi_cls_session_printk(KERN_ERR, session,
705                                          "could not register session's dev\n");
706                 goto release_host;
707         }
708         transport_register_device(&session->dev);
709
710         spin_lock_irqsave(&sesslock, flags);
711         list_add(&session->sess_list, &sesslist);
712         spin_unlock_irqrestore(&sesslock, flags);
713
714         iscsi_session_event(session, ISCSI_KEVENT_CREATE_SESSION);
715         return 0;
716
717 release_host:
718         scsi_host_put(shost);
719         return err;
720 }
721 EXPORT_SYMBOL_GPL(iscsi_add_session);
722
723 /**
724  * iscsi_create_session - create iscsi class session
725  * @shost: scsi host
726  * @transport: iscsi transport
727  * @dd_size: private driver data size
728  * @target_id: which target
729  *
730  * This can be called from a LLD or iscsi_transport.
731  */
732 struct iscsi_cls_session *
733 iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport,
734                      int dd_size, unsigned int target_id)
735 {
736         struct iscsi_cls_session *session;
737
738         session = iscsi_alloc_session(shost, transport, dd_size);
739         if (!session)
740                 return NULL;
741
742         if (iscsi_add_session(session, target_id)) {
743                 iscsi_free_session(session);
744                 return NULL;
745         }
746         return session;
747 }
748 EXPORT_SYMBOL_GPL(iscsi_create_session);
749
750 static void iscsi_conn_release(struct device *dev)
751 {
752         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev);
753         struct device *parent = conn->dev.parent;
754
755         kfree(conn);
756         put_device(parent);
757 }
758
759 static int iscsi_is_conn_dev(const struct device *dev)
760 {
761         return dev->release == iscsi_conn_release;
762 }
763
764 static int iscsi_iter_destroy_conn_fn(struct device *dev, void *data)
765 {
766         if (!iscsi_is_conn_dev(dev))
767                 return 0;
768         return iscsi_destroy_conn(iscsi_dev_to_conn(dev));
769 }
770
771 void iscsi_remove_session(struct iscsi_cls_session *session)
772 {
773         struct Scsi_Host *shost = iscsi_session_to_shost(session);
774         unsigned long flags;
775         int err;
776
777         spin_lock_irqsave(&sesslock, flags);
778         list_del(&session->sess_list);
779         spin_unlock_irqrestore(&sesslock, flags);
780
781         /* make sure there are no blocks/unblocks queued */
782         flush_workqueue(iscsi_eh_timer_workq);
783         /* make sure the timedout callout is not running */
784         if (!cancel_delayed_work(&session->recovery_work))
785                 flush_workqueue(iscsi_eh_timer_workq);
786         /*
787          * If we are blocked let commands flow again. The lld or iscsi
788          * layer should set up the queuecommand to fail commands.
789          * We assume that LLD will not be calling block/unblock while
790          * removing the session.
791          */
792         spin_lock_irqsave(&session->lock, flags);
793         session->state = ISCSI_SESSION_FREE;
794         spin_unlock_irqrestore(&session->lock, flags);
795
796         scsi_target_unblock(&session->dev);
797         /* flush running scans then delete devices */
798         scsi_flush_work(shost);
799         __iscsi_unbind_session(&session->unbind_work);
800
801         /* hw iscsi may not have removed all connections from session */
802         err = device_for_each_child(&session->dev, NULL,
803                                     iscsi_iter_destroy_conn_fn);
804         if (err)
805                 iscsi_cls_session_printk(KERN_ERR, session,
806                                          "Could not delete all connections "
807                                          "for session. Error %d.\n", err);
808
809         transport_unregister_device(&session->dev);
810         device_del(&session->dev);
811 }
812 EXPORT_SYMBOL_GPL(iscsi_remove_session);
813
814 void iscsi_free_session(struct iscsi_cls_session *session)
815 {
816         iscsi_session_event(session, ISCSI_KEVENT_DESTROY_SESSION);
817         put_device(&session->dev);
818 }
819 EXPORT_SYMBOL_GPL(iscsi_free_session);
820
821 /**
822  * iscsi_destroy_session - destroy iscsi session
823  * @session: iscsi_session
824  *
825  * Can be called by a LLD or iscsi_transport. There must not be
826  * any running connections.
827  */
828 int iscsi_destroy_session(struct iscsi_cls_session *session)
829 {
830         iscsi_remove_session(session);
831         iscsi_free_session(session);
832         return 0;
833 }
834 EXPORT_SYMBOL_GPL(iscsi_destroy_session);
835
836 /**
837  * iscsi_create_conn - create iscsi class connection
838  * @session: iscsi cls session
839  * @dd_size: private driver data size
840  * @cid: connection id
841  *
842  * This can be called from a LLD or iscsi_transport. The connection
843  * is child of the session so cid must be unique for all connections
844  * on the session.
845  *
846  * Since we do not support MCS, cid will normally be zero. In some cases
847  * for software iscsi we could be trying to preallocate a connection struct
848  * in which case there could be two connection structs and cid would be
849  * non-zero.
850  */
851 struct iscsi_cls_conn *
852 iscsi_create_conn(struct iscsi_cls_session *session, int dd_size, uint32_t cid)
853 {
854         struct iscsi_transport *transport = session->transport;
855         struct iscsi_cls_conn *conn;
856         unsigned long flags;
857         int err;
858
859         conn = kzalloc(sizeof(*conn) + dd_size, GFP_KERNEL);
860         if (!conn)
861                 return NULL;
862         if (dd_size)
863                 conn->dd_data = &conn[1];
864
865         INIT_LIST_HEAD(&conn->conn_list);
866         conn->transport = transport;
867         conn->cid = cid;
868
869         /* this is released in the dev's release function */
870         if (!get_device(&session->dev))
871                 goto free_conn;
872
873         dev_set_name(&conn->dev, "connection%d:%u", session->sid, cid);
874         conn->dev.parent = &session->dev;
875         conn->dev.release = iscsi_conn_release;
876         err = device_register(&conn->dev);
877         if (err) {
878                 iscsi_cls_session_printk(KERN_ERR, session, "could not "
879                                          "register connection's dev\n");
880                 goto release_parent_ref;
881         }
882         transport_register_device(&conn->dev);
883
884         spin_lock_irqsave(&connlock, flags);
885         list_add(&conn->conn_list, &connlist);
886         conn->active = 1;
887         spin_unlock_irqrestore(&connlock, flags);
888         return conn;
889
890 release_parent_ref:
891         put_device(&session->dev);
892 free_conn:
893         kfree(conn);
894         return NULL;
895 }
896
897 EXPORT_SYMBOL_GPL(iscsi_create_conn);
898
899 /**
900  * iscsi_destroy_conn - destroy iscsi class connection
901  * @conn: iscsi cls session
902  *
903  * This can be called from a LLD or iscsi_transport.
904  */
905 int iscsi_destroy_conn(struct iscsi_cls_conn *conn)
906 {
907         unsigned long flags;
908
909         spin_lock_irqsave(&connlock, flags);
910         conn->active = 0;
911         list_del(&conn->conn_list);
912         spin_unlock_irqrestore(&connlock, flags);
913
914         transport_unregister_device(&conn->dev);
915         device_unregister(&conn->dev);
916         return 0;
917 }
918 EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
919
920 /*
921  * iscsi interface functions
922  */
923 static struct iscsi_internal *
924 iscsi_if_transport_lookup(struct iscsi_transport *tt)
925 {
926         struct iscsi_internal *priv;
927         unsigned long flags;
928
929         spin_lock_irqsave(&iscsi_transport_lock, flags);
930         list_for_each_entry(priv, &iscsi_transports, list) {
931                 if (tt == priv->iscsi_transport) {
932                         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
933                         return priv;
934                 }
935         }
936         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
937         return NULL;
938 }
939
940 static int
941 iscsi_multicast_skb(struct sk_buff *skb, uint32_t group, gfp_t gfp)
942 {
943         return nlmsg_multicast(nls, skb, 0, group, gfp);
944 }
945
946 int iscsi_recv_pdu(struct iscsi_cls_conn *conn, struct iscsi_hdr *hdr,
947                    char *data, uint32_t data_size)
948 {
949         struct nlmsghdr *nlh;
950         struct sk_buff *skb;
951         struct iscsi_uevent *ev;
952         char *pdu;
953         struct iscsi_internal *priv;
954         int len = NLMSG_SPACE(sizeof(*ev) + sizeof(struct iscsi_hdr) +
955                               data_size);
956
957         priv = iscsi_if_transport_lookup(conn->transport);
958         if (!priv)
959                 return -EINVAL;
960
961         skb = alloc_skb(len, GFP_ATOMIC);
962         if (!skb) {
963                 iscsi_conn_error_event(conn, ISCSI_ERR_CONN_FAILED);
964                 iscsi_cls_conn_printk(KERN_ERR, conn, "can not deliver "
965                                       "control PDU: OOM\n");
966                 return -ENOMEM;
967         }
968
969         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
970         ev = NLMSG_DATA(nlh);
971         memset(ev, 0, sizeof(*ev));
972         ev->transport_handle = iscsi_handle(conn->transport);
973         ev->type = ISCSI_KEVENT_RECV_PDU;
974         ev->r.recv_req.cid = conn->cid;
975         ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
976         pdu = (char*)ev + sizeof(*ev);
977         memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
978         memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
979
980         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
981 }
982 EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
983
984 int iscsi_offload_mesg(struct Scsi_Host *shost,
985                        struct iscsi_transport *transport, uint32_t type,
986                        char *data, uint16_t data_size)
987 {
988         struct nlmsghdr *nlh;
989         struct sk_buff *skb;
990         struct iscsi_uevent *ev;
991         int len = NLMSG_SPACE(sizeof(*ev) + data_size);
992
993         skb = alloc_skb(len, GFP_ATOMIC);
994         if (!skb) {
995                 printk(KERN_ERR "can not deliver iscsi offload message:OOM\n");
996                 return -ENOMEM;
997         }
998
999         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1000         ev = NLMSG_DATA(nlh);
1001         memset(ev, 0, sizeof(*ev));
1002         ev->type = type;
1003         ev->transport_handle = iscsi_handle(transport);
1004         switch (type) {
1005         case ISCSI_KEVENT_PATH_REQ:
1006                 ev->r.req_path.host_no = shost->host_no;
1007                 break;
1008         case ISCSI_KEVENT_IF_DOWN:
1009                 ev->r.notify_if_down.host_no = shost->host_no;
1010                 break;
1011         }
1012
1013         memcpy((char *)ev + sizeof(*ev), data, data_size);
1014
1015         return iscsi_multicast_skb(skb, ISCSI_NL_GRP_UIP, GFP_ATOMIC);
1016 }
1017 EXPORT_SYMBOL_GPL(iscsi_offload_mesg);
1018
1019 void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)
1020 {
1021         struct nlmsghdr *nlh;
1022         struct sk_buff  *skb;
1023         struct iscsi_uevent *ev;
1024         struct iscsi_internal *priv;
1025         int len = NLMSG_SPACE(sizeof(*ev));
1026
1027         priv = iscsi_if_transport_lookup(conn->transport);
1028         if (!priv)
1029                 return;
1030
1031         skb = alloc_skb(len, GFP_ATOMIC);
1032         if (!skb) {
1033                 iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
1034                                       "conn error (%d)\n", error);
1035                 return;
1036         }
1037
1038         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1039         ev = NLMSG_DATA(nlh);
1040         ev->transport_handle = iscsi_handle(conn->transport);
1041         ev->type = ISCSI_KEVENT_CONN_ERROR;
1042         ev->r.connerror.error = error;
1043         ev->r.connerror.cid = conn->cid;
1044         ev->r.connerror.sid = iscsi_conn_get_sid(conn);
1045
1046         iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
1047
1048         iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn error (%d)\n",
1049                               error);
1050 }
1051 EXPORT_SYMBOL_GPL(iscsi_conn_error_event);
1052
1053 static int
1054 iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi,
1055                     void *payload, int size)
1056 {
1057         struct sk_buff  *skb;
1058         struct nlmsghdr *nlh;
1059         int len = NLMSG_SPACE(size);
1060         int flags = multi ? NLM_F_MULTI : 0;
1061         int t = done ? NLMSG_DONE : type;
1062
1063         skb = alloc_skb(len, GFP_ATOMIC);
1064         if (!skb) {
1065                 printk(KERN_ERR "Could not allocate skb to send reply.\n");
1066                 return -ENOMEM;
1067         }
1068
1069         nlh = __nlmsg_put(skb, 0, 0, t, (len - sizeof(*nlh)), 0);
1070         nlh->nlmsg_flags = flags;
1071         memcpy(NLMSG_DATA(nlh), payload, size);
1072         return iscsi_multicast_skb(skb, group, GFP_ATOMIC);
1073 }
1074
1075 static int
1076 iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh)
1077 {
1078         struct iscsi_uevent *ev = NLMSG_DATA(nlh);
1079         struct iscsi_stats *stats;
1080         struct sk_buff *skbstat;
1081         struct iscsi_cls_conn *conn;
1082         struct nlmsghdr *nlhstat;
1083         struct iscsi_uevent *evstat;
1084         struct iscsi_internal *priv;
1085         int len = NLMSG_SPACE(sizeof(*ev) +
1086                               sizeof(struct iscsi_stats) +
1087                               sizeof(struct iscsi_stats_custom) *
1088                               ISCSI_STATS_CUSTOM_MAX);
1089         int err = 0;
1090
1091         priv = iscsi_if_transport_lookup(transport);
1092         if (!priv)
1093                 return -EINVAL;
1094
1095         conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
1096         if (!conn)
1097                 return -EEXIST;
1098
1099         do {
1100                 int actual_size;
1101
1102                 skbstat = alloc_skb(len, GFP_ATOMIC);
1103                 if (!skbstat) {
1104                         iscsi_cls_conn_printk(KERN_ERR, conn, "can not "
1105                                               "deliver stats: OOM\n");
1106                         return -ENOMEM;
1107                 }
1108
1109                 nlhstat = __nlmsg_put(skbstat, 0, 0, 0,
1110                                       (len - sizeof(*nlhstat)), 0);
1111                 evstat = NLMSG_DATA(nlhstat);
1112                 memset(evstat, 0, sizeof(*evstat));
1113                 evstat->transport_handle = iscsi_handle(conn->transport);
1114                 evstat->type = nlh->nlmsg_type;
1115                 evstat->u.get_stats.cid =
1116                         ev->u.get_stats.cid;
1117                 evstat->u.get_stats.sid =
1118                         ev->u.get_stats.sid;
1119                 stats = (struct iscsi_stats *)
1120                         ((char*)evstat + sizeof(*evstat));
1121                 memset(stats, 0, sizeof(*stats));
1122
1123                 transport->get_stats(conn, stats);
1124                 actual_size = NLMSG_SPACE(sizeof(struct iscsi_uevent) +
1125                                           sizeof(struct iscsi_stats) +
1126                                           sizeof(struct iscsi_stats_custom) *
1127                                           stats->custom_length);
1128                 actual_size -= sizeof(*nlhstat);
1129                 actual_size = NLMSG_LENGTH(actual_size);
1130                 skb_trim(skbstat, NLMSG_ALIGN(actual_size));
1131                 nlhstat->nlmsg_len = actual_size;
1132
1133                 err = iscsi_multicast_skb(skbstat, ISCSI_NL_GRP_ISCSID,
1134                                           GFP_ATOMIC);
1135         } while (err < 0 && err != -ECONNREFUSED);
1136
1137         return err;
1138 }
1139
1140 /**
1141  * iscsi_session_event - send session destr. completion event
1142  * @session: iscsi class session
1143  * @event: type of event
1144  */
1145 int iscsi_session_event(struct iscsi_cls_session *session,
1146                         enum iscsi_uevent_e event)
1147 {
1148         struct iscsi_internal *priv;
1149         struct Scsi_Host *shost;
1150         struct iscsi_uevent *ev;
1151         struct sk_buff  *skb;
1152         struct nlmsghdr *nlh;
1153         int rc, len = NLMSG_SPACE(sizeof(*ev));
1154
1155         priv = iscsi_if_transport_lookup(session->transport);
1156         if (!priv)
1157                 return -EINVAL;
1158         shost = iscsi_session_to_shost(session);
1159
1160         skb = alloc_skb(len, GFP_KERNEL);
1161         if (!skb) {
1162                 iscsi_cls_session_printk(KERN_ERR, session,
1163                                          "Cannot notify userspace of session "
1164                                          "event %u\n", event);
1165                 return -ENOMEM;
1166         }
1167
1168         nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
1169         ev = NLMSG_DATA(nlh);
1170         ev->transport_handle = iscsi_handle(session->transport);
1171
1172         ev->type = event;
1173         switch (event) {
1174         case ISCSI_KEVENT_DESTROY_SESSION:
1175                 ev->r.d_session.host_no = shost->host_no;
1176                 ev->r.d_session.sid = session->sid;
1177                 break;
1178         case ISCSI_KEVENT_CREATE_SESSION:
1179                 ev->r.c_session_ret.host_no = shost->host_no;
1180                 ev->r.c_session_ret.sid = session->sid;
1181                 break;
1182         case ISCSI_KEVENT_UNBIND_SESSION:
1183                 ev->r.unbind_session.host_no = shost->host_no;
1184                 ev->r.unbind_session.sid = session->sid;
1185                 break;
1186         default:
1187                 iscsi_cls_session_printk(KERN_ERR, session, "Invalid event "
1188                                          "%u.\n", event);
1189                 kfree_skb(skb);
1190                 return -EINVAL;
1191         }
1192
1193         /*
1194          * this will occur if the daemon is not up, so we just warn
1195          * the user and when the daemon is restarted it will handle it
1196          */
1197         rc = iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_KERNEL);
1198         if (rc == -ESRCH)
1199                 iscsi_cls_session_printk(KERN_ERR, session,
1200                                          "Cannot notify userspace of session "
1201                                          "event %u. Check iscsi daemon\n",
1202                                          event);
1203         return rc;
1204 }
1205 EXPORT_SYMBOL_GPL(iscsi_session_event);
1206
1207 static int
1208 iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_endpoint *ep,
1209                         struct iscsi_uevent *ev, uint32_t initial_cmdsn,
1210                         uint16_t cmds_max, uint16_t queue_depth)
1211 {
1212         struct iscsi_transport *transport = priv->iscsi_transport;
1213         struct iscsi_cls_session *session;
1214         struct Scsi_Host *shost;
1215
1216         session = transport->create_session(ep, cmds_max, queue_depth,
1217                                             initial_cmdsn);
1218         if (!session)
1219                 return -ENOMEM;
1220
1221         shost = iscsi_session_to_shost(session);
1222         ev->r.c_session_ret.host_no = shost->host_no;
1223         ev->r.c_session_ret.sid = session->sid;
1224         return 0;
1225 }
1226
1227 static int
1228 iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1229 {
1230         struct iscsi_cls_conn *conn;
1231         struct iscsi_cls_session *session;
1232
1233         session = iscsi_session_lookup(ev->u.c_conn.sid);
1234         if (!session) {
1235                 printk(KERN_ERR "iscsi: invalid session %d.\n",
1236                        ev->u.c_conn.sid);
1237                 return -EINVAL;
1238         }
1239
1240         conn = transport->create_conn(session, ev->u.c_conn.cid);
1241         if (!conn) {
1242                 iscsi_cls_session_printk(KERN_ERR, session,
1243                                          "couldn't create a new connection.");
1244                 return -ENOMEM;
1245         }
1246
1247         ev->r.c_conn_ret.sid = session->sid;
1248         ev->r.c_conn_ret.cid = conn->cid;
1249         return 0;
1250 }
1251
1252 static int
1253 iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1254 {
1255         struct iscsi_cls_conn *conn;
1256
1257         conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid);
1258         if (!conn)
1259                 return -EINVAL;
1260
1261         if (transport->destroy_conn)
1262                 transport->destroy_conn(conn);
1263         return 0;
1264 }
1265
1266 static int
1267 iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1268 {
1269         char *data = (char*)ev + sizeof(*ev);
1270         struct iscsi_cls_conn *conn;
1271         struct iscsi_cls_session *session;
1272         int err = 0, value = 0;
1273
1274         session = iscsi_session_lookup(ev->u.set_param.sid);
1275         conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
1276         if (!conn || !session)
1277                 return -EINVAL;
1278
1279         switch (ev->u.set_param.param) {
1280         case ISCSI_PARAM_SESS_RECOVERY_TMO:
1281                 sscanf(data, "%d", &value);
1282                 if (value != 0)
1283                         session->recovery_tmo = value;
1284                 break;
1285         default:
1286                 err = transport->set_param(conn, ev->u.set_param.param,
1287                                            data, ev->u.set_param.len);
1288         }
1289
1290         return err;
1291 }
1292
1293 static int iscsi_if_ep_connect(struct iscsi_transport *transport,
1294                                struct iscsi_uevent *ev, int msg_type)
1295 {
1296         struct iscsi_endpoint *ep;
1297         struct sockaddr *dst_addr;
1298         struct Scsi_Host *shost = NULL;
1299         int non_blocking, err = 0;
1300
1301         if (!transport->ep_connect)
1302                 return -EINVAL;
1303
1304         if (msg_type == ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST) {
1305                 shost = scsi_host_lookup(ev->u.ep_connect_through_host.host_no);
1306                 if (!shost) {
1307                         printk(KERN_ERR "ep connect failed. Could not find "
1308                                "host no %u\n",
1309                                ev->u.ep_connect_through_host.host_no);
1310                         return -ENODEV;
1311                 }
1312                 non_blocking = ev->u.ep_connect_through_host.non_blocking;
1313         } else
1314                 non_blocking = ev->u.ep_connect.non_blocking;
1315
1316         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
1317         ep = transport->ep_connect(shost, dst_addr, non_blocking);
1318         if (IS_ERR(ep)) {
1319                 err = PTR_ERR(ep);
1320                 goto release_host;
1321         }
1322
1323         ev->r.ep_connect_ret.handle = ep->id;
1324 release_host:
1325         if (shost)
1326                 scsi_host_put(shost);
1327         return err;
1328 }
1329
1330 static int
1331 iscsi_if_transport_ep(struct iscsi_transport *transport,
1332                       struct iscsi_uevent *ev, int msg_type)
1333 {
1334         struct iscsi_endpoint *ep;
1335         int rc = 0;
1336
1337         switch (msg_type) {
1338         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
1339         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
1340                 rc = iscsi_if_ep_connect(transport, ev, msg_type);
1341                 break;
1342         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
1343                 if (!transport->ep_poll)
1344                         return -EINVAL;
1345
1346                 ep = iscsi_lookup_endpoint(ev->u.ep_poll.ep_handle);
1347                 if (!ep)
1348                         return -EINVAL;
1349
1350                 ev->r.retcode = transport->ep_poll(ep,
1351                                                    ev->u.ep_poll.timeout_ms);
1352                 break;
1353         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
1354                 if (!transport->ep_disconnect)
1355                         return -EINVAL;
1356
1357                 ep = iscsi_lookup_endpoint(ev->u.ep_disconnect.ep_handle);
1358                 if (!ep)
1359                         return -EINVAL;
1360
1361                 transport->ep_disconnect(ep);
1362                 break;
1363         }
1364         return rc;
1365 }
1366
1367 static int
1368 iscsi_tgt_dscvr(struct iscsi_transport *transport,
1369                 struct iscsi_uevent *ev)
1370 {
1371         struct Scsi_Host *shost;
1372         struct sockaddr *dst_addr;
1373         int err;
1374
1375         if (!transport->tgt_dscvr)
1376                 return -EINVAL;
1377
1378         shost = scsi_host_lookup(ev->u.tgt_dscvr.host_no);
1379         if (!shost) {
1380                 printk(KERN_ERR "target discovery could not find host no %u\n",
1381                        ev->u.tgt_dscvr.host_no);
1382                 return -ENODEV;
1383         }
1384
1385
1386         dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
1387         err = transport->tgt_dscvr(shost, ev->u.tgt_dscvr.type,
1388                                    ev->u.tgt_dscvr.enable, dst_addr);
1389         scsi_host_put(shost);
1390         return err;
1391 }
1392
1393 static int
1394 iscsi_set_host_param(struct iscsi_transport *transport,
1395                      struct iscsi_uevent *ev)
1396 {
1397         char *data = (char*)ev + sizeof(*ev);
1398         struct Scsi_Host *shost;
1399         int err;
1400
1401         if (!transport->set_host_param)
1402                 return -ENOSYS;
1403
1404         shost = scsi_host_lookup(ev->u.set_host_param.host_no);
1405         if (!shost) {
1406                 printk(KERN_ERR "set_host_param could not find host no %u\n",
1407                        ev->u.set_host_param.host_no);
1408                 return -ENODEV;
1409         }
1410
1411         err = transport->set_host_param(shost, ev->u.set_host_param.param,
1412                                         data, ev->u.set_host_param.len);
1413         scsi_host_put(shost);
1414         return err;
1415 }
1416
1417 static int
1418 iscsi_set_path(struct iscsi_transport *transport, struct iscsi_uevent *ev)
1419 {
1420         struct Scsi_Host *shost;
1421         struct iscsi_path *params;
1422         int err;
1423
1424         if (!transport->set_path)
1425                 return -ENOSYS;
1426
1427         shost = scsi_host_lookup(ev->u.set_path.host_no);
1428         if (!shost) {
1429                 printk(KERN_ERR "set path could not find host no %u\n",
1430                        ev->u.set_path.host_no);
1431                 return -ENODEV;
1432         }
1433
1434         params = (struct iscsi_path *)((char *)ev + sizeof(*ev));
1435         err = transport->set_path(shost, params);
1436
1437         scsi_host_put(shost);
1438         return err;
1439 }
1440
1441 static int
1442 iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, uint32_t *group)
1443 {
1444         int err = 0;
1445         struct iscsi_uevent *ev = NLMSG_DATA(nlh);
1446         struct iscsi_transport *transport = NULL;
1447         struct iscsi_internal *priv;
1448         struct iscsi_cls_session *session;
1449         struct iscsi_cls_conn *conn;
1450         struct iscsi_endpoint *ep = NULL;
1451
1452         if (nlh->nlmsg_type == ISCSI_UEVENT_PATH_UPDATE)
1453                 *group = ISCSI_NL_GRP_UIP;
1454         else
1455                 *group = ISCSI_NL_GRP_ISCSID;
1456
1457         priv = iscsi_if_transport_lookup(iscsi_ptr(ev->transport_handle));
1458         if (!priv)
1459                 return -EINVAL;
1460         transport = priv->iscsi_transport;
1461
1462         if (!try_module_get(transport->owner))
1463                 return -EINVAL;
1464
1465         switch (nlh->nlmsg_type) {
1466         case ISCSI_UEVENT_CREATE_SESSION:
1467                 err = iscsi_if_create_session(priv, ep, ev,
1468                                               ev->u.c_session.initial_cmdsn,
1469                                               ev->u.c_session.cmds_max,
1470                                               ev->u.c_session.queue_depth);
1471                 break;
1472         case ISCSI_UEVENT_CREATE_BOUND_SESSION:
1473                 ep = iscsi_lookup_endpoint(ev->u.c_bound_session.ep_handle);
1474                 if (!ep) {
1475                         err = -EINVAL;
1476                         break;
1477                 }
1478
1479                 err = iscsi_if_create_session(priv, ep, ev,
1480                                         ev->u.c_bound_session.initial_cmdsn,
1481                                         ev->u.c_bound_session.cmds_max,
1482                                         ev->u.c_bound_session.queue_depth);
1483                 break;
1484         case ISCSI_UEVENT_DESTROY_SESSION:
1485                 session = iscsi_session_lookup(ev->u.d_session.sid);
1486                 if (session)
1487                         transport->destroy_session(session);
1488                 else
1489                         err = -EINVAL;
1490                 break;
1491         case ISCSI_UEVENT_UNBIND_SESSION:
1492                 session = iscsi_session_lookup(ev->u.d_session.sid);
1493                 if (session)
1494                         scsi_queue_work(iscsi_session_to_shost(session),
1495                                         &session->unbind_work);
1496                 else
1497                         err = -EINVAL;
1498                 break;
1499         case ISCSI_UEVENT_CREATE_CONN:
1500                 err = iscsi_if_create_conn(transport, ev);
1501                 break;
1502         case ISCSI_UEVENT_DESTROY_CONN:
1503                 err = iscsi_if_destroy_conn(transport, ev);
1504                 break;
1505         case ISCSI_UEVENT_BIND_CONN:
1506                 session = iscsi_session_lookup(ev->u.b_conn.sid);
1507                 conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
1508
1509                 if (session && conn)
1510                         ev->r.retcode = transport->bind_conn(session, conn,
1511                                         ev->u.b_conn.transport_eph,
1512                                         ev->u.b_conn.is_leading);
1513                 else
1514                         err = -EINVAL;
1515                 break;
1516         case ISCSI_UEVENT_SET_PARAM:
1517                 err = iscsi_set_param(transport, ev);
1518                 break;
1519         case ISCSI_UEVENT_START_CONN:
1520                 conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
1521                 if (conn)
1522                         ev->r.retcode = transport->start_conn(conn);
1523                 else
1524                         err = -EINVAL;
1525                 break;
1526         case ISCSI_UEVENT_STOP_CONN:
1527                 conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
1528                 if (conn)
1529                         transport->stop_conn(conn, ev->u.stop_conn.flag);
1530                 else
1531                         err = -EINVAL;
1532                 break;
1533         case ISCSI_UEVENT_SEND_PDU:
1534                 conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
1535                 if (conn)
1536                         ev->r.retcode = transport->send_pdu(conn,
1537                                 (struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
1538                                 (char*)ev + sizeof(*ev) + ev->u.send_pdu.hdr_size,
1539                                 ev->u.send_pdu.data_size);
1540                 else
1541                         err = -EINVAL;
1542                 break;
1543         case ISCSI_UEVENT_GET_STATS:
1544                 err = iscsi_if_get_stats(transport, nlh);
1545                 break;
1546         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
1547         case ISCSI_UEVENT_TRANSPORT_EP_POLL:
1548         case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
1549         case ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST:
1550                 err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
1551                 break;
1552         case ISCSI_UEVENT_TGT_DSCVR:
1553                 err = iscsi_tgt_dscvr(transport, ev);
1554                 break;
1555         case ISCSI_UEVENT_SET_HOST_PARAM:
1556                 err = iscsi_set_host_param(transport, ev);
1557                 break;
1558         case ISCSI_UEVENT_PATH_UPDATE:
1559                 err = iscsi_set_path(transport, ev);
1560                 break;
1561         default:
1562                 err = -ENOSYS;
1563                 break;
1564         }
1565
1566         module_put(transport->owner);
1567         return err;
1568 }
1569
1570 /*
1571  * Get message from skb.  Each message is processed by iscsi_if_recv_msg.
1572  * Malformed skbs with wrong lengths or invalid creds are not processed.
1573  */
1574 static void
1575 iscsi_if_rx(struct sk_buff *skb)
1576 {
1577         mutex_lock(&rx_queue_mutex);
1578         while (skb->len >= NLMSG_SPACE(0)) {
1579                 int err;
1580                 uint32_t rlen;
1581                 struct nlmsghdr *nlh;
1582                 struct iscsi_uevent *ev;
1583                 uint32_t group;
1584
1585                 nlh = nlmsg_hdr(skb);
1586                 if (nlh->nlmsg_len < sizeof(*nlh) ||
1587                     skb->len < nlh->nlmsg_len) {
1588                         break;
1589                 }
1590
1591                 ev = NLMSG_DATA(nlh);
1592                 rlen = NLMSG_ALIGN(nlh->nlmsg_len);
1593                 if (rlen > skb->len)
1594                         rlen = skb->len;
1595
1596                 err = iscsi_if_recv_msg(skb, nlh, &group);
1597                 if (err) {
1598                         ev->type = ISCSI_KEVENT_IF_ERROR;
1599                         ev->iferror = err;
1600                 }
1601                 do {
1602                         /*
1603                          * special case for GET_STATS:
1604                          * on success - sending reply and stats from
1605                          * inside of if_recv_msg(),
1606                          * on error - fall through.
1607                          */
1608                         if (ev->type == ISCSI_UEVENT_GET_STATS && !err)
1609                                 break;
1610                         err = iscsi_if_send_reply(group, nlh->nlmsg_seq,
1611                                 nlh->nlmsg_type, 0, 0, ev, sizeof(*ev));
1612                 } while (err < 0 && err != -ECONNREFUSED);
1613                 skb_pull(skb, rlen);
1614         }
1615         mutex_unlock(&rx_queue_mutex);
1616 }
1617
1618 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store)              \
1619 struct device_attribute dev_attr_##_prefix##_##_name =  \
1620         __ATTR(_name,_mode,_show,_store)
1621
1622 /*
1623  * iSCSI connection attrs
1624  */
1625 #define iscsi_conn_attr_show(param)                                     \
1626 static ssize_t                                                          \
1627 show_conn_param_##param(struct device *dev,                             \
1628                         struct device_attribute *attr, char *buf)       \
1629 {                                                                       \
1630         struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent);   \
1631         struct iscsi_transport *t = conn->transport;                    \
1632         return t->get_conn_param(conn, param, buf);                     \
1633 }
1634
1635 #define iscsi_conn_attr(field, param)                                   \
1636         iscsi_conn_attr_show(param)                                     \
1637 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param,  \
1638                         NULL);
1639
1640 iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
1641 iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
1642 iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
1643 iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
1644 iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
1645 iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
1646 iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
1647 iscsi_conn_attr(port, ISCSI_PARAM_CONN_PORT);
1648 iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
1649 iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
1650 iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS);
1651 iscsi_conn_attr(ping_tmo, ISCSI_PARAM_PING_TMO);
1652 iscsi_conn_attr(recv_tmo, ISCSI_PARAM_RECV_TMO);
1653
1654 /*
1655  * iSCSI session attrs
1656  */
1657 #define iscsi_session_attr_show(param, perm)                            \
1658 static ssize_t                                                          \
1659 show_session_param_##param(struct device *dev,                          \
1660                            struct device_attribute *attr, char *buf)    \
1661 {                                                                       \
1662         struct iscsi_cls_session *session =                             \
1663                 iscsi_dev_to_session(dev->parent);                      \
1664         struct iscsi_transport *t = session->transport;                 \
1665                                                                         \
1666         if (perm && !capable(CAP_SYS_ADMIN))                            \
1667                 return -EACCES;                                         \
1668         return t->get_session_param(session, param, buf);               \
1669 }
1670
1671 #define iscsi_session_attr(field, param, perm)                          \
1672         iscsi_session_attr_show(param, perm)                            \
1673 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
1674                         NULL);
1675
1676 iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME, 0);
1677 iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, 0);
1678 iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, 0);
1679 iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, 0);
1680 iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, 0);
1681 iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, 0);
1682 iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, 0);
1683 iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, 0);
1684 iscsi_session_attr(erl, ISCSI_PARAM_ERL, 0);
1685 iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT, 0);
1686 iscsi_session_attr(username, ISCSI_PARAM_USERNAME, 1);
1687 iscsi_session_attr(username_in, ISCSI_PARAM_USERNAME_IN, 1);
1688 iscsi_session_attr(password, ISCSI_PARAM_PASSWORD, 1);
1689 iscsi_session_attr(password_in, ISCSI_PARAM_PASSWORD_IN, 1);
1690 iscsi_session_attr(fast_abort, ISCSI_PARAM_FAST_ABORT, 0);
1691 iscsi_session_attr(abort_tmo, ISCSI_PARAM_ABORT_TMO, 0);
1692 iscsi_session_attr(lu_reset_tmo, ISCSI_PARAM_LU_RESET_TMO, 0);
1693 iscsi_session_attr(ifacename, ISCSI_PARAM_IFACE_NAME, 0);
1694 iscsi_session_attr(initiatorname, ISCSI_PARAM_INITIATOR_NAME, 0)
1695
1696 static ssize_t
1697 show_priv_session_state(struct device *dev, struct device_attribute *attr,
1698                         char *buf)
1699 {
1700         struct iscsi_cls_session *session = iscsi_dev_to_session(dev->parent);
1701         return sprintf(buf, "%s\n", iscsi_session_state_name(session->state));
1702 }
1703 static ISCSI_CLASS_ATTR(priv_sess, state, S_IRUGO, show_priv_session_state,
1704                         NULL);
1705
1706 #define iscsi_priv_session_attr_show(field, format)                     \
1707 static ssize_t                                                          \
1708 show_priv_session_##field(struct device *dev,                           \
1709                           struct device_attribute *attr, char *buf)     \
1710 {                                                                       \
1711         struct iscsi_cls_session *session =                             \
1712                         iscsi_dev_to_session(dev->parent);              \
1713         return sprintf(buf, format"\n", session->field);                \
1714 }
1715
1716 #define iscsi_priv_session_attr(field, format)                          \
1717         iscsi_priv_session_attr_show(field, format)                     \
1718 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
1719                         NULL)
1720 iscsi_priv_session_attr(recovery_tmo, "%d");
1721
1722 /*
1723  * iSCSI host attrs
1724  */
1725 #define iscsi_host_attr_show(param)                                     \
1726 static ssize_t                                                          \
1727 show_host_param_##param(struct device *dev,                             \
1728                         struct device_attribute *attr, char *buf)       \
1729 {                                                                       \
1730         struct Scsi_Host *shost = transport_class_to_shost(dev);        \
1731         struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
1732         return priv->iscsi_transport->get_host_param(shost, param, buf); \
1733 }
1734
1735 #define iscsi_host_attr(field, param)                                   \
1736         iscsi_host_attr_show(param)                                     \
1737 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param,  \
1738                         NULL);
1739
1740 iscsi_host_attr(netdev, ISCSI_HOST_PARAM_NETDEV_NAME);
1741 iscsi_host_attr(hwaddress, ISCSI_HOST_PARAM_HWADDRESS);
1742 iscsi_host_attr(ipaddress, ISCSI_HOST_PARAM_IPADDRESS);
1743 iscsi_host_attr(initiatorname, ISCSI_HOST_PARAM_INITIATOR_NAME);
1744
1745 #define SETUP_PRIV_SESSION_RD_ATTR(field)                               \
1746 do {                                                                    \
1747         priv->session_attrs[count] = &dev_attr_priv_sess_##field; \
1748         count++;                                                        \
1749 } while (0)
1750
1751
1752 #define SETUP_SESSION_RD_ATTR(field, param_flag)                        \
1753 do {                                                                    \
1754         if (tt->param_mask & param_flag) {                              \
1755                 priv->session_attrs[count] = &dev_attr_sess_##field; \
1756                 count++;                                                \
1757         }                                                               \
1758 } while (0)
1759
1760 #define SETUP_CONN_RD_ATTR(field, param_flag)                           \
1761 do {                                                                    \
1762         if (tt->param_mask & param_flag) {                              \
1763                 priv->conn_attrs[count] = &dev_attr_conn_##field; \
1764                 count++;                                                \
1765         }                                                               \
1766 } while (0)
1767
1768 #define SETUP_HOST_RD_ATTR(field, param_flag)                           \
1769 do {                                                                    \
1770         if (tt->host_param_mask & param_flag) {                         \
1771                 priv->host_attrs[count] = &dev_attr_host_##field; \
1772                 count++;                                                \
1773         }                                                               \
1774 } while (0)
1775
1776 static int iscsi_session_match(struct attribute_container *cont,
1777                            struct device *dev)
1778 {
1779         struct iscsi_cls_session *session;
1780         struct Scsi_Host *shost;
1781         struct iscsi_internal *priv;
1782
1783         if (!iscsi_is_session_dev(dev))
1784                 return 0;
1785
1786         session = iscsi_dev_to_session(dev);
1787         shost = iscsi_session_to_shost(session);
1788         if (!shost->transportt)
1789                 return 0;
1790
1791         priv = to_iscsi_internal(shost->transportt);
1792         if (priv->session_cont.ac.class != &iscsi_session_class.class)
1793                 return 0;
1794
1795         return &priv->session_cont.ac == cont;
1796 }
1797
1798 static int iscsi_conn_match(struct attribute_container *cont,
1799                            struct device *dev)
1800 {
1801         struct iscsi_cls_session *session;
1802         struct iscsi_cls_conn *conn;
1803         struct Scsi_Host *shost;
1804         struct iscsi_internal *priv;
1805
1806         if (!iscsi_is_conn_dev(dev))
1807                 return 0;
1808
1809         conn = iscsi_dev_to_conn(dev);
1810         session = iscsi_dev_to_session(conn->dev.parent);
1811         shost = iscsi_session_to_shost(session);
1812
1813         if (!shost->transportt)
1814                 return 0;
1815
1816         priv = to_iscsi_internal(shost->transportt);
1817         if (priv->conn_cont.ac.class != &iscsi_connection_class.class)
1818                 return 0;
1819
1820         return &priv->conn_cont.ac == cont;
1821 }
1822
1823 static int iscsi_host_match(struct attribute_container *cont,
1824                             struct device *dev)
1825 {
1826         struct Scsi_Host *shost;
1827         struct iscsi_internal *priv;
1828
1829         if (!scsi_is_host_device(dev))
1830                 return 0;
1831
1832         shost = dev_to_shost(dev);
1833         if (!shost->transportt  ||
1834             shost->transportt->host_attrs.ac.class != &iscsi_host_class.class)
1835                 return 0;
1836
1837         priv = to_iscsi_internal(shost->transportt);
1838         return &priv->t.host_attrs.ac == cont;
1839 }
1840
1841 struct scsi_transport_template *
1842 iscsi_register_transport(struct iscsi_transport *tt)
1843 {
1844         struct iscsi_internal *priv;
1845         unsigned long flags;
1846         int count = 0, err;
1847
1848         BUG_ON(!tt);
1849
1850         priv = iscsi_if_transport_lookup(tt);
1851         if (priv)
1852                 return NULL;
1853
1854         priv = kzalloc(sizeof(*priv), GFP_KERNEL);
1855         if (!priv)
1856                 return NULL;
1857         INIT_LIST_HEAD(&priv->list);
1858         priv->iscsi_transport = tt;
1859         priv->t.user_scan = iscsi_user_scan;
1860         priv->t.create_work_queue = 1;
1861
1862         priv->dev.class = &iscsi_transport_class;
1863         dev_set_name(&priv->dev, "%s", tt->name);
1864         err = device_register(&priv->dev);
1865         if (err)
1866                 goto free_priv;
1867
1868         err = sysfs_create_group(&priv->dev.kobj, &iscsi_transport_group);
1869         if (err)
1870                 goto unregister_dev;
1871
1872         /* host parameters */
1873         priv->t.host_attrs.ac.attrs = &priv->host_attrs[0];
1874         priv->t.host_attrs.ac.class = &iscsi_host_class.class;
1875         priv->t.host_attrs.ac.match = iscsi_host_match;
1876         priv->t.host_size = sizeof(struct iscsi_cls_host);
1877         transport_container_register(&priv->t.host_attrs);
1878
1879         SETUP_HOST_RD_ATTR(netdev, ISCSI_HOST_NETDEV_NAME);
1880         SETUP_HOST_RD_ATTR(ipaddress, ISCSI_HOST_IPADDRESS);
1881         SETUP_HOST_RD_ATTR(hwaddress, ISCSI_HOST_HWADDRESS);
1882         SETUP_HOST_RD_ATTR(initiatorname, ISCSI_HOST_INITIATOR_NAME);
1883         BUG_ON(count > ISCSI_HOST_ATTRS);
1884         priv->host_attrs[count] = NULL;
1885         count = 0;
1886
1887         /* connection parameters */
1888         priv->conn_cont.ac.attrs = &priv->conn_attrs[0];
1889         priv->conn_cont.ac.class = &iscsi_connection_class.class;
1890         priv->conn_cont.ac.match = iscsi_conn_match;
1891         transport_container_register(&priv->conn_cont);
1892
1893         SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH);
1894         SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH);
1895         SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN);
1896         SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN);
1897         SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN);
1898         SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN);
1899         SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
1900         SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
1901         SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
1902         SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
1903         SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
1904         SETUP_CONN_RD_ATTR(ping_tmo, ISCSI_PING_TMO);
1905         SETUP_CONN_RD_ATTR(recv_tmo, ISCSI_RECV_TMO);
1906
1907         BUG_ON(count > ISCSI_CONN_ATTRS);
1908         priv->conn_attrs[count] = NULL;
1909         count = 0;
1910
1911         /* session parameters */
1912         priv->session_cont.ac.attrs = &priv->session_attrs[0];
1913         priv->session_cont.ac.class = &iscsi_session_class.class;
1914         priv->session_cont.ac.match = iscsi_session_match;
1915         transport_container_register(&priv->session_cont);
1916
1917         SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_INITIAL_R2T_EN);
1918         SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_MAX_R2T);
1919         SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_IMM_DATA_EN);
1920         SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_FIRST_BURST);
1921         SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_MAX_BURST);
1922         SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN);
1923         SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN);
1924         SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL);
1925         SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME);
1926         SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT);
1927         SETUP_SESSION_RD_ATTR(password, ISCSI_USERNAME);
1928         SETUP_SESSION_RD_ATTR(password_in, ISCSI_USERNAME_IN);
1929         SETUP_SESSION_RD_ATTR(username, ISCSI_PASSWORD);
1930         SETUP_SESSION_RD_ATTR(username_in, ISCSI_PASSWORD_IN);
1931         SETUP_SESSION_RD_ATTR(fast_abort, ISCSI_FAST_ABORT);
1932         SETUP_SESSION_RD_ATTR(abort_tmo, ISCSI_ABORT_TMO);
1933         SETUP_SESSION_RD_ATTR(lu_reset_tmo,ISCSI_LU_RESET_TMO);
1934         SETUP_SESSION_RD_ATTR(ifacename, ISCSI_IFACE_NAME);
1935         SETUP_SESSION_RD_ATTR(initiatorname, ISCSI_INITIATOR_NAME);
1936         SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo);
1937         SETUP_PRIV_SESSION_RD_ATTR(state);
1938
1939         BUG_ON(count > ISCSI_SESSION_ATTRS);
1940         priv->session_attrs[count] = NULL;
1941
1942         spin_lock_irqsave(&iscsi_transport_lock, flags);
1943         list_add(&priv->list, &iscsi_transports);
1944         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
1945
1946         printk(KERN_NOTICE "iscsi: registered transport (%s)\n", tt->name);
1947         return &priv->t;
1948
1949 unregister_dev:
1950         device_unregister(&priv->dev);
1951         return NULL;
1952 free_priv:
1953         kfree(priv);
1954         return NULL;
1955 }
1956 EXPORT_SYMBOL_GPL(iscsi_register_transport);
1957
1958 int iscsi_unregister_transport(struct iscsi_transport *tt)
1959 {
1960         struct iscsi_internal *priv;
1961         unsigned long flags;
1962
1963         BUG_ON(!tt);
1964
1965         mutex_lock(&rx_queue_mutex);
1966
1967         priv = iscsi_if_transport_lookup(tt);
1968         BUG_ON (!priv);
1969
1970         spin_lock_irqsave(&iscsi_transport_lock, flags);
1971         list_del(&priv->list);
1972         spin_unlock_irqrestore(&iscsi_transport_lock, flags);
1973
1974         transport_container_unregister(&priv->conn_cont);
1975         transport_container_unregister(&priv->session_cont);
1976         transport_container_unregister(&priv->t.host_attrs);
1977
1978         sysfs_remove_group(&priv->dev.kobj, &iscsi_transport_group);
1979         device_unregister(&priv->dev);
1980         mutex_unlock(&rx_queue_mutex);
1981
1982         return 0;
1983 }
1984 EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
1985
1986 static __init int iscsi_transport_init(void)
1987 {
1988         int err;
1989
1990         printk(KERN_INFO "Loading iSCSI transport class v%s.\n",
1991                 ISCSI_TRANSPORT_VERSION);
1992
1993         atomic_set(&iscsi_session_nr, 0);
1994
1995         err = class_register(&iscsi_transport_class);
1996         if (err)
1997                 return err;
1998
1999         err = class_register(&iscsi_endpoint_class);
2000         if (err)
2001                 goto unregister_transport_class;
2002
2003         err = transport_class_register(&iscsi_host_class);
2004         if (err)
2005                 goto unregister_endpoint_class;
2006
2007         err = transport_class_register(&iscsi_connection_class);
2008         if (err)
2009                 goto unregister_host_class;
2010
2011         err = transport_class_register(&iscsi_session_class);
2012         if (err)
2013                 goto unregister_conn_class;
2014
2015         nls = netlink_kernel_create(&init_net, NETLINK_ISCSI, 1, iscsi_if_rx,
2016                                     NULL, THIS_MODULE);
2017         if (!nls) {
2018                 err = -ENOBUFS;
2019                 goto unregister_session_class;
2020         }
2021
2022         iscsi_eh_timer_workq = create_singlethread_workqueue("iscsi_eh");
2023         if (!iscsi_eh_timer_workq)
2024                 goto release_nls;
2025
2026         return 0;
2027
2028 release_nls:
2029         netlink_kernel_release(nls);
2030 unregister_session_class:
2031         transport_class_unregister(&iscsi_session_class);
2032 unregister_conn_class:
2033         transport_class_unregister(&iscsi_connection_class);
2034 unregister_host_class:
2035         transport_class_unregister(&iscsi_host_class);
2036 unregister_endpoint_class:
2037         class_unregister(&iscsi_endpoint_class);
2038 unregister_transport_class:
2039         class_unregister(&iscsi_transport_class);
2040         return err;
2041 }
2042
2043 static void __exit iscsi_transport_exit(void)
2044 {
2045         destroy_workqueue(iscsi_eh_timer_workq);
2046         netlink_kernel_release(nls);
2047         transport_class_unregister(&iscsi_connection_class);
2048         transport_class_unregister(&iscsi_session_class);
2049         transport_class_unregister(&iscsi_host_class);
2050         class_unregister(&iscsi_endpoint_class);
2051         class_unregister(&iscsi_transport_class);
2052 }
2053
2054 module_init(iscsi_transport_init);
2055 module_exit(iscsi_transport_exit);
2056
2057 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
2058               "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
2059               "Alex Aizman <itn780@yahoo.com>");
2060 MODULE_DESCRIPTION("iSCSI Transport Interface");
2061 MODULE_LICENSE("GPL");
2062 MODULE_VERSION(ISCSI_TRANSPORT_VERSION);