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