2 * iSCSI transport class definitions
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
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.
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.
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.
23 #include <linux/module.h>
24 #include <linux/mutex.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>
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"
38 struct iscsi_internal
{
40 struct scsi_transport_template t
;
41 struct iscsi_transport
*iscsi_transport
;
42 struct list_head list
;
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];
52 static atomic_t iscsi_session_nr
; /* sysfs session id for next new session */
53 static struct workqueue_struct
*iscsi_eh_timer_workq
;
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.
60 static LIST_HEAD(iscsi_transports
);
61 static DEFINE_SPINLOCK(iscsi_transport_lock
);
63 #define to_iscsi_internal(tmpl) \
64 container_of(tmpl, struct iscsi_internal, t)
66 #define dev_to_iscsi_internal(_dev) \
67 container_of(_dev, struct iscsi_internal, dev)
69 static void iscsi_transport_release(struct device
*dev
)
71 struct iscsi_internal
*priv
= dev_to_iscsi_internal(dev
);
76 * iscsi_transport_class represents the iscsi_transports that are
79 static struct class iscsi_transport_class
= {
80 .name
= "iscsi_transport",
81 .dev_release
= iscsi_transport_release
,
85 show_transport_handle(struct device
*dev
, struct device_attribute
*attr
,
88 struct iscsi_internal
*priv
= dev_to_iscsi_internal(dev
);
89 return sprintf(buf
, "%llu\n", (unsigned long long)iscsi_handle(priv
->iscsi_transport
));
91 static DEVICE_ATTR(handle
, S_IRUGO
, show_transport_handle
, NULL
);
93 #define show_transport_attr(name, format) \
95 show_transport_##name(struct device *dev, \
96 struct device_attribute *attr,char *buf) \
98 struct iscsi_internal *priv = dev_to_iscsi_internal(dev); \
99 return sprintf(buf, format"\n", priv->iscsi_transport->name); \
101 static DEVICE_ATTR(name, S_IRUGO, show_transport_##name, NULL);
103 show_transport_attr(caps
, "0x%x");
105 static struct attribute
*iscsi_transport_attrs
[] = {
106 &dev_attr_handle
.attr
,
111 static struct attribute_group iscsi_transport_group
= {
112 .attrs
= iscsi_transport_attrs
,
115 static int iscsi_setup_host(struct transport_container
*tc
, struct device
*dev
,
118 struct Scsi_Host
*shost
= dev_to_shost(dev
);
119 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
121 memset(ihost
, 0, sizeof(*ihost
));
122 atomic_set(&ihost
->nr_scans
, 0);
123 mutex_init(&ihost
->mutex
);
125 snprintf(ihost
->scan_workq_name
, KOBJ_NAME_LEN
, "iscsi_scan_%d",
127 ihost
->scan_workq
= create_singlethread_workqueue(
128 ihost
->scan_workq_name
);
129 if (!ihost
->scan_workq
)
134 static int iscsi_remove_host(struct transport_container
*tc
, struct device
*dev
,
137 struct Scsi_Host
*shost
= dev_to_shost(dev
);
138 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
140 destroy_workqueue(ihost
->scan_workq
);
144 static DECLARE_TRANSPORT_CLASS(iscsi_host_class
,
150 static DECLARE_TRANSPORT_CLASS(iscsi_session_class
,
156 static DECLARE_TRANSPORT_CLASS(iscsi_connection_class
,
162 static struct sock
*nls
;
163 static DEFINE_MUTEX(rx_queue_mutex
);
165 static LIST_HEAD(sesslist
);
166 static DEFINE_SPINLOCK(sesslock
);
167 static LIST_HEAD(connlist
);
168 static DEFINE_SPINLOCK(connlock
);
170 static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn
*conn
)
172 struct iscsi_cls_session
*sess
= iscsi_dev_to_session(conn
->dev
.parent
);
177 * Returns the matching session to a given sid
179 static struct iscsi_cls_session
*iscsi_session_lookup(uint32_t sid
)
182 struct iscsi_cls_session
*sess
;
184 spin_lock_irqsave(&sesslock
, flags
);
185 list_for_each_entry(sess
, &sesslist
, sess_list
) {
186 if (sess
->sid
== sid
) {
187 spin_unlock_irqrestore(&sesslock
, flags
);
191 spin_unlock_irqrestore(&sesslock
, flags
);
196 * Returns the matching connection to a given sid / cid tuple
198 static struct iscsi_cls_conn
*iscsi_conn_lookup(uint32_t sid
, uint32_t cid
)
201 struct iscsi_cls_conn
*conn
;
203 spin_lock_irqsave(&connlock
, flags
);
204 list_for_each_entry(conn
, &connlist
, conn_list
) {
205 if ((conn
->cid
== cid
) && (iscsi_conn_get_sid(conn
) == sid
)) {
206 spin_unlock_irqrestore(&connlock
, flags
);
210 spin_unlock_irqrestore(&connlock
, flags
);
215 * The following functions can be used by LLDs that allocate
216 * their own scsi_hosts or by software iscsi LLDs
221 } iscsi_session_state_names
[] = {
222 { ISCSI_SESSION_LOGGED_IN
, "LOGGED_IN" },
223 { ISCSI_SESSION_FAILED
, "FAILED" },
224 { ISCSI_SESSION_FREE
, "FREE" },
227 static const char *iscsi_session_state_name(int state
)
232 for (i
= 0; i
< ARRAY_SIZE(iscsi_session_state_names
); i
++) {
233 if (iscsi_session_state_names
[i
].value
== state
) {
234 name
= iscsi_session_state_names
[i
].name
;
241 int iscsi_session_chkready(struct iscsi_cls_session
*session
)
246 spin_lock_irqsave(&session
->lock
, flags
);
247 switch (session
->state
) {
248 case ISCSI_SESSION_LOGGED_IN
:
251 case ISCSI_SESSION_FAILED
:
252 err
= DID_IMM_RETRY
<< 16;
254 case ISCSI_SESSION_FREE
:
255 err
= DID_NO_CONNECT
<< 16;
258 err
= DID_NO_CONNECT
<< 16;
261 spin_unlock_irqrestore(&session
->lock
, flags
);
264 EXPORT_SYMBOL_GPL(iscsi_session_chkready
);
266 static void iscsi_session_release(struct device
*dev
)
268 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
);
269 struct Scsi_Host
*shost
;
271 shost
= iscsi_session_to_shost(session
);
272 scsi_host_put(shost
);
276 static int iscsi_is_session_dev(const struct device
*dev
)
278 return dev
->release
== iscsi_session_release
;
281 static int iscsi_iter_session_fn(struct device
*dev
, void *data
)
283 void (* fn
) (struct iscsi_cls_session
*) = data
;
285 if (!iscsi_is_session_dev(dev
))
287 fn(iscsi_dev_to_session(dev
));
291 void iscsi_host_for_each_session(struct Scsi_Host
*shost
,
292 void (*fn
)(struct iscsi_cls_session
*))
294 device_for_each_child(&shost
->shost_gendev
, fn
,
295 iscsi_iter_session_fn
);
297 EXPORT_SYMBOL_GPL(iscsi_host_for_each_session
);
300 * iscsi_scan_finished - helper to report when running scans are done
302 * @time: scan run time
304 * This function can be used by drives like qla4xxx to report to the scsi
305 * layer when the scans it kicked off at module load time are done.
307 int iscsi_scan_finished(struct Scsi_Host
*shost
, unsigned long time
)
309 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
311 * qla4xxx will have kicked off some session unblocks before calling
312 * scsi_scan_host, so just wait for them to complete.
314 return !atomic_read(&ihost
->nr_scans
);
316 EXPORT_SYMBOL_GPL(iscsi_scan_finished
);
318 struct iscsi_scan_data
{
319 unsigned int channel
;
324 static int iscsi_user_scan_session(struct device
*dev
, void *data
)
326 struct iscsi_scan_data
*scan_data
= data
;
327 struct iscsi_cls_session
*session
;
328 struct Scsi_Host
*shost
;
329 struct iscsi_cls_host
*ihost
;
333 if (!iscsi_is_session_dev(dev
))
336 session
= iscsi_dev_to_session(dev
);
337 shost
= iscsi_session_to_shost(session
);
338 ihost
= shost
->shost_data
;
340 mutex_lock(&ihost
->mutex
);
341 spin_lock_irqsave(&session
->lock
, flags
);
342 if (session
->state
!= ISCSI_SESSION_LOGGED_IN
) {
343 spin_unlock_irqrestore(&session
->lock
, flags
);
344 mutex_unlock(&ihost
->mutex
);
347 id
= session
->target_id
;
348 spin_unlock_irqrestore(&session
->lock
, flags
);
350 if (id
!= ISCSI_MAX_TARGET
) {
351 if ((scan_data
->channel
== SCAN_WILD_CARD
||
352 scan_data
->channel
== 0) &&
353 (scan_data
->id
== SCAN_WILD_CARD
||
354 scan_data
->id
== id
))
355 scsi_scan_target(&session
->dev
, 0, id
,
358 mutex_unlock(&ihost
->mutex
);
362 static int iscsi_user_scan(struct Scsi_Host
*shost
, uint channel
,
365 struct iscsi_scan_data scan_data
;
367 scan_data
.channel
= channel
;
371 return device_for_each_child(&shost
->shost_gendev
, &scan_data
,
372 iscsi_user_scan_session
);
375 static void iscsi_scan_session(struct work_struct
*work
)
377 struct iscsi_cls_session
*session
=
378 container_of(work
, struct iscsi_cls_session
, scan_work
);
379 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
380 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
381 struct iscsi_scan_data scan_data
;
383 scan_data
.channel
= 0;
384 scan_data
.id
= SCAN_WILD_CARD
;
385 scan_data
.lun
= SCAN_WILD_CARD
;
387 iscsi_user_scan_session(&session
->dev
, &scan_data
);
388 atomic_dec(&ihost
->nr_scans
);
391 static void session_recovery_timedout(struct work_struct
*work
)
393 struct iscsi_cls_session
*session
=
394 container_of(work
, struct iscsi_cls_session
,
398 iscsi_cls_session_printk(KERN_INFO
, session
,
399 "session recovery timed out after %d secs\n",
400 session
->recovery_tmo
);
402 spin_lock_irqsave(&session
->lock
, flags
);
403 switch (session
->state
) {
404 case ISCSI_SESSION_FAILED
:
405 session
->state
= ISCSI_SESSION_FREE
;
407 case ISCSI_SESSION_LOGGED_IN
:
408 case ISCSI_SESSION_FREE
:
409 /* we raced with the unblock's flush */
410 spin_unlock_irqrestore(&session
->lock
, flags
);
413 spin_unlock_irqrestore(&session
->lock
, flags
);
415 if (session
->transport
->session_recovery_timedout
)
416 session
->transport
->session_recovery_timedout(session
);
418 scsi_target_unblock(&session
->dev
);
421 static void __iscsi_unblock_session(struct work_struct
*work
)
423 struct iscsi_cls_session
*session
=
424 container_of(work
, struct iscsi_cls_session
,
426 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
427 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
431 * The recovery and unblock work get run from the same workqueue,
432 * so try to cancel it if it was going to run after this unblock.
434 cancel_delayed_work(&session
->recovery_work
);
435 spin_lock_irqsave(&session
->lock
, flags
);
436 session
->state
= ISCSI_SESSION_LOGGED_IN
;
437 spin_unlock_irqrestore(&session
->lock
, flags
);
439 scsi_target_unblock(&session
->dev
);
441 * Only do kernel scanning if the driver is properly hooked into
442 * the async scanning code (drivers like iscsi_tcp do login and
443 * scanning from userspace).
445 if (shost
->hostt
->scan_finished
) {
446 if (queue_work(ihost
->scan_workq
, &session
->scan_work
))
447 atomic_inc(&ihost
->nr_scans
);
452 * iscsi_unblock_session - set a session as logged in and start IO.
453 * @session: iscsi session
455 * Mark a session as ready to accept IO.
457 void iscsi_unblock_session(struct iscsi_cls_session
*session
)
459 queue_work(iscsi_eh_timer_workq
, &session
->unblock_work
);
461 * make sure all the events have completed before tell the driver
464 flush_workqueue(iscsi_eh_timer_workq
);
466 EXPORT_SYMBOL_GPL(iscsi_unblock_session
);
468 static void __iscsi_block_session(struct work_struct
*work
)
470 struct iscsi_cls_session
*session
=
471 container_of(work
, struct iscsi_cls_session
,
475 spin_lock_irqsave(&session
->lock
, flags
);
476 session
->state
= ISCSI_SESSION_FAILED
;
477 spin_unlock_irqrestore(&session
->lock
, flags
);
478 scsi_target_block(&session
->dev
);
479 queue_delayed_work(iscsi_eh_timer_workq
, &session
->recovery_work
,
480 session
->recovery_tmo
* HZ
);
483 void iscsi_block_session(struct iscsi_cls_session
*session
)
485 queue_work(iscsi_eh_timer_workq
, &session
->block_work
);
487 EXPORT_SYMBOL_GPL(iscsi_block_session
);
489 static void __iscsi_unbind_session(struct work_struct
*work
)
491 struct iscsi_cls_session
*session
=
492 container_of(work
, struct iscsi_cls_session
,
494 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
495 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
498 /* Prevent new scans and make sure scanning is not in progress */
499 mutex_lock(&ihost
->mutex
);
500 spin_lock_irqsave(&session
->lock
, flags
);
501 if (session
->target_id
== ISCSI_MAX_TARGET
) {
502 spin_unlock_irqrestore(&session
->lock
, flags
);
503 mutex_unlock(&ihost
->mutex
);
506 session
->target_id
= ISCSI_MAX_TARGET
;
507 spin_unlock_irqrestore(&session
->lock
, flags
);
508 mutex_unlock(&ihost
->mutex
);
510 scsi_remove_target(&session
->dev
);
511 iscsi_session_event(session
, ISCSI_KEVENT_UNBIND_SESSION
);
514 static int iscsi_unbind_session(struct iscsi_cls_session
*session
)
516 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
517 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
519 return queue_work(ihost
->scan_workq
, &session
->unbind_work
);
522 struct iscsi_cls_session
*
523 iscsi_alloc_session(struct Scsi_Host
*shost
, struct iscsi_transport
*transport
,
526 struct iscsi_cls_session
*session
;
528 session
= kzalloc(sizeof(*session
) + dd_size
,
533 session
->transport
= transport
;
534 session
->recovery_tmo
= 120;
535 session
->state
= ISCSI_SESSION_FREE
;
536 INIT_DELAYED_WORK(&session
->recovery_work
, session_recovery_timedout
);
537 INIT_LIST_HEAD(&session
->sess_list
);
538 INIT_WORK(&session
->unblock_work
, __iscsi_unblock_session
);
539 INIT_WORK(&session
->block_work
, __iscsi_block_session
);
540 INIT_WORK(&session
->unbind_work
, __iscsi_unbind_session
);
541 INIT_WORK(&session
->scan_work
, iscsi_scan_session
);
542 spin_lock_init(&session
->lock
);
544 /* this is released in the dev's release function */
545 scsi_host_get(shost
);
546 session
->dev
.parent
= &shost
->shost_gendev
;
547 session
->dev
.release
= iscsi_session_release
;
548 device_initialize(&session
->dev
);
550 session
->dd_data
= &session
[1];
553 EXPORT_SYMBOL_GPL(iscsi_alloc_session
);
555 static int iscsi_get_next_target_id(struct device
*dev
, void *data
)
557 struct iscsi_cls_session
*session
;
561 if (!iscsi_is_session_dev(dev
))
564 session
= iscsi_dev_to_session(dev
);
565 spin_lock_irqsave(&session
->lock
, flags
);
566 if (*((unsigned int *) data
) == session
->target_id
)
568 spin_unlock_irqrestore(&session
->lock
, flags
);
572 int iscsi_add_session(struct iscsi_cls_session
*session
, unsigned int target_id
)
574 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
575 struct iscsi_cls_host
*ihost
;
577 unsigned int id
= target_id
;
580 ihost
= shost
->shost_data
;
581 session
->sid
= atomic_add_return(1, &iscsi_session_nr
);
583 if (id
== ISCSI_MAX_TARGET
) {
584 for (id
= 0; id
< ISCSI_MAX_TARGET
; id
++) {
585 err
= device_for_each_child(&shost
->shost_gendev
, &id
,
586 iscsi_get_next_target_id
);
591 if (id
== ISCSI_MAX_TARGET
) {
592 iscsi_cls_session_printk(KERN_ERR
, session
,
593 "Too many iscsi targets. Max "
594 "number of targets is %d.\n",
595 ISCSI_MAX_TARGET
- 1);
599 session
->target_id
= id
;
601 snprintf(session
->dev
.bus_id
, BUS_ID_SIZE
, "session%u",
603 err
= device_add(&session
->dev
);
605 iscsi_cls_session_printk(KERN_ERR
, session
,
606 "could not register session's dev\n");
609 transport_register_device(&session
->dev
);
611 spin_lock_irqsave(&sesslock
, flags
);
612 list_add(&session
->sess_list
, &sesslist
);
613 spin_unlock_irqrestore(&sesslock
, flags
);
615 iscsi_session_event(session
, ISCSI_KEVENT_CREATE_SESSION
);
619 scsi_host_put(shost
);
622 EXPORT_SYMBOL_GPL(iscsi_add_session
);
625 * iscsi_create_session - create iscsi class session
627 * @transport: iscsi transport
628 * @dd_size: private driver data size
629 * @target_id: which target
631 * This can be called from a LLD or iscsi_transport.
633 struct iscsi_cls_session
*
634 iscsi_create_session(struct Scsi_Host
*shost
, struct iscsi_transport
*transport
,
635 int dd_size
, unsigned int target_id
)
637 struct iscsi_cls_session
*session
;
639 session
= iscsi_alloc_session(shost
, transport
, dd_size
);
643 if (iscsi_add_session(session
, target_id
)) {
644 iscsi_free_session(session
);
649 EXPORT_SYMBOL_GPL(iscsi_create_session
);
651 static void iscsi_conn_release(struct device
*dev
)
653 struct iscsi_cls_conn
*conn
= iscsi_dev_to_conn(dev
);
654 struct device
*parent
= conn
->dev
.parent
;
660 static int iscsi_is_conn_dev(const struct device
*dev
)
662 return dev
->release
== iscsi_conn_release
;
665 static int iscsi_iter_destroy_conn_fn(struct device
*dev
, void *data
)
667 if (!iscsi_is_conn_dev(dev
))
669 return iscsi_destroy_conn(iscsi_dev_to_conn(dev
));
672 void iscsi_remove_session(struct iscsi_cls_session
*session
)
674 struct Scsi_Host
*shost
= iscsi_session_to_shost(session
);
675 struct iscsi_cls_host
*ihost
= shost
->shost_data
;
679 spin_lock_irqsave(&sesslock
, flags
);
680 list_del(&session
->sess_list
);
681 spin_unlock_irqrestore(&sesslock
, flags
);
683 /* make sure there are no blocks/unblocks queued */
684 flush_workqueue(iscsi_eh_timer_workq
);
685 /* make sure the timedout callout is not running */
686 if (!cancel_delayed_work(&session
->recovery_work
))
687 flush_workqueue(iscsi_eh_timer_workq
);
689 * If we are blocked let commands flow again. The lld or iscsi
690 * layer should set up the queuecommand to fail commands.
691 * We assume that LLD will not be calling block/unblock while
692 * removing the session.
694 spin_lock_irqsave(&session
->lock
, flags
);
695 session
->state
= ISCSI_SESSION_FREE
;
696 spin_unlock_irqrestore(&session
->lock
, flags
);
698 scsi_target_unblock(&session
->dev
);
699 /* flush running scans then delete devices */
700 flush_workqueue(ihost
->scan_workq
);
701 __iscsi_unbind_session(&session
->unbind_work
);
703 /* hw iscsi may not have removed all connections from session */
704 err
= device_for_each_child(&session
->dev
, NULL
,
705 iscsi_iter_destroy_conn_fn
);
707 iscsi_cls_session_printk(KERN_ERR
, session
,
708 "Could not delete all connections "
709 "for session. Error %d.\n", err
);
711 transport_unregister_device(&session
->dev
);
712 device_del(&session
->dev
);
714 EXPORT_SYMBOL_GPL(iscsi_remove_session
);
716 void iscsi_free_session(struct iscsi_cls_session
*session
)
718 iscsi_session_event(session
, ISCSI_KEVENT_DESTROY_SESSION
);
719 put_device(&session
->dev
);
721 EXPORT_SYMBOL_GPL(iscsi_free_session
);
724 * iscsi_destroy_session - destroy iscsi session
725 * @session: iscsi_session
727 * Can be called by a LLD or iscsi_transport. There must not be
728 * any running connections.
730 int iscsi_destroy_session(struct iscsi_cls_session
*session
)
732 iscsi_remove_session(session
);
733 iscsi_free_session(session
);
736 EXPORT_SYMBOL_GPL(iscsi_destroy_session
);
739 * iscsi_create_conn - create iscsi class connection
740 * @session: iscsi cls session
741 * @dd_size: private driver data size
742 * @cid: connection id
744 * This can be called from a LLD or iscsi_transport. The connection
745 * is child of the session so cid must be unique for all connections
748 * Since we do not support MCS, cid will normally be zero. In some cases
749 * for software iscsi we could be trying to preallocate a connection struct
750 * in which case there could be two connection structs and cid would be
753 struct iscsi_cls_conn
*
754 iscsi_create_conn(struct iscsi_cls_session
*session
, int dd_size
, uint32_t cid
)
756 struct iscsi_transport
*transport
= session
->transport
;
757 struct iscsi_cls_conn
*conn
;
761 conn
= kzalloc(sizeof(*conn
) + dd_size
, GFP_KERNEL
);
765 conn
->dd_data
= &conn
[1];
767 INIT_LIST_HEAD(&conn
->conn_list
);
768 conn
->transport
= transport
;
771 /* this is released in the dev's release function */
772 if (!get_device(&session
->dev
))
775 snprintf(conn
->dev
.bus_id
, BUS_ID_SIZE
, "connection%d:%u",
777 conn
->dev
.parent
= &session
->dev
;
778 conn
->dev
.release
= iscsi_conn_release
;
779 err
= device_register(&conn
->dev
);
781 iscsi_cls_session_printk(KERN_ERR
, session
, "could not "
782 "register connection's dev\n");
783 goto release_parent_ref
;
785 transport_register_device(&conn
->dev
);
787 spin_lock_irqsave(&connlock
, flags
);
788 list_add(&conn
->conn_list
, &connlist
);
790 spin_unlock_irqrestore(&connlock
, flags
);
794 put_device(&session
->dev
);
800 EXPORT_SYMBOL_GPL(iscsi_create_conn
);
803 * iscsi_destroy_conn - destroy iscsi class connection
804 * @conn: iscsi cls session
806 * This can be called from a LLD or iscsi_transport.
808 int iscsi_destroy_conn(struct iscsi_cls_conn
*conn
)
812 spin_lock_irqsave(&connlock
, flags
);
814 list_del(&conn
->conn_list
);
815 spin_unlock_irqrestore(&connlock
, flags
);
817 transport_unregister_device(&conn
->dev
);
818 device_unregister(&conn
->dev
);
821 EXPORT_SYMBOL_GPL(iscsi_destroy_conn
);
824 * iscsi interface functions
826 static struct iscsi_internal
*
827 iscsi_if_transport_lookup(struct iscsi_transport
*tt
)
829 struct iscsi_internal
*priv
;
832 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
833 list_for_each_entry(priv
, &iscsi_transports
, list
) {
834 if (tt
== priv
->iscsi_transport
) {
835 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
839 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
844 iscsi_broadcast_skb(struct sk_buff
*skb
, gfp_t gfp
)
848 rc
= netlink_broadcast(nls
, skb
, 0, 1, gfp
);
850 printk(KERN_ERR
"iscsi: can not broadcast skb (%d)\n", rc
);
858 iscsi_unicast_skb(struct sk_buff
*skb
, int pid
)
862 rc
= netlink_unicast(nls
, skb
, pid
, MSG_DONTWAIT
);
864 printk(KERN_ERR
"iscsi: can not unicast skb (%d)\n", rc
);
871 int iscsi_recv_pdu(struct iscsi_cls_conn
*conn
, struct iscsi_hdr
*hdr
,
872 char *data
, uint32_t data_size
)
874 struct nlmsghdr
*nlh
;
876 struct iscsi_uevent
*ev
;
878 struct iscsi_internal
*priv
;
879 int len
= NLMSG_SPACE(sizeof(*ev
) + sizeof(struct iscsi_hdr
) +
882 priv
= iscsi_if_transport_lookup(conn
->transport
);
886 skb
= alloc_skb(len
, GFP_ATOMIC
);
888 iscsi_conn_error(conn
, ISCSI_ERR_CONN_FAILED
);
889 iscsi_cls_conn_printk(KERN_ERR
, conn
, "can not deliver "
890 "control PDU: OOM\n");
894 nlh
= __nlmsg_put(skb
, priv
->daemon_pid
, 0, 0, (len
- sizeof(*nlh
)), 0);
895 ev
= NLMSG_DATA(nlh
);
896 memset(ev
, 0, sizeof(*ev
));
897 ev
->transport_handle
= iscsi_handle(conn
->transport
);
898 ev
->type
= ISCSI_KEVENT_RECV_PDU
;
899 ev
->r
.recv_req
.cid
= conn
->cid
;
900 ev
->r
.recv_req
.sid
= iscsi_conn_get_sid(conn
);
901 pdu
= (char*)ev
+ sizeof(*ev
);
902 memcpy(pdu
, hdr
, sizeof(struct iscsi_hdr
));
903 memcpy(pdu
+ sizeof(struct iscsi_hdr
), data
, data_size
);
905 return iscsi_unicast_skb(skb
, priv
->daemon_pid
);
907 EXPORT_SYMBOL_GPL(iscsi_recv_pdu
);
909 void iscsi_conn_error(struct iscsi_cls_conn
*conn
, enum iscsi_err error
)
911 struct nlmsghdr
*nlh
;
913 struct iscsi_uevent
*ev
;
914 struct iscsi_internal
*priv
;
915 int len
= NLMSG_SPACE(sizeof(*ev
));
917 priv
= iscsi_if_transport_lookup(conn
->transport
);
921 skb
= alloc_skb(len
, GFP_ATOMIC
);
923 iscsi_cls_conn_printk(KERN_ERR
, conn
, "gracefully ignored "
924 "conn error (%d)\n", error
);
928 nlh
= __nlmsg_put(skb
, priv
->daemon_pid
, 0, 0, (len
- sizeof(*nlh
)), 0);
929 ev
= NLMSG_DATA(nlh
);
930 ev
->transport_handle
= iscsi_handle(conn
->transport
);
931 ev
->type
= ISCSI_KEVENT_CONN_ERROR
;
932 ev
->r
.connerror
.error
= error
;
933 ev
->r
.connerror
.cid
= conn
->cid
;
934 ev
->r
.connerror
.sid
= iscsi_conn_get_sid(conn
);
936 iscsi_broadcast_skb(skb
, GFP_ATOMIC
);
938 iscsi_cls_conn_printk(KERN_INFO
, conn
, "detected conn error (%d)\n",
941 EXPORT_SYMBOL_GPL(iscsi_conn_error
);
944 iscsi_if_send_reply(int pid
, int seq
, int type
, int done
, int multi
,
945 void *payload
, int size
)
948 struct nlmsghdr
*nlh
;
949 int len
= NLMSG_SPACE(size
);
950 int flags
= multi
? NLM_F_MULTI
: 0;
951 int t
= done
? NLMSG_DONE
: type
;
953 skb
= alloc_skb(len
, GFP_ATOMIC
);
955 printk(KERN_ERR
"Could not allocate skb to send reply.\n");
959 nlh
= __nlmsg_put(skb
, pid
, seq
, t
, (len
- sizeof(*nlh
)), 0);
960 nlh
->nlmsg_flags
= flags
;
961 memcpy(NLMSG_DATA(nlh
), payload
, size
);
962 return iscsi_unicast_skb(skb
, pid
);
966 iscsi_if_get_stats(struct iscsi_transport
*transport
, struct nlmsghdr
*nlh
)
968 struct iscsi_uevent
*ev
= NLMSG_DATA(nlh
);
969 struct iscsi_stats
*stats
;
970 struct sk_buff
*skbstat
;
971 struct iscsi_cls_conn
*conn
;
972 struct nlmsghdr
*nlhstat
;
973 struct iscsi_uevent
*evstat
;
974 struct iscsi_internal
*priv
;
975 int len
= NLMSG_SPACE(sizeof(*ev
) +
976 sizeof(struct iscsi_stats
) +
977 sizeof(struct iscsi_stats_custom
) *
978 ISCSI_STATS_CUSTOM_MAX
);
981 priv
= iscsi_if_transport_lookup(transport
);
985 conn
= iscsi_conn_lookup(ev
->u
.get_stats
.sid
, ev
->u
.get_stats
.cid
);
992 skbstat
= alloc_skb(len
, GFP_ATOMIC
);
994 iscsi_cls_conn_printk(KERN_ERR
, conn
, "can not "
995 "deliver stats: OOM\n");
999 nlhstat
= __nlmsg_put(skbstat
, priv
->daemon_pid
, 0, 0,
1000 (len
- sizeof(*nlhstat
)), 0);
1001 evstat
= NLMSG_DATA(nlhstat
);
1002 memset(evstat
, 0, sizeof(*evstat
));
1003 evstat
->transport_handle
= iscsi_handle(conn
->transport
);
1004 evstat
->type
= nlh
->nlmsg_type
;
1005 evstat
->u
.get_stats
.cid
=
1006 ev
->u
.get_stats
.cid
;
1007 evstat
->u
.get_stats
.sid
=
1008 ev
->u
.get_stats
.sid
;
1009 stats
= (struct iscsi_stats
*)
1010 ((char*)evstat
+ sizeof(*evstat
));
1011 memset(stats
, 0, sizeof(*stats
));
1013 transport
->get_stats(conn
, stats
);
1014 actual_size
= NLMSG_SPACE(sizeof(struct iscsi_uevent
) +
1015 sizeof(struct iscsi_stats
) +
1016 sizeof(struct iscsi_stats_custom
) *
1017 stats
->custom_length
);
1018 actual_size
-= sizeof(*nlhstat
);
1019 actual_size
= NLMSG_LENGTH(actual_size
);
1020 skb_trim(skbstat
, NLMSG_ALIGN(actual_size
));
1021 nlhstat
->nlmsg_len
= actual_size
;
1023 err
= iscsi_unicast_skb(skbstat
, priv
->daemon_pid
);
1024 } while (err
< 0 && err
!= -ECONNREFUSED
);
1030 * iscsi_session_event - send session destr. completion event
1031 * @session: iscsi class session
1032 * @event: type of event
1034 int iscsi_session_event(struct iscsi_cls_session
*session
,
1035 enum iscsi_uevent_e event
)
1037 struct iscsi_internal
*priv
;
1038 struct Scsi_Host
*shost
;
1039 struct iscsi_uevent
*ev
;
1040 struct sk_buff
*skb
;
1041 struct nlmsghdr
*nlh
;
1042 int rc
, len
= NLMSG_SPACE(sizeof(*ev
));
1044 priv
= iscsi_if_transport_lookup(session
->transport
);
1047 shost
= iscsi_session_to_shost(session
);
1049 skb
= alloc_skb(len
, GFP_KERNEL
);
1051 iscsi_cls_session_printk(KERN_ERR
, session
,
1052 "Cannot notify userspace of session "
1053 "event %u\n", event
);
1057 nlh
= __nlmsg_put(skb
, priv
->daemon_pid
, 0, 0, (len
- sizeof(*nlh
)), 0);
1058 ev
= NLMSG_DATA(nlh
);
1059 ev
->transport_handle
= iscsi_handle(session
->transport
);
1063 case ISCSI_KEVENT_DESTROY_SESSION
:
1064 ev
->r
.d_session
.host_no
= shost
->host_no
;
1065 ev
->r
.d_session
.sid
= session
->sid
;
1067 case ISCSI_KEVENT_CREATE_SESSION
:
1068 ev
->r
.c_session_ret
.host_no
= shost
->host_no
;
1069 ev
->r
.c_session_ret
.sid
= session
->sid
;
1071 case ISCSI_KEVENT_UNBIND_SESSION
:
1072 ev
->r
.unbind_session
.host_no
= shost
->host_no
;
1073 ev
->r
.unbind_session
.sid
= session
->sid
;
1076 iscsi_cls_session_printk(KERN_ERR
, session
, "Invalid event "
1083 * this will occur if the daemon is not up, so we just warn
1084 * the user and when the daemon is restarted it will handle it
1086 rc
= iscsi_broadcast_skb(skb
, GFP_KERNEL
);
1088 iscsi_cls_session_printk(KERN_ERR
, session
,
1089 "Cannot notify userspace of session "
1090 "event %u. Check iscsi daemon\n",
1094 EXPORT_SYMBOL_GPL(iscsi_session_event
);
1097 iscsi_if_create_session(struct iscsi_internal
*priv
, struct iscsi_uevent
*ev
,
1098 uint32_t host_no
, uint32_t initial_cmdsn
,
1099 uint16_t cmds_max
, uint16_t queue_depth
)
1101 struct iscsi_transport
*transport
= priv
->iscsi_transport
;
1102 struct iscsi_cls_session
*session
;
1103 struct Scsi_Host
*shost
= NULL
;
1106 * Software iscsi allocates a host per session, but
1107 * offload drivers (and possibly iser one day) allocate a host per
1108 * hba/nic/rnic. Offload will match a host here, but software will
1109 * return a new hostno after the create_session callback has returned.
1111 if (host_no
!= UINT_MAX
) {
1112 shost
= scsi_host_lookup(host_no
);
1113 if (IS_ERR(shost
)) {
1114 printk(KERN_ERR
"Could not find host no %u to "
1115 "create session\n", host_no
);
1120 session
= transport
->create_session(shost
, cmds_max
, queue_depth
,
1121 initial_cmdsn
, &host_no
);
1123 scsi_host_put(shost
);
1127 ev
->r
.c_session_ret
.host_no
= host_no
;
1128 ev
->r
.c_session_ret
.sid
= session
->sid
;
1133 iscsi_if_create_conn(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
)
1135 struct iscsi_cls_conn
*conn
;
1136 struct iscsi_cls_session
*session
;
1138 session
= iscsi_session_lookup(ev
->u
.c_conn
.sid
);
1140 printk(KERN_ERR
"iscsi: invalid session %d.\n",
1145 conn
= transport
->create_conn(session
, ev
->u
.c_conn
.cid
);
1147 iscsi_cls_session_printk(KERN_ERR
, session
,
1148 "couldn't create a new connection.");
1152 ev
->r
.c_conn_ret
.sid
= session
->sid
;
1153 ev
->r
.c_conn_ret
.cid
= conn
->cid
;
1158 iscsi_if_destroy_conn(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
)
1160 struct iscsi_cls_conn
*conn
;
1162 conn
= iscsi_conn_lookup(ev
->u
.d_conn
.sid
, ev
->u
.d_conn
.cid
);
1166 if (transport
->destroy_conn
)
1167 transport
->destroy_conn(conn
);
1172 iscsi_set_param(struct iscsi_transport
*transport
, struct iscsi_uevent
*ev
)
1174 char *data
= (char*)ev
+ sizeof(*ev
);
1175 struct iscsi_cls_conn
*conn
;
1176 struct iscsi_cls_session
*session
;
1177 int err
= 0, value
= 0;
1179 session
= iscsi_session_lookup(ev
->u
.set_param
.sid
);
1180 conn
= iscsi_conn_lookup(ev
->u
.set_param
.sid
, ev
->u
.set_param
.cid
);
1181 if (!conn
|| !session
)
1184 switch (ev
->u
.set_param
.param
) {
1185 case ISCSI_PARAM_SESS_RECOVERY_TMO
:
1186 sscanf(data
, "%d", &value
);
1188 session
->recovery_tmo
= value
;
1191 err
= transport
->set_param(conn
, ev
->u
.set_param
.param
,
1192 data
, ev
->u
.set_param
.len
);
1199 iscsi_if_transport_ep(struct iscsi_transport
*transport
,
1200 struct iscsi_uevent
*ev
, int msg_type
)
1202 struct sockaddr
*dst_addr
;
1206 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT
:
1207 if (!transport
->ep_connect
)
1210 dst_addr
= (struct sockaddr
*)((char*)ev
+ sizeof(*ev
));
1211 rc
= transport
->ep_connect(dst_addr
,
1212 ev
->u
.ep_connect
.non_blocking
,
1213 &ev
->r
.ep_connect_ret
.handle
);
1215 case ISCSI_UEVENT_TRANSPORT_EP_POLL
:
1216 if (!transport
->ep_poll
)
1219 ev
->r
.retcode
= transport
->ep_poll(ev
->u
.ep_poll
.ep_handle
,
1220 ev
->u
.ep_poll
.timeout_ms
);
1222 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT
:
1223 if (!transport
->ep_disconnect
)
1226 transport
->ep_disconnect(ev
->u
.ep_disconnect
.ep_handle
);
1233 iscsi_tgt_dscvr(struct iscsi_transport
*transport
,
1234 struct iscsi_uevent
*ev
)
1236 struct Scsi_Host
*shost
;
1237 struct sockaddr
*dst_addr
;
1240 if (!transport
->tgt_dscvr
)
1243 shost
= scsi_host_lookup(ev
->u
.tgt_dscvr
.host_no
);
1244 if (IS_ERR(shost
)) {
1245 printk(KERN_ERR
"target discovery could not find host no %u\n",
1246 ev
->u
.tgt_dscvr
.host_no
);
1251 dst_addr
= (struct sockaddr
*)((char*)ev
+ sizeof(*ev
));
1252 err
= transport
->tgt_dscvr(shost
, ev
->u
.tgt_dscvr
.type
,
1253 ev
->u
.tgt_dscvr
.enable
, dst_addr
);
1254 scsi_host_put(shost
);
1259 iscsi_set_host_param(struct iscsi_transport
*transport
,
1260 struct iscsi_uevent
*ev
)
1262 char *data
= (char*)ev
+ sizeof(*ev
);
1263 struct Scsi_Host
*shost
;
1266 if (!transport
->set_host_param
)
1269 shost
= scsi_host_lookup(ev
->u
.set_host_param
.host_no
);
1270 if (IS_ERR(shost
)) {
1271 printk(KERN_ERR
"set_host_param could not find host no %u\n",
1272 ev
->u
.set_host_param
.host_no
);
1276 err
= transport
->set_host_param(shost
, ev
->u
.set_host_param
.param
,
1277 data
, ev
->u
.set_host_param
.len
);
1278 scsi_host_put(shost
);
1283 iscsi_if_recv_msg(struct sk_buff
*skb
, struct nlmsghdr
*nlh
)
1286 uint32_t host_no
= UINT_MAX
;
1287 struct iscsi_uevent
*ev
= NLMSG_DATA(nlh
);
1288 struct iscsi_transport
*transport
= NULL
;
1289 struct iscsi_internal
*priv
;
1290 struct iscsi_cls_session
*session
;
1291 struct iscsi_cls_conn
*conn
;
1293 priv
= iscsi_if_transport_lookup(iscsi_ptr(ev
->transport_handle
));
1296 transport
= priv
->iscsi_transport
;
1298 if (!try_module_get(transport
->owner
))
1301 priv
->daemon_pid
= NETLINK_CREDS(skb
)->pid
;
1303 switch (nlh
->nlmsg_type
) {
1304 case ISCSI_UEVENT_CREATE_SESSION
:
1305 err
= iscsi_if_create_session(priv
, ev
, host_no
,
1306 ev
->u
.c_session
.initial_cmdsn
,
1307 ev
->u
.c_session
.cmds_max
,
1308 ev
->u
.c_session
.queue_depth
);
1310 case ISCSI_UEVENT_CREATE_BOUND_SESSION
:
1311 err
= iscsi_if_create_session(priv
, ev
,
1312 ev
->u
.c_bound_session
.host_no
,
1313 ev
->u
.c_bound_session
.initial_cmdsn
,
1314 ev
->u
.c_bound_session
.cmds_max
,
1315 ev
->u
.c_bound_session
.queue_depth
);
1317 case ISCSI_UEVENT_DESTROY_SESSION
:
1318 session
= iscsi_session_lookup(ev
->u
.d_session
.sid
);
1320 transport
->destroy_session(session
);
1324 case ISCSI_UEVENT_UNBIND_SESSION
:
1325 session
= iscsi_session_lookup(ev
->u
.d_session
.sid
);
1327 iscsi_unbind_session(session
);
1331 case ISCSI_UEVENT_CREATE_CONN
:
1332 err
= iscsi_if_create_conn(transport
, ev
);
1334 case ISCSI_UEVENT_DESTROY_CONN
:
1335 err
= iscsi_if_destroy_conn(transport
, ev
);
1337 case ISCSI_UEVENT_BIND_CONN
:
1338 session
= iscsi_session_lookup(ev
->u
.b_conn
.sid
);
1339 conn
= iscsi_conn_lookup(ev
->u
.b_conn
.sid
, ev
->u
.b_conn
.cid
);
1341 if (session
&& conn
)
1342 ev
->r
.retcode
= transport
->bind_conn(session
, conn
,
1343 ev
->u
.b_conn
.transport_eph
,
1344 ev
->u
.b_conn
.is_leading
);
1348 case ISCSI_UEVENT_SET_PARAM
:
1349 err
= iscsi_set_param(transport
, ev
);
1351 case ISCSI_UEVENT_START_CONN
:
1352 conn
= iscsi_conn_lookup(ev
->u
.start_conn
.sid
, ev
->u
.start_conn
.cid
);
1354 ev
->r
.retcode
= transport
->start_conn(conn
);
1358 case ISCSI_UEVENT_STOP_CONN
:
1359 conn
= iscsi_conn_lookup(ev
->u
.stop_conn
.sid
, ev
->u
.stop_conn
.cid
);
1361 transport
->stop_conn(conn
, ev
->u
.stop_conn
.flag
);
1365 case ISCSI_UEVENT_SEND_PDU
:
1366 conn
= iscsi_conn_lookup(ev
->u
.send_pdu
.sid
, ev
->u
.send_pdu
.cid
);
1368 ev
->r
.retcode
= transport
->send_pdu(conn
,
1369 (struct iscsi_hdr
*)((char*)ev
+ sizeof(*ev
)),
1370 (char*)ev
+ sizeof(*ev
) + ev
->u
.send_pdu
.hdr_size
,
1371 ev
->u
.send_pdu
.data_size
);
1375 case ISCSI_UEVENT_GET_STATS
:
1376 err
= iscsi_if_get_stats(transport
, nlh
);
1378 case ISCSI_UEVENT_TRANSPORT_EP_CONNECT
:
1379 case ISCSI_UEVENT_TRANSPORT_EP_POLL
:
1380 case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT
:
1381 err
= iscsi_if_transport_ep(transport
, ev
, nlh
->nlmsg_type
);
1383 case ISCSI_UEVENT_TGT_DSCVR
:
1384 err
= iscsi_tgt_dscvr(transport
, ev
);
1386 case ISCSI_UEVENT_SET_HOST_PARAM
:
1387 err
= iscsi_set_host_param(transport
, ev
);
1394 module_put(transport
->owner
);
1399 * Get message from skb. Each message is processed by iscsi_if_recv_msg.
1400 * Malformed skbs with wrong lengths or invalid creds are not processed.
1403 iscsi_if_rx(struct sk_buff
*skb
)
1405 mutex_lock(&rx_queue_mutex
);
1406 while (skb
->len
>= NLMSG_SPACE(0)) {
1409 struct nlmsghdr
*nlh
;
1410 struct iscsi_uevent
*ev
;
1412 nlh
= nlmsg_hdr(skb
);
1413 if (nlh
->nlmsg_len
< sizeof(*nlh
) ||
1414 skb
->len
< nlh
->nlmsg_len
) {
1418 ev
= NLMSG_DATA(nlh
);
1419 rlen
= NLMSG_ALIGN(nlh
->nlmsg_len
);
1420 if (rlen
> skb
->len
)
1423 err
= iscsi_if_recv_msg(skb
, nlh
);
1425 ev
->type
= ISCSI_KEVENT_IF_ERROR
;
1430 * special case for GET_STATS:
1431 * on success - sending reply and stats from
1432 * inside of if_recv_msg(),
1433 * on error - fall through.
1435 if (ev
->type
== ISCSI_UEVENT_GET_STATS
&& !err
)
1437 err
= iscsi_if_send_reply(
1438 NETLINK_CREDS(skb
)->pid
, nlh
->nlmsg_seq
,
1439 nlh
->nlmsg_type
, 0, 0, ev
, sizeof(*ev
));
1440 } while (err
< 0 && err
!= -ECONNREFUSED
);
1441 skb_pull(skb
, rlen
);
1443 mutex_unlock(&rx_queue_mutex
);
1446 #define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \
1447 struct device_attribute dev_attr_##_prefix##_##_name = \
1448 __ATTR(_name,_mode,_show,_store)
1451 * iSCSI connection attrs
1453 #define iscsi_conn_attr_show(param) \
1455 show_conn_param_##param(struct device *dev, \
1456 struct device_attribute *attr, char *buf) \
1458 struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev->parent); \
1459 struct iscsi_transport *t = conn->transport; \
1460 return t->get_conn_param(conn, param, buf); \
1463 #define iscsi_conn_attr(field, param) \
1464 iscsi_conn_attr_show(param) \
1465 static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \
1468 iscsi_conn_attr(max_recv_dlength
, ISCSI_PARAM_MAX_RECV_DLENGTH
);
1469 iscsi_conn_attr(max_xmit_dlength
, ISCSI_PARAM_MAX_XMIT_DLENGTH
);
1470 iscsi_conn_attr(header_digest
, ISCSI_PARAM_HDRDGST_EN
);
1471 iscsi_conn_attr(data_digest
, ISCSI_PARAM_DATADGST_EN
);
1472 iscsi_conn_attr(ifmarker
, ISCSI_PARAM_IFMARKER_EN
);
1473 iscsi_conn_attr(ofmarker
, ISCSI_PARAM_OFMARKER_EN
);
1474 iscsi_conn_attr(persistent_port
, ISCSI_PARAM_PERSISTENT_PORT
);
1475 iscsi_conn_attr(port
, ISCSI_PARAM_CONN_PORT
);
1476 iscsi_conn_attr(exp_statsn
, ISCSI_PARAM_EXP_STATSN
);
1477 iscsi_conn_attr(persistent_address
, ISCSI_PARAM_PERSISTENT_ADDRESS
);
1478 iscsi_conn_attr(address
, ISCSI_PARAM_CONN_ADDRESS
);
1479 iscsi_conn_attr(ping_tmo
, ISCSI_PARAM_PING_TMO
);
1480 iscsi_conn_attr(recv_tmo
, ISCSI_PARAM_RECV_TMO
);
1483 * iSCSI session attrs
1485 #define iscsi_session_attr_show(param, perm) \
1487 show_session_param_##param(struct device *dev, \
1488 struct device_attribute *attr, char *buf) \
1490 struct iscsi_cls_session *session = \
1491 iscsi_dev_to_session(dev->parent); \
1492 struct iscsi_transport *t = session->transport; \
1494 if (perm && !capable(CAP_SYS_ADMIN)) \
1496 return t->get_session_param(session, param, buf); \
1499 #define iscsi_session_attr(field, param, perm) \
1500 iscsi_session_attr_show(param, perm) \
1501 static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
1504 iscsi_session_attr(targetname
, ISCSI_PARAM_TARGET_NAME
, 0);
1505 iscsi_session_attr(initial_r2t
, ISCSI_PARAM_INITIAL_R2T_EN
, 0);
1506 iscsi_session_attr(max_outstanding_r2t
, ISCSI_PARAM_MAX_R2T
, 0);
1507 iscsi_session_attr(immediate_data
, ISCSI_PARAM_IMM_DATA_EN
, 0);
1508 iscsi_session_attr(first_burst_len
, ISCSI_PARAM_FIRST_BURST
, 0);
1509 iscsi_session_attr(max_burst_len
, ISCSI_PARAM_MAX_BURST
, 0);
1510 iscsi_session_attr(data_pdu_in_order
, ISCSI_PARAM_PDU_INORDER_EN
, 0);
1511 iscsi_session_attr(data_seq_in_order
, ISCSI_PARAM_DATASEQ_INORDER_EN
, 0);
1512 iscsi_session_attr(erl
, ISCSI_PARAM_ERL
, 0);
1513 iscsi_session_attr(tpgt
, ISCSI_PARAM_TPGT
, 0);
1514 iscsi_session_attr(username
, ISCSI_PARAM_USERNAME
, 1);
1515 iscsi_session_attr(username_in
, ISCSI_PARAM_USERNAME_IN
, 1);
1516 iscsi_session_attr(password
, ISCSI_PARAM_PASSWORD
, 1);
1517 iscsi_session_attr(password_in
, ISCSI_PARAM_PASSWORD_IN
, 1);
1518 iscsi_session_attr(fast_abort
, ISCSI_PARAM_FAST_ABORT
, 0);
1519 iscsi_session_attr(abort_tmo
, ISCSI_PARAM_ABORT_TMO
, 0);
1520 iscsi_session_attr(lu_reset_tmo
, ISCSI_PARAM_LU_RESET_TMO
, 0);
1523 show_priv_session_state(struct device
*dev
, struct device_attribute
*attr
,
1526 struct iscsi_cls_session
*session
= iscsi_dev_to_session(dev
->parent
);
1527 return sprintf(buf
, "%s\n", iscsi_session_state_name(session
->state
));
1529 static ISCSI_CLASS_ATTR(priv_sess
, state
, S_IRUGO
, show_priv_session_state
,
1532 #define iscsi_priv_session_attr_show(field, format) \
1534 show_priv_session_##field(struct device *dev, \
1535 struct device_attribute *attr, char *buf) \
1537 struct iscsi_cls_session *session = \
1538 iscsi_dev_to_session(dev->parent); \
1539 return sprintf(buf, format"\n", session->field); \
1542 #define iscsi_priv_session_attr(field, format) \
1543 iscsi_priv_session_attr_show(field, format) \
1544 static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
1546 iscsi_priv_session_attr(recovery_tmo
, "%d");
1551 #define iscsi_host_attr_show(param) \
1553 show_host_param_##param(struct device *dev, \
1554 struct device_attribute *attr, char *buf) \
1556 struct Scsi_Host *shost = transport_class_to_shost(dev); \
1557 struct iscsi_internal *priv = to_iscsi_internal(shost->transportt); \
1558 return priv->iscsi_transport->get_host_param(shost, param, buf); \
1561 #define iscsi_host_attr(field, param) \
1562 iscsi_host_attr_show(param) \
1563 static ISCSI_CLASS_ATTR(host, field, S_IRUGO, show_host_param_##param, \
1566 iscsi_host_attr(netdev
, ISCSI_HOST_PARAM_NETDEV_NAME
);
1567 iscsi_host_attr(hwaddress
, ISCSI_HOST_PARAM_HWADDRESS
);
1568 iscsi_host_attr(ipaddress
, ISCSI_HOST_PARAM_IPADDRESS
);
1569 iscsi_host_attr(initiatorname
, ISCSI_HOST_PARAM_INITIATOR_NAME
);
1571 #define SETUP_PRIV_SESSION_RD_ATTR(field) \
1573 priv->session_attrs[count] = &dev_attr_priv_sess_##field; \
1578 #define SETUP_SESSION_RD_ATTR(field, param_flag) \
1580 if (tt->param_mask & param_flag) { \
1581 priv->session_attrs[count] = &dev_attr_sess_##field; \
1586 #define SETUP_CONN_RD_ATTR(field, param_flag) \
1588 if (tt->param_mask & param_flag) { \
1589 priv->conn_attrs[count] = &dev_attr_conn_##field; \
1594 #define SETUP_HOST_RD_ATTR(field, param_flag) \
1596 if (tt->host_param_mask & param_flag) { \
1597 priv->host_attrs[count] = &dev_attr_host_##field; \
1602 static int iscsi_session_match(struct attribute_container
*cont
,
1605 struct iscsi_cls_session
*session
;
1606 struct Scsi_Host
*shost
;
1607 struct iscsi_internal
*priv
;
1609 if (!iscsi_is_session_dev(dev
))
1612 session
= iscsi_dev_to_session(dev
);
1613 shost
= iscsi_session_to_shost(session
);
1614 if (!shost
->transportt
)
1617 priv
= to_iscsi_internal(shost
->transportt
);
1618 if (priv
->session_cont
.ac
.class != &iscsi_session_class
.class)
1621 return &priv
->session_cont
.ac
== cont
;
1624 static int iscsi_conn_match(struct attribute_container
*cont
,
1627 struct iscsi_cls_session
*session
;
1628 struct iscsi_cls_conn
*conn
;
1629 struct Scsi_Host
*shost
;
1630 struct iscsi_internal
*priv
;
1632 if (!iscsi_is_conn_dev(dev
))
1635 conn
= iscsi_dev_to_conn(dev
);
1636 session
= iscsi_dev_to_session(conn
->dev
.parent
);
1637 shost
= iscsi_session_to_shost(session
);
1639 if (!shost
->transportt
)
1642 priv
= to_iscsi_internal(shost
->transportt
);
1643 if (priv
->conn_cont
.ac
.class != &iscsi_connection_class
.class)
1646 return &priv
->conn_cont
.ac
== cont
;
1649 static int iscsi_host_match(struct attribute_container
*cont
,
1652 struct Scsi_Host
*shost
;
1653 struct iscsi_internal
*priv
;
1655 if (!scsi_is_host_device(dev
))
1658 shost
= dev_to_shost(dev
);
1659 if (!shost
->transportt
||
1660 shost
->transportt
->host_attrs
.ac
.class != &iscsi_host_class
.class)
1663 priv
= to_iscsi_internal(shost
->transportt
);
1664 return &priv
->t
.host_attrs
.ac
== cont
;
1667 struct scsi_transport_template
*
1668 iscsi_register_transport(struct iscsi_transport
*tt
)
1670 struct iscsi_internal
*priv
;
1671 unsigned long flags
;
1676 priv
= iscsi_if_transport_lookup(tt
);
1680 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
1683 INIT_LIST_HEAD(&priv
->list
);
1684 priv
->daemon_pid
= -1;
1685 priv
->iscsi_transport
= tt
;
1686 priv
->t
.user_scan
= iscsi_user_scan
;
1687 if (!(tt
->caps
& CAP_DATA_PATH_OFFLOAD
))
1688 priv
->t
.create_work_queue
= 1;
1690 priv
->dev
.class = &iscsi_transport_class
;
1691 snprintf(priv
->dev
.bus_id
, BUS_ID_SIZE
, "%s", tt
->name
);
1692 err
= device_register(&priv
->dev
);
1696 err
= sysfs_create_group(&priv
->dev
.kobj
, &iscsi_transport_group
);
1698 goto unregister_dev
;
1700 /* host parameters */
1701 priv
->t
.host_attrs
.ac
.attrs
= &priv
->host_attrs
[0];
1702 priv
->t
.host_attrs
.ac
.class = &iscsi_host_class
.class;
1703 priv
->t
.host_attrs
.ac
.match
= iscsi_host_match
;
1704 priv
->t
.host_size
= sizeof(struct iscsi_cls_host
);
1705 transport_container_register(&priv
->t
.host_attrs
);
1707 SETUP_HOST_RD_ATTR(netdev
, ISCSI_HOST_NETDEV_NAME
);
1708 SETUP_HOST_RD_ATTR(ipaddress
, ISCSI_HOST_IPADDRESS
);
1709 SETUP_HOST_RD_ATTR(hwaddress
, ISCSI_HOST_HWADDRESS
);
1710 SETUP_HOST_RD_ATTR(initiatorname
, ISCSI_HOST_INITIATOR_NAME
);
1711 BUG_ON(count
> ISCSI_HOST_ATTRS
);
1712 priv
->host_attrs
[count
] = NULL
;
1715 /* connection parameters */
1716 priv
->conn_cont
.ac
.attrs
= &priv
->conn_attrs
[0];
1717 priv
->conn_cont
.ac
.class = &iscsi_connection_class
.class;
1718 priv
->conn_cont
.ac
.match
= iscsi_conn_match
;
1719 transport_container_register(&priv
->conn_cont
);
1721 SETUP_CONN_RD_ATTR(max_recv_dlength
, ISCSI_MAX_RECV_DLENGTH
);
1722 SETUP_CONN_RD_ATTR(max_xmit_dlength
, ISCSI_MAX_XMIT_DLENGTH
);
1723 SETUP_CONN_RD_ATTR(header_digest
, ISCSI_HDRDGST_EN
);
1724 SETUP_CONN_RD_ATTR(data_digest
, ISCSI_DATADGST_EN
);
1725 SETUP_CONN_RD_ATTR(ifmarker
, ISCSI_IFMARKER_EN
);
1726 SETUP_CONN_RD_ATTR(ofmarker
, ISCSI_OFMARKER_EN
);
1727 SETUP_CONN_RD_ATTR(address
, ISCSI_CONN_ADDRESS
);
1728 SETUP_CONN_RD_ATTR(port
, ISCSI_CONN_PORT
);
1729 SETUP_CONN_RD_ATTR(exp_statsn
, ISCSI_EXP_STATSN
);
1730 SETUP_CONN_RD_ATTR(persistent_address
, ISCSI_PERSISTENT_ADDRESS
);
1731 SETUP_CONN_RD_ATTR(persistent_port
, ISCSI_PERSISTENT_PORT
);
1732 SETUP_CONN_RD_ATTR(ping_tmo
, ISCSI_PING_TMO
);
1733 SETUP_CONN_RD_ATTR(recv_tmo
, ISCSI_RECV_TMO
);
1735 BUG_ON(count
> ISCSI_CONN_ATTRS
);
1736 priv
->conn_attrs
[count
] = NULL
;
1739 /* session parameters */
1740 priv
->session_cont
.ac
.attrs
= &priv
->session_attrs
[0];
1741 priv
->session_cont
.ac
.class = &iscsi_session_class
.class;
1742 priv
->session_cont
.ac
.match
= iscsi_session_match
;
1743 transport_container_register(&priv
->session_cont
);
1745 SETUP_SESSION_RD_ATTR(initial_r2t
, ISCSI_INITIAL_R2T_EN
);
1746 SETUP_SESSION_RD_ATTR(max_outstanding_r2t
, ISCSI_MAX_R2T
);
1747 SETUP_SESSION_RD_ATTR(immediate_data
, ISCSI_IMM_DATA_EN
);
1748 SETUP_SESSION_RD_ATTR(first_burst_len
, ISCSI_FIRST_BURST
);
1749 SETUP_SESSION_RD_ATTR(max_burst_len
, ISCSI_MAX_BURST
);
1750 SETUP_SESSION_RD_ATTR(data_pdu_in_order
, ISCSI_PDU_INORDER_EN
);
1751 SETUP_SESSION_RD_ATTR(data_seq_in_order
, ISCSI_DATASEQ_INORDER_EN
);
1752 SETUP_SESSION_RD_ATTR(erl
, ISCSI_ERL
);
1753 SETUP_SESSION_RD_ATTR(targetname
, ISCSI_TARGET_NAME
);
1754 SETUP_SESSION_RD_ATTR(tpgt
, ISCSI_TPGT
);
1755 SETUP_SESSION_RD_ATTR(password
, ISCSI_USERNAME
);
1756 SETUP_SESSION_RD_ATTR(password_in
, ISCSI_USERNAME_IN
);
1757 SETUP_SESSION_RD_ATTR(username
, ISCSI_PASSWORD
);
1758 SETUP_SESSION_RD_ATTR(username_in
, ISCSI_PASSWORD_IN
);
1759 SETUP_SESSION_RD_ATTR(fast_abort
, ISCSI_FAST_ABORT
);
1760 SETUP_SESSION_RD_ATTR(abort_tmo
, ISCSI_ABORT_TMO
);
1761 SETUP_SESSION_RD_ATTR(lu_reset_tmo
,ISCSI_LU_RESET_TMO
);
1762 SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo
);
1763 SETUP_PRIV_SESSION_RD_ATTR(state
);
1765 BUG_ON(count
> ISCSI_SESSION_ATTRS
);
1766 priv
->session_attrs
[count
] = NULL
;
1768 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
1769 list_add(&priv
->list
, &iscsi_transports
);
1770 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
1772 printk(KERN_NOTICE
"iscsi: registered transport (%s)\n", tt
->name
);
1776 device_unregister(&priv
->dev
);
1781 EXPORT_SYMBOL_GPL(iscsi_register_transport
);
1783 int iscsi_unregister_transport(struct iscsi_transport
*tt
)
1785 struct iscsi_internal
*priv
;
1786 unsigned long flags
;
1790 mutex_lock(&rx_queue_mutex
);
1792 priv
= iscsi_if_transport_lookup(tt
);
1795 spin_lock_irqsave(&iscsi_transport_lock
, flags
);
1796 list_del(&priv
->list
);
1797 spin_unlock_irqrestore(&iscsi_transport_lock
, flags
);
1799 transport_container_unregister(&priv
->conn_cont
);
1800 transport_container_unregister(&priv
->session_cont
);
1801 transport_container_unregister(&priv
->t
.host_attrs
);
1803 sysfs_remove_group(&priv
->dev
.kobj
, &iscsi_transport_group
);
1804 device_unregister(&priv
->dev
);
1805 mutex_unlock(&rx_queue_mutex
);
1809 EXPORT_SYMBOL_GPL(iscsi_unregister_transport
);
1811 static __init
int iscsi_transport_init(void)
1815 printk(KERN_INFO
"Loading iSCSI transport class v%s.\n",
1816 ISCSI_TRANSPORT_VERSION
);
1818 atomic_set(&iscsi_session_nr
, 0);
1820 err
= class_register(&iscsi_transport_class
);
1824 err
= transport_class_register(&iscsi_host_class
);
1826 goto unregister_transport_class
;
1828 err
= transport_class_register(&iscsi_connection_class
);
1830 goto unregister_host_class
;
1832 err
= transport_class_register(&iscsi_session_class
);
1834 goto unregister_conn_class
;
1836 nls
= netlink_kernel_create(&init_net
, NETLINK_ISCSI
, 1, iscsi_if_rx
, NULL
,
1840 goto unregister_session_class
;
1843 iscsi_eh_timer_workq
= create_singlethread_workqueue("iscsi_eh");
1844 if (!iscsi_eh_timer_workq
)
1850 netlink_kernel_release(nls
);
1851 unregister_session_class
:
1852 transport_class_unregister(&iscsi_session_class
);
1853 unregister_conn_class
:
1854 transport_class_unregister(&iscsi_connection_class
);
1855 unregister_host_class
:
1856 transport_class_unregister(&iscsi_host_class
);
1857 unregister_transport_class
:
1858 class_unregister(&iscsi_transport_class
);
1862 static void __exit
iscsi_transport_exit(void)
1864 destroy_workqueue(iscsi_eh_timer_workq
);
1865 netlink_kernel_release(nls
);
1866 transport_class_unregister(&iscsi_connection_class
);
1867 transport_class_unregister(&iscsi_session_class
);
1868 transport_class_unregister(&iscsi_host_class
);
1869 class_unregister(&iscsi_transport_class
);
1872 module_init(iscsi_transport_init
);
1873 module_exit(iscsi_transport_exit
);
1875 MODULE_AUTHOR("Mike Christie <michaelc@cs.wisc.edu>, "
1876 "Dmitry Yusupov <dmitry_yus@yahoo.com>, "
1877 "Alex Aizman <itn780@yahoo.com>");
1878 MODULE_DESCRIPTION("iSCSI Transport Interface");
1879 MODULE_LICENSE("GPL");
1880 MODULE_VERSION(ISCSI_TRANSPORT_VERSION
);