31
30
#include "scsi_transport_iscsi.h"
32
31
#include "iscsi_if.h"
34
#define ISCSI_SESSION_ATTRS 8
35
#define ISCSI_CONN_ATTRS 6
33
#define ISCSI_SESSION_ATTRS 11
34
#define ISCSI_CONN_ATTRS 11
35
#define ISCSI_HOST_ATTRS 0
36
#define ISCSI_TRANSPORT_VERSION "2.0-727"
37
38
struct iscsi_internal {
38
40
struct scsi_transport_template t;
39
41
struct iscsi_transport *iscsi_transport;
40
42
struct list_head list;
42
* based on transport capabilities, at register time we set these
43
* bits to tell the transport class it wants attributes displayed
44
* in sysfs or that it can support different iSCSI Data-Path
49
43
struct class_device cdev;
51
* We do not have any private or other attrs.
45
struct class_device_attribute *host_attrs[ISCSI_HOST_ATTRS + 1];
53
46
struct transport_container conn_cont;
54
47
struct class_device_attribute *conn_attrs[ISCSI_CONN_ATTRS + 1];
55
48
struct transport_container session_cont;
56
49
struct class_device_attribute *session_attrs[ISCSI_SESSION_ATTRS + 1];
52
static int iscsi_session_nr; /* sysfs session id for next new session */
60
55
* list of registered transports and lock that must
61
56
* be held while accessing list. The iscsi_transport_lock must
135
148
static struct sock *nls;
136
static int daemon_pid;
137
149
static DEFINE_MUTEX(rx_queue_mutex);
139
struct mempool_zone {
144
struct list_head freequeue;
148
static struct mempool_zone *z_reply;
151
* Z_MAX_* - actual mempool size allocated at the mempool_zone_init() time
152
* Z_HIWAT_* - zone's high watermark when if_error bit will be set to -ENOMEM
153
* so daemon will notice OOM on NETLINK tranposrt level and will
154
* be able to predict or change operational behavior
156
#define Z_MAX_REPLY 8
157
#define Z_HIWAT_REPLY 6
159
#define Z_HIWAT_PDU 6
160
#define Z_MAX_ERROR 16
161
#define Z_HIWAT_ERROR 12
163
151
static LIST_HEAD(sesslist);
164
152
static DEFINE_SPINLOCK(sesslock);
165
153
static LIST_HEAD(connlist);
166
154
static DEFINE_SPINLOCK(connlock);
168
static struct iscsi_cls_session *iscsi_session_lookup(uint64_t handle)
156
static uint32_t iscsi_conn_get_sid(struct iscsi_cls_conn *conn)
158
struct iscsi_cls_session *sess = iscsi_dev_to_session(conn->dev.parent);
163
* Returns the matching session to a given sid
165
static struct iscsi_cls_session *iscsi_session_lookup(uint32_t sid)
170
167
unsigned long flags;
171
168
struct iscsi_cls_session *sess;
173
170
spin_lock_irqsave(&sesslock, flags);
174
171
list_for_each_entry(sess, &sesslist, sess_list) {
175
if (sess == iscsi_ptr(handle)) {
172
if (sess->sid == sid) {
176
173
spin_unlock_irqrestore(&sesslock, flags);
218
216
return dev->release == iscsi_session_release;
222
* iscsi_create_session - create iscsi class session
224
* @transport: iscsi transport
226
* This can be called from a LLD or iscsi_transport
219
static int iscsi_user_scan(struct Scsi_Host *shost, uint channel,
222
struct iscsi_host *ihost = shost->shost_data;
223
struct iscsi_cls_session *session;
225
mutex_lock(&ihost->mutex);
226
list_for_each_entry(session, &ihost->sessions, host_list) {
227
if ((channel == SCAN_WILD_CARD || channel == 0) &&
228
(id == SCAN_WILD_CARD || id == session->target_id))
229
scsi_scan_target(&session->dev, 0,
230
session->target_id, lun, 1);
232
mutex_unlock(&ihost->mutex);
237
static void session_recovery_timedout(void *data)
239
struct iscsi_cls_session *session = data;
241
dev_printk(KERN_INFO, &session->dev, "iscsi: session recovery timed "
242
"out after %d secs\n", session->recovery_tmo);
244
if (session->transport->session_recovery_timedout)
245
session->transport->session_recovery_timedout(session);
247
scsi_target_unblock(&session->dev);
250
void iscsi_unblock_session(struct iscsi_cls_session *session)
252
if (!cancel_delayed_work(&session->recovery_work))
253
flush_scheduled_work();
254
scsi_target_unblock(&session->dev);
256
EXPORT_SYMBOL_GPL(iscsi_unblock_session);
258
void iscsi_block_session(struct iscsi_cls_session *session)
260
scsi_target_block(&session->dev);
261
schedule_delayed_work(&session->recovery_work,
262
session->recovery_tmo * HZ);
264
EXPORT_SYMBOL_GPL(iscsi_block_session);
228
266
struct iscsi_cls_session *
229
iscsi_create_session(struct Scsi_Host *shost, struct iscsi_transport *transport)
267
iscsi_alloc_session(struct Scsi_Host *shost,
268
struct iscsi_transport *transport)
231
270
struct iscsi_cls_session *session;
234
if (!try_module_get(transport->owner))
272
session = kzalloc(sizeof(*session) + transport->sessiondata_size,
237
session = kzalloc(sizeof(*session), GFP_KERNEL);
240
277
session->transport = transport;
278
session->recovery_tmo = 120;
279
INIT_WORK(&session->recovery_work, session_recovery_timedout, session);
280
INIT_LIST_HEAD(&session->host_list);
281
INIT_LIST_HEAD(&session->sess_list);
242
283
/* this is released in the dev's release function */
243
284
scsi_host_get(shost);
244
snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u", shost->host_no);
245
285
session->dev.parent = &shost->shost_gendev;
246
286
session->dev.release = iscsi_session_release;
247
err = device_register(&session->dev);
287
device_initialize(&session->dev);
288
if (transport->sessiondata_size)
289
session->dd_data = &session[1];
292
EXPORT_SYMBOL_GPL(iscsi_alloc_session);
294
int iscsi_add_session(struct iscsi_cls_session *session, unsigned int target_id)
296
struct Scsi_Host *shost = iscsi_session_to_shost(session);
297
struct iscsi_host *ihost;
300
ihost = shost->shost_data;
301
session->sid = iscsi_session_nr++;
302
session->target_id = target_id;
304
snprintf(session->dev.bus_id, BUS_ID_SIZE, "session%u",
306
err = device_add(&session->dev);
249
308
dev_printk(KERN_ERR, &session->dev, "iscsi: could not "
250
309
"register session's dev\n");
253
312
transport_register_device(&session->dev);
314
mutex_lock(&ihost->mutex);
315
list_add(&session->host_list, &ihost->sessions);
316
mutex_unlock(&ihost->mutex);
320
scsi_host_put(shost);
323
EXPORT_SYMBOL_GPL(iscsi_add_session);
326
* iscsi_create_session - create iscsi class session
328
* @transport: iscsi transport
330
* This can be called from a LLD or iscsi_transport.
332
struct iscsi_cls_session *
333
iscsi_create_session(struct Scsi_Host *shost,
334
struct iscsi_transport *transport,
335
unsigned int target_id)
337
struct iscsi_cls_session *session;
339
session = iscsi_alloc_session(shost, transport);
343
if (iscsi_add_session(session, target_id)) {
344
iscsi_free_session(session);
260
module_put(transport->owner);
264
349
EXPORT_SYMBOL_GPL(iscsi_create_session);
351
void iscsi_remove_session(struct iscsi_cls_session *session)
353
struct Scsi_Host *shost = iscsi_session_to_shost(session);
354
struct iscsi_host *ihost = shost->shost_data;
356
if (!cancel_delayed_work(&session->recovery_work))
357
flush_scheduled_work();
359
mutex_lock(&ihost->mutex);
360
list_del(&session->host_list);
361
mutex_unlock(&ihost->mutex);
363
scsi_remove_target(&session->dev);
365
transport_unregister_device(&session->dev);
366
device_del(&session->dev);
368
EXPORT_SYMBOL_GPL(iscsi_remove_session);
370
void iscsi_free_session(struct iscsi_cls_session *session)
372
put_device(&session->dev);
375
EXPORT_SYMBOL_GPL(iscsi_free_session);
267
378
* iscsi_destroy_session - destroy iscsi session
268
379
* @session: iscsi_session
361
477
EXPORT_SYMBOL_GPL(iscsi_destroy_conn);
364
* These functions are used only by software iscsi_transports
365
* which do not allocate and more their scsi_hosts since this
366
* is initiated from userspace.
370
* iSCSI Session's hostdata organization:
372
* *------------------* <== hostdata_session(host->hostdata)
373
* | ptr to class sess|
374
* |------------------| <== iscsi_hostdata(host->hostdata)
375
* | transport's data |
376
* *------------------*
379
#define hostdata_privsize(_t) (sizeof(unsigned long) + _t->hostdata_size + \
380
_t->hostdata_size % sizeof(unsigned long))
382
#define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata))
385
* iscsi_transport_create_session - create iscsi cls session and host
386
* scsit: scsi transport template
387
* transport: iscsi transport template
389
* This can be used by software iscsi_transports that allocate
390
* a session per scsi host.
393
iscsi_transport_create_session(struct scsi_transport_template *scsit,
394
struct iscsi_transport *transport)
396
struct iscsi_cls_session *session;
397
struct Scsi_Host *shost;
400
shost = scsi_host_alloc(transport->host_template,
401
hostdata_privsize(transport));
403
printk(KERN_ERR "iscsi: can not allocate SCSI host for "
409
shost->max_channel = 0;
410
shost->max_lun = transport->max_lun;
411
shost->max_cmd_len = transport->max_cmd_len;
412
shost->transportt = scsit;
413
shost->transportt->create_work_queue = 1;
415
if (scsi_add_host(shost, NULL))
418
session = iscsi_create_session(shost, transport);
422
*(unsigned long*)shost->hostdata = (unsigned long)session;
423
spin_lock_irqsave(&sesslock, flags);
424
list_add(&session->sess_list, &sesslist);
425
spin_unlock_irqrestore(&sesslock, flags);
429
scsi_remove_host(shost);
431
scsi_host_put(shost);
435
EXPORT_SYMBOL_GPL(iscsi_transport_create_session);
438
* iscsi_transport_destroy_session - destroy session and scsi host
441
* This can be used by software iscsi_transports that allocate
442
* a session per scsi host.
444
int iscsi_transport_destroy_session(struct Scsi_Host *shost)
446
struct iscsi_cls_session *session;
449
scsi_remove_host(shost);
450
session = hostdata_session(shost->hostdata);
451
spin_lock_irqsave(&sesslock, flags);
452
list_del(&session->sess_list);
453
spin_unlock_irqrestore(&sesslock, flags);
454
iscsi_destroy_session(session);
455
/* ref from host alloc */
456
scsi_host_put(shost);
460
EXPORT_SYMBOL_GPL(iscsi_transport_destroy_session);
463
480
* iscsi interface functions
465
482
static struct iscsi_internal *
482
static inline struct list_head *skb_to_lh(struct sk_buff *skb)
484
return (struct list_head *)&skb->cb;
488
mempool_zone_alloc_skb(unsigned int gfp_mask, void *pool_data)
490
struct mempool_zone *zone = pool_data;
492
return alloc_skb(zone->size, gfp_mask);
496
mempool_zone_free_skb(void *element, void *pool_data)
502
mempool_zone_complete(struct mempool_zone *zone)
505
struct list_head *lh, *n;
507
spin_lock_irqsave(&zone->freelock, flags);
508
list_for_each_safe(lh, n, &zone->freequeue) {
509
struct sk_buff *skb = (struct sk_buff *)((char *)lh -
510
offsetof(struct sk_buff, cb));
511
if (!skb_shared(skb)) {
512
list_del(skb_to_lh(skb));
513
mempool_free(skb, zone->pool);
514
atomic_dec(&zone->allocated);
517
spin_unlock_irqrestore(&zone->freelock, flags);
520
static struct mempool_zone *
521
mempool_zone_init(unsigned max, unsigned size, unsigned hiwat)
523
struct mempool_zone *zp;
525
zp = kzalloc(sizeof(*zp), GFP_KERNEL);
531
INIT_LIST_HEAD(&zp->freequeue);
532
spin_lock_init(&zp->freelock);
533
atomic_set(&zp->allocated, 0);
535
zp->pool = mempool_create(max, mempool_zone_alloc_skb,
536
mempool_zone_free_skb, zp);
545
static void mempool_zone_destroy(struct mempool_zone *zp)
547
mempool_destroy(zp->pool);
551
static struct sk_buff*
552
mempool_zone_get_skb(struct mempool_zone *zone)
556
skb = mempool_alloc(zone->pool, GFP_ATOMIC);
558
atomic_inc(&zone->allocated);
563
iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb)
569
rc = netlink_unicast(nls, skb, daemon_pid, MSG_DONTWAIT);
571
mempool_free(skb, zone->pool);
500
iscsi_broadcast_skb(struct sk_buff *skb, gfp_t gfp)
504
rc = netlink_broadcast(nls, skb, 0, 1, gfp);
506
printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc);
514
iscsi_unicast_skb(struct sk_buff *skb, int pid)
518
rc = netlink_unicast(nls, skb, pid, MSG_DONTWAIT);
572
520
printk(KERN_ERR "iscsi: can not unicast skb (%d)\n", rc);
576
spin_lock_irqsave(&zone->freelock, flags);
577
list_add(skb_to_lh(skb), &zone->freequeue);
578
spin_unlock_irqrestore(&zone->freelock, flags);
603
nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
550
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
604
551
ev = NLMSG_DATA(nlh);
605
552
memset(ev, 0, sizeof(*ev));
606
553
ev->transport_handle = iscsi_handle(conn->transport);
607
554
ev->type = ISCSI_KEVENT_RECV_PDU;
608
if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
609
ev->iferror = -ENOMEM;
610
ev->r.recv_req.conn_handle = iscsi_handle(conn);
555
ev->r.recv_req.cid = conn->cid;
556
ev->r.recv_req.sid = iscsi_conn_get_sid(conn);
611
557
pdu = (char*)ev + sizeof(*ev);
612
558
memcpy(pdu, hdr, sizeof(struct iscsi_hdr));
613
559
memcpy(pdu + sizeof(struct iscsi_hdr), data, data_size);
615
return iscsi_unicast_skb(conn->z_pdu, skb);
561
return iscsi_unicast_skb(skb, priv->daemon_pid);
617
563
EXPORT_SYMBOL_GPL(iscsi_recv_pdu);
621
567
struct nlmsghdr *nlh;
622
568
struct sk_buff *skb;
623
569
struct iscsi_uevent *ev;
570
struct iscsi_internal *priv;
624
571
int len = NLMSG_SPACE(sizeof(*ev));
626
mempool_zone_complete(conn->z_error);
573
priv = iscsi_if_transport_lookup(conn->transport);
628
skb = mempool_zone_get_skb(conn->z_error);
577
skb = alloc_skb(len, GFP_ATOMIC);
630
579
dev_printk(KERN_ERR, &conn->dev, "iscsi: gracefully ignored "
631
580
"conn error (%d)\n", error);
635
nlh = __nlmsg_put(skb, daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
584
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
636
585
ev = NLMSG_DATA(nlh);
637
586
ev->transport_handle = iscsi_handle(conn->transport);
638
587
ev->type = ISCSI_KEVENT_CONN_ERROR;
639
if (atomic_read(&conn->z_error->allocated) >= conn->z_error->hiwat)
640
ev->iferror = -ENOMEM;
641
588
ev->r.connerror.error = error;
642
ev->r.connerror.conn_handle = iscsi_handle(conn);
589
ev->r.connerror.cid = conn->cid;
590
ev->r.connerror.sid = iscsi_conn_get_sid(conn);
644
iscsi_unicast_skb(conn->z_error, skb);
592
iscsi_broadcast_skb(skb, GFP_ATOMIC);
646
594
dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n",
683
629
struct iscsi_cls_conn *conn;
684
630
struct nlmsghdr *nlhstat;
685
631
struct iscsi_uevent *evstat;
632
struct iscsi_internal *priv;
686
633
int len = NLMSG_SPACE(sizeof(*ev) +
687
634
sizeof(struct iscsi_stats) +
688
635
sizeof(struct iscsi_stats_custom) *
689
636
ISCSI_STATS_CUSTOM_MAX);
692
conn = iscsi_conn_lookup(ev->u.get_stats.conn_handle);
639
priv = iscsi_if_transport_lookup(transport);
643
conn = iscsi_conn_lookup(ev->u.get_stats.sid, ev->u.get_stats.cid);
699
mempool_zone_complete(conn->z_pdu);
701
skbstat = mempool_zone_get_skb(conn->z_pdu);
650
skbstat = alloc_skb(len, GFP_KERNEL);
703
652
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not "
704
653
"deliver stats: OOM\n");
708
nlhstat = __nlmsg_put(skbstat, daemon_pid, 0, 0,
657
nlhstat = __nlmsg_put(skbstat, priv->daemon_pid, 0, 0,
709
658
(len - sizeof(*nlhstat)), 0);
710
659
evstat = NLMSG_DATA(nlhstat);
711
660
memset(evstat, 0, sizeof(*evstat));
712
661
evstat->transport_handle = iscsi_handle(conn->transport);
713
662
evstat->type = nlh->nlmsg_type;
714
if (atomic_read(&conn->z_pdu->allocated) >= conn->z_pdu->hiwat)
715
evstat->iferror = -ENOMEM;
716
evstat->u.get_stats.conn_handle =
717
ev->u.get_stats.conn_handle;
663
evstat->u.get_stats.cid =
665
evstat->u.get_stats.sid =
718
667
stats = (struct iscsi_stats *)
719
668
((char*)evstat + sizeof(*evstat));
720
669
memset(stats, 0, sizeof(*stats));
729
678
skb_trim(skbstat, NLMSG_ALIGN(actual_size));
730
679
nlhstat->nlmsg_len = actual_size;
732
err = iscsi_unicast_skb(conn->z_pdu, skbstat);
681
err = iscsi_unicast_skb(skbstat, priv->daemon_pid);
733
682
} while (err < 0 && err != -ECONNREFUSED);
688
* iscsi_if_destroy_session_done - send session destr. completion event
689
* @conn: last connection for session
691
* This is called by HW iscsi LLDs to notify userpsace that its HW has
694
int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn)
696
struct iscsi_internal *priv;
697
struct iscsi_cls_session *session;
698
struct Scsi_Host *shost;
699
struct iscsi_uevent *ev;
701
struct nlmsghdr *nlh;
703
int rc, len = NLMSG_SPACE(sizeof(*ev));
705
priv = iscsi_if_transport_lookup(conn->transport);
709
session = iscsi_dev_to_session(conn->dev.parent);
710
shost = iscsi_session_to_shost(session);
712
skb = alloc_skb(len, GFP_KERNEL);
714
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
715
"session creation event\n");
719
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
720
ev = NLMSG_DATA(nlh);
721
ev->transport_handle = iscsi_handle(conn->transport);
722
ev->type = ISCSI_KEVENT_DESTROY_SESSION;
723
ev->r.d_session.host_no = shost->host_no;
724
ev->r.d_session.sid = session->sid;
727
* this will occur if the daemon is not up, so we just warn
728
* the user and when the daemon is restarted it will handle it
730
rc = iscsi_broadcast_skb(skb, GFP_KERNEL);
732
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
733
"session destruction event. Check iscsi daemon\n");
735
spin_lock_irqsave(&sesslock, flags);
736
list_del(&session->sess_list);
737
spin_unlock_irqrestore(&sesslock, flags);
739
spin_lock_irqsave(&connlock, flags);
741
list_del(&conn->conn_list);
742
spin_unlock_irqrestore(&connlock, flags);
746
EXPORT_SYMBOL_GPL(iscsi_if_destroy_session_done);
749
* iscsi_if_create_session_done - send session creation completion event
750
* @conn: leading connection for session
752
* This is called by HW iscsi LLDs to notify userpsace that its HW has
753
* created a session or a existing session is back in the logged in state.
755
int iscsi_if_create_session_done(struct iscsi_cls_conn *conn)
757
struct iscsi_internal *priv;
758
struct iscsi_cls_session *session;
759
struct Scsi_Host *shost;
760
struct iscsi_uevent *ev;
762
struct nlmsghdr *nlh;
764
int rc, len = NLMSG_SPACE(sizeof(*ev));
766
priv = iscsi_if_transport_lookup(conn->transport);
770
session = iscsi_dev_to_session(conn->dev.parent);
771
shost = iscsi_session_to_shost(session);
773
skb = alloc_skb(len, GFP_KERNEL);
775
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
776
"session creation event\n");
780
nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0);
781
ev = NLMSG_DATA(nlh);
782
ev->transport_handle = iscsi_handle(conn->transport);
783
ev->type = ISCSI_UEVENT_CREATE_SESSION;
784
ev->r.c_session_ret.host_no = shost->host_no;
785
ev->r.c_session_ret.sid = session->sid;
788
* this will occur if the daemon is not up, so we just warn
789
* the user and when the daemon is restarted it will handle it
791
rc = iscsi_broadcast_skb(skb, GFP_KERNEL);
793
dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of "
794
"session creation event. Check iscsi daemon\n");
796
spin_lock_irqsave(&sesslock, flags);
797
list_add(&session->sess_list, &sesslist);
798
spin_unlock_irqrestore(&sesslock, flags);
800
spin_lock_irqsave(&connlock, flags);
801
list_add(&conn->conn_list, &connlist);
803
spin_unlock_irqrestore(&connlock, flags);
806
EXPORT_SYMBOL_GPL(iscsi_if_create_session_done);
739
809
iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev)
741
811
struct iscsi_transport *transport = priv->iscsi_transport;
742
812
struct iscsi_cls_session *session;
745
session = transport->create_session(&priv->t,
816
session = transport->create_session(transport, &priv->t,
746
817
ev->u.c_session.initial_cmdsn,
751
ev->r.c_session_ret.session_handle = iscsi_handle(session);
752
ev->r.c_session_ret.sid = sid;
822
spin_lock_irqsave(&sesslock, flags);
823
list_add(&session->sess_list, &sesslist);
824
spin_unlock_irqrestore(&sesslock, flags);
826
ev->r.c_session_ret.host_no = hostno;
827
ev->r.c_session_ret.sid = session->sid;
760
835
struct iscsi_cls_session *session;
761
836
unsigned long flags;
763
session = iscsi_session_lookup(ev->u.c_conn.session_handle);
838
session = iscsi_session_lookup(ev->u.c_conn.sid);
840
printk(KERN_ERR "iscsi: invalid session %d\n",
767
845
conn = transport->create_conn(session, ev->u.c_conn.cid);
847
printk(KERN_ERR "iscsi: couldn't create a new "
848
"connection for session %d\n",
771
conn->z_pdu = mempool_zone_init(Z_MAX_PDU,
772
NLMSG_SPACE(sizeof(struct iscsi_uevent) +
773
sizeof(struct iscsi_hdr) +
774
DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH),
777
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
778
"pdu zone for new conn\n");
782
conn->z_error = mempool_zone_init(Z_MAX_ERROR,
783
NLMSG_SPACE(sizeof(struct iscsi_uevent)),
785
if (!conn->z_error) {
786
dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate "
787
"error zone for new conn\n");
791
ev->r.handle = iscsi_handle(conn);
853
ev->r.c_conn_ret.sid = session->sid;
854
ev->r.c_conn_ret.cid = conn->cid;
793
856
spin_lock_irqsave(&connlock, flags);
794
857
list_add(&conn->conn_list, &connlist);
820
875
list_del(&conn->conn_list);
821
876
spin_unlock_irqrestore(&connlock, flags);
824
z_error = conn->z_error;
826
878
if (transport->destroy_conn)
827
879
transport->destroy_conn(conn);
829
mempool_zone_destroy(z_pdu);
830
mempool_zone_destroy(z_error);
884
iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
886
char *data = (char*)ev + sizeof(*ev);
887
struct iscsi_cls_conn *conn;
888
struct iscsi_cls_session *session;
889
int err = 0, value = 0;
891
session = iscsi_session_lookup(ev->u.set_param.sid);
892
conn = iscsi_conn_lookup(ev->u.set_param.sid, ev->u.set_param.cid);
893
if (!conn || !session)
896
switch (ev->u.set_param.param) {
897
case ISCSI_PARAM_SESS_RECOVERY_TMO:
898
sscanf(data, "%d", &value);
900
session->recovery_tmo = value;
903
err = transport->set_param(conn, ev->u.set_param.param,
904
data, ev->u.set_param.len);
911
iscsi_if_transport_ep(struct iscsi_transport *transport,
912
struct iscsi_uevent *ev, int msg_type)
914
struct sockaddr *dst_addr;
918
case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
919
if (!transport->ep_connect)
922
dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
923
rc = transport->ep_connect(dst_addr,
924
ev->u.ep_connect.non_blocking,
925
&ev->r.ep_connect_ret.handle);
927
case ISCSI_UEVENT_TRANSPORT_EP_POLL:
928
if (!transport->ep_poll)
931
ev->r.retcode = transport->ep_poll(ev->u.ep_poll.ep_handle,
932
ev->u.ep_poll.timeout_ms);
934
case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
935
if (!transport->ep_disconnect)
938
transport->ep_disconnect(ev->u.ep_disconnect.ep_handle);
945
iscsi_tgt_dscvr(struct iscsi_transport *transport,
946
struct iscsi_uevent *ev)
948
struct sockaddr *dst_addr;
950
if (!transport->tgt_dscvr)
953
dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
954
return transport->tgt_dscvr(ev->u.tgt_dscvr.type,
955
ev->u.tgt_dscvr.host_no,
956
ev->u.tgt_dscvr.enable, dst_addr);
836
960
iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
868
999
err = iscsi_if_destroy_conn(transport, ev);
870
1001
case ISCSI_UEVENT_BIND_CONN:
871
session = iscsi_session_lookup(ev->u.b_conn.session_handle);
872
conn = iscsi_conn_lookup(ev->u.b_conn.conn_handle);
1002
session = iscsi_session_lookup(ev->u.b_conn.sid);
1003
conn = iscsi_conn_lookup(ev->u.b_conn.sid, ev->u.b_conn.cid);
874
1005
if (session && conn)
875
1006
ev->r.retcode = transport->bind_conn(session, conn,
876
ev->u.b_conn.transport_fd,
1007
ev->u.b_conn.transport_eph,
877
1008
ev->u.b_conn.is_leading);
881
1012
case ISCSI_UEVENT_SET_PARAM:
882
conn = iscsi_conn_lookup(ev->u.set_param.conn_handle);
884
ev->r.retcode = transport->set_param(conn,
885
ev->u.set_param.param, ev->u.set_param.value);
1013
err = iscsi_set_param(transport, ev);
889
1015
case ISCSI_UEVENT_START_CONN:
890
conn = iscsi_conn_lookup(ev->u.start_conn.conn_handle);
1016
conn = iscsi_conn_lookup(ev->u.start_conn.sid, ev->u.start_conn.cid);
892
1018
ev->r.retcode = transport->start_conn(conn);
897
1022
case ISCSI_UEVENT_STOP_CONN:
898
conn = iscsi_conn_lookup(ev->u.stop_conn.conn_handle);
1023
conn = iscsi_conn_lookup(ev->u.stop_conn.sid, ev->u.stop_conn.cid);
900
1025
transport->stop_conn(conn, ev->u.stop_conn.flag);
904
1029
case ISCSI_UEVENT_SEND_PDU:
905
conn = iscsi_conn_lookup(ev->u.send_pdu.conn_handle);
1030
conn = iscsi_conn_lookup(ev->u.send_pdu.sid, ev->u.send_pdu.cid);
907
1032
ev->r.retcode = transport->send_pdu(conn,
908
1033
(struct iscsi_hdr*)((char*)ev + sizeof(*ev)),
988
1119
#define iscsi_cdev_to_conn(_cdev) \
989
1120
iscsi_dev_to_conn(_cdev->dev)
1122
#define ISCSI_CLASS_ATTR(_prefix,_name,_mode,_show,_store) \
1123
struct class_device_attribute class_device_attr_##_prefix##_##_name = \
1124
__ATTR(_name,_mode,_show,_store)
992
1127
* iSCSI connection attrs
994
#define iscsi_conn_int_attr_show(param, format) \
1129
#define iscsi_conn_attr_show(param) \
995
1130
static ssize_t \
996
show_conn_int_param_##param(struct class_device *cdev, char *buf) \
1131
show_conn_param_##param(struct class_device *cdev, char *buf) \
998
uint32_t value = 0; \
999
1133
struct iscsi_cls_conn *conn = iscsi_cdev_to_conn(cdev); \
1000
1134
struct iscsi_transport *t = conn->transport; \
1002
t->get_conn_param(conn, param, &value); \
1003
return snprintf(buf, 20, format"\n", value); \
1135
return t->get_conn_param(conn, param, buf); \
1006
#define iscsi_conn_int_attr(field, param, format) \
1007
iscsi_conn_int_attr_show(param, format) \
1008
static CLASS_DEVICE_ATTR(field, S_IRUGO, show_conn_int_param_##param, NULL);
1138
#define iscsi_conn_attr(field, param) \
1139
iscsi_conn_attr_show(param) \
1140
static ISCSI_CLASS_ATTR(conn, field, S_IRUGO, show_conn_param_##param, \
1010
iscsi_conn_int_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH, "%u");
1011
iscsi_conn_int_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH, "%u");
1012
iscsi_conn_int_attr(header_digest, ISCSI_PARAM_HDRDGST_EN, "%d");
1013
iscsi_conn_int_attr(data_digest, ISCSI_PARAM_DATADGST_EN, "%d");
1014
iscsi_conn_int_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN, "%d");
1015
iscsi_conn_int_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN, "%d");
1143
iscsi_conn_attr(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
1144
iscsi_conn_attr(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
1145
iscsi_conn_attr(header_digest, ISCSI_PARAM_HDRDGST_EN);
1146
iscsi_conn_attr(data_digest, ISCSI_PARAM_DATADGST_EN);
1147
iscsi_conn_attr(ifmarker, ISCSI_PARAM_IFMARKER_EN);
1148
iscsi_conn_attr(ofmarker, ISCSI_PARAM_OFMARKER_EN);
1149
iscsi_conn_attr(persistent_port, ISCSI_PARAM_PERSISTENT_PORT);
1150
iscsi_conn_attr(port, ISCSI_PARAM_CONN_PORT);
1151
iscsi_conn_attr(exp_statsn, ISCSI_PARAM_EXP_STATSN);
1152
iscsi_conn_attr(persistent_address, ISCSI_PARAM_PERSISTENT_ADDRESS);
1153
iscsi_conn_attr(address, ISCSI_PARAM_CONN_ADDRESS);
1017
1155
#define iscsi_cdev_to_session(_cdev) \
1018
1156
iscsi_dev_to_session(_cdev->dev)
1021
1159
* iSCSI session attrs
1023
#define iscsi_session_int_attr_show(param, format) \
1161
#define iscsi_session_attr_show(param) \
1024
1162
static ssize_t \
1025
show_session_int_param_##param(struct class_device *cdev, char *buf) \
1163
show_session_param_##param(struct class_device *cdev, char *buf) \
1027
uint32_t value = 0; \
1028
struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
1165
struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev); \
1029
1166
struct iscsi_transport *t = session->transport; \
1031
t->get_session_param(session, param, &value); \
1032
return snprintf(buf, 20, format"\n", value); \
1035
#define iscsi_session_int_attr(field, param, format) \
1036
iscsi_session_int_attr_show(param, format) \
1037
static CLASS_DEVICE_ATTR(field, S_IRUGO, show_session_int_param_##param, NULL);
1039
iscsi_session_int_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN, "%d");
1040
iscsi_session_int_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T, "%hu");
1041
iscsi_session_int_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN, "%d");
1042
iscsi_session_int_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST, "%u");
1043
iscsi_session_int_attr(max_burst_len, ISCSI_PARAM_MAX_BURST, "%u");
1044
iscsi_session_int_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN, "%d");
1045
iscsi_session_int_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN, "%d");
1046
iscsi_session_int_attr(erl, ISCSI_PARAM_ERL, "%d");
1048
#define SETUP_SESSION_RD_ATTR(field, param) \
1049
if (priv->param_mask & (1 << param)) { \
1050
priv->session_attrs[count] = &class_device_attr_##field;\
1054
#define SETUP_CONN_RD_ATTR(field, param) \
1055
if (priv->param_mask & (1 << param)) { \
1056
priv->conn_attrs[count] = &class_device_attr_##field; \
1167
return t->get_session_param(session, param, buf); \
1170
#define iscsi_session_attr(field, param) \
1171
iscsi_session_attr_show(param) \
1172
static ISCSI_CLASS_ATTR(sess, field, S_IRUGO, show_session_param_##param, \
1175
iscsi_session_attr(targetname, ISCSI_PARAM_TARGET_NAME);
1176
iscsi_session_attr(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN);
1177
iscsi_session_attr(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T);
1178
iscsi_session_attr(immediate_data, ISCSI_PARAM_IMM_DATA_EN);
1179
iscsi_session_attr(first_burst_len, ISCSI_PARAM_FIRST_BURST);
1180
iscsi_session_attr(max_burst_len, ISCSI_PARAM_MAX_BURST);
1181
iscsi_session_attr(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN);
1182
iscsi_session_attr(data_seq_in_order, ISCSI_PARAM_DATASEQ_INORDER_EN);
1183
iscsi_session_attr(erl, ISCSI_PARAM_ERL);
1184
iscsi_session_attr(tpgt, ISCSI_PARAM_TPGT);
1186
#define iscsi_priv_session_attr_show(field, format) \
1188
show_priv_session_##field(struct class_device *cdev, char *buf) \
1190
struct iscsi_cls_session *session = iscsi_cdev_to_session(cdev);\
1191
return sprintf(buf, format"\n", session->field); \
1194
#define iscsi_priv_session_attr(field, format) \
1195
iscsi_priv_session_attr_show(field, format) \
1196
static ISCSI_CLASS_ATTR(priv_sess, field, S_IRUGO, show_priv_session_##field, \
1198
iscsi_priv_session_attr(recovery_tmo, "%d");
1200
#define SETUP_PRIV_SESSION_RD_ATTR(field) \
1202
priv->session_attrs[count] = &class_device_attr_priv_sess_##field; \
1207
#define SETUP_SESSION_RD_ATTR(field, param_flag) \
1209
if (tt->param_mask & param_flag) { \
1210
priv->session_attrs[count] = &class_device_attr_sess_##field; \
1215
#define SETUP_CONN_RD_ATTR(field, param_flag) \
1217
if (tt->param_mask & param_flag) { \
1218
priv->conn_attrs[count] = &class_device_attr_conn_##field; \
1060
1223
static int iscsi_session_match(struct attribute_container *cont,
1061
1224
struct device *dev)
1134
1317
goto unregister_cdev;
1136
/* setup parameters mask */
1137
priv->param_mask = 0xFFFFFFFF;
1138
if (!(tt->caps & CAP_MULTI_R2T))
1139
priv->param_mask &= ~(1 << ISCSI_PARAM_MAX_R2T);
1140
if (!(tt->caps & CAP_HDRDGST))
1141
priv->param_mask &= ~(1 << ISCSI_PARAM_HDRDGST_EN);
1142
if (!(tt->caps & CAP_DATADGST))
1143
priv->param_mask &= ~(1 << ISCSI_PARAM_DATADGST_EN);
1144
if (!(tt->caps & CAP_MARKERS)) {
1145
priv->param_mask &= ~(1 << ISCSI_PARAM_IFMARKER_EN);
1146
priv->param_mask &= ~(1 << ISCSI_PARAM_OFMARKER_EN);
1319
/* host parameters */
1320
priv->t.host_attrs.ac.attrs = &priv->host_attrs[0];
1321
priv->t.host_attrs.ac.class = &iscsi_host_class.class;
1322
priv->t.host_attrs.ac.match = iscsi_host_match;
1323
priv->t.host_size = sizeof(struct iscsi_host);
1324
priv->host_attrs[0] = NULL;
1325
transport_container_register(&priv->t.host_attrs);
1149
1327
/* connection parameters */
1150
1328
priv->conn_cont.ac.attrs = &priv->conn_attrs[0];
1152
1330
priv->conn_cont.ac.match = iscsi_conn_match;
1153
1331
transport_container_register(&priv->conn_cont);
1155
SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_PARAM_MAX_RECV_DLENGTH);
1156
SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_PARAM_MAX_XMIT_DLENGTH);
1157
SETUP_CONN_RD_ATTR(header_digest, ISCSI_PARAM_HDRDGST_EN);
1158
SETUP_CONN_RD_ATTR(data_digest, ISCSI_PARAM_DATADGST_EN);
1159
SETUP_CONN_RD_ATTR(ifmarker, ISCSI_PARAM_IFMARKER_EN);
1160
SETUP_CONN_RD_ATTR(ofmarker, ISCSI_PARAM_OFMARKER_EN);
1333
SETUP_CONN_RD_ATTR(max_recv_dlength, ISCSI_MAX_RECV_DLENGTH);
1334
SETUP_CONN_RD_ATTR(max_xmit_dlength, ISCSI_MAX_XMIT_DLENGTH);
1335
SETUP_CONN_RD_ATTR(header_digest, ISCSI_HDRDGST_EN);
1336
SETUP_CONN_RD_ATTR(data_digest, ISCSI_DATADGST_EN);
1337
SETUP_CONN_RD_ATTR(ifmarker, ISCSI_IFMARKER_EN);
1338
SETUP_CONN_RD_ATTR(ofmarker, ISCSI_OFMARKER_EN);
1339
SETUP_CONN_RD_ATTR(address, ISCSI_CONN_ADDRESS);
1340
SETUP_CONN_RD_ATTR(port, ISCSI_CONN_PORT);
1341
SETUP_CONN_RD_ATTR(exp_statsn, ISCSI_EXP_STATSN);
1342
SETUP_CONN_RD_ATTR(persistent_address, ISCSI_PERSISTENT_ADDRESS);
1343
SETUP_CONN_RD_ATTR(persistent_port, ISCSI_PERSISTENT_PORT);
1162
1345
BUG_ON(count > ISCSI_CONN_ATTRS);
1163
1346
priv->conn_attrs[count] = NULL;
1169
1352
priv->session_cont.ac.match = iscsi_session_match;
1170
1353
transport_container_register(&priv->session_cont);
1172
SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_PARAM_INITIAL_R2T_EN);
1173
SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_PARAM_MAX_R2T);
1174
SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_PARAM_IMM_DATA_EN);
1175
SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_PARAM_FIRST_BURST);
1176
SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_PARAM_MAX_BURST);
1177
SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PARAM_PDU_INORDER_EN);
1178
SETUP_SESSION_RD_ATTR(data_seq_in_order,ISCSI_PARAM_DATASEQ_INORDER_EN)
1179
SETUP_SESSION_RD_ATTR(erl, ISCSI_PARAM_ERL);
1355
SETUP_SESSION_RD_ATTR(initial_r2t, ISCSI_INITIAL_R2T_EN);
1356
SETUP_SESSION_RD_ATTR(max_outstanding_r2t, ISCSI_MAX_R2T);
1357
SETUP_SESSION_RD_ATTR(immediate_data, ISCSI_IMM_DATA_EN);
1358
SETUP_SESSION_RD_ATTR(first_burst_len, ISCSI_FIRST_BURST);
1359
SETUP_SESSION_RD_ATTR(max_burst_len, ISCSI_MAX_BURST);
1360
SETUP_SESSION_RD_ATTR(data_pdu_in_order, ISCSI_PDU_INORDER_EN);
1361
SETUP_SESSION_RD_ATTR(data_seq_in_order, ISCSI_DATASEQ_INORDER_EN);
1362
SETUP_SESSION_RD_ATTR(erl, ISCSI_ERL);
1363
SETUP_SESSION_RD_ATTR(targetname, ISCSI_TARGET_NAME);
1364
SETUP_SESSION_RD_ATTR(tpgt, ISCSI_TPGT);
1365
SETUP_PRIV_SESSION_RD_ATTR(recovery_tmo);
1181
1367
BUG_ON(count > ISCSI_SESSION_ATTRS);
1182
1368
priv->session_attrs[count] = NULL;
1224
1411
EXPORT_SYMBOL_GPL(iscsi_unregister_transport);
1227
iscsi_rcv_nl_event(struct notifier_block *this, unsigned long event, void *ptr)
1229
struct netlink_notify *n = ptr;
1231
if (event == NETLINK_URELEASE &&
1232
n->protocol == NETLINK_ISCSI && n->pid) {
1233
struct iscsi_cls_conn *conn;
1234
unsigned long flags;
1236
mempool_zone_complete(z_reply);
1237
spin_lock_irqsave(&connlock, flags);
1238
list_for_each_entry(conn, &connlist, conn_list) {
1239
mempool_zone_complete(conn->z_error);
1240
mempool_zone_complete(conn->z_pdu);
1242
spin_unlock_irqrestore(&connlock, flags);
1248
static struct notifier_block iscsi_nl_notifier = {
1249
.notifier_call = iscsi_rcv_nl_event,
1252
1413
static __init int iscsi_transport_init(void)
1417
printk(KERN_INFO "Loading iSCSI transport class v%s.\n",
1418
ISCSI_TRANSPORT_VERSION);
1256
1420
err = class_register(&iscsi_transport_class);
1424
err = transport_class_register(&iscsi_host_class);
1426
goto unregister_transport_class;
1260
1428
err = transport_class_register(&iscsi_connection_class);
1262
goto unregister_transport_class;
1430
goto unregister_host_class;
1264
1432
err = transport_class_register(&iscsi_session_class);
1266
1434
goto unregister_conn_class;
1268
err = netlink_register_notifier(&iscsi_nl_notifier);
1270
goto unregister_session_class;
1272
1436
nls = netlink_kernel_create(NETLINK_ISCSI, 1, iscsi_if_rx,
1275
1439
err = -ENOBUFS;
1276
goto unregister_notifier;
1440
goto unregister_session_class;
1279
z_reply = mempool_zone_init(Z_MAX_REPLY,
1280
NLMSG_SPACE(sizeof(struct iscsi_uevent)), Z_HIWAT_REPLY);
1284
sock_release(nls->sk_socket);
1285
unregister_notifier:
1286
netlink_unregister_notifier(&iscsi_nl_notifier);
1287
1445
unregister_session_class:
1288
1446
transport_class_unregister(&iscsi_session_class);
1289
1447
unregister_conn_class:
1290
1448
transport_class_unregister(&iscsi_connection_class);
1449
unregister_host_class:
1450
transport_class_unregister(&iscsi_host_class);
1291
1451
unregister_transport_class:
1292
1452
class_unregister(&iscsi_transport_class);