diff options
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 309 | ||||
-rw-r--r-- | include/scsi/iscsi_if.h | 23 | ||||
-rw-r--r-- | include/scsi/scsi_transport_iscsi.h | 3 |
3 files changed, 235 insertions, 100 deletions
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index 7963c0538de5..7b9e8fa1a4e0 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -413,11 +413,59 @@ int iscsi_destroy_session(struct iscsi_cls_session *session) | |||
413 | } | 413 | } |
414 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); | 414 | EXPORT_SYMBOL_GPL(iscsi_destroy_session); |
415 | 415 | ||
416 | static void mempool_zone_destroy(struct mempool_zone *zp) | ||
417 | { | ||
418 | mempool_destroy(zp->pool); | ||
419 | kfree(zp); | ||
420 | } | ||
421 | |||
422 | static void* | ||
423 | mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) | ||
424 | { | ||
425 | struct mempool_zone *zone = pool_data; | ||
426 | |||
427 | return alloc_skb(zone->size, gfp_mask); | ||
428 | } | ||
429 | |||
430 | static void | ||
431 | mempool_zone_free_skb(void *element, void *pool_data) | ||
432 | { | ||
433 | kfree_skb(element); | ||
434 | } | ||
435 | |||
436 | static struct mempool_zone * | ||
437 | mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) | ||
438 | { | ||
439 | struct mempool_zone *zp; | ||
440 | |||
441 | zp = kzalloc(sizeof(*zp), GFP_KERNEL); | ||
442 | if (!zp) | ||
443 | return NULL; | ||
444 | |||
445 | zp->size = size; | ||
446 | zp->hiwat = hiwat; | ||
447 | INIT_LIST_HEAD(&zp->freequeue); | ||
448 | spin_lock_init(&zp->freelock); | ||
449 | atomic_set(&zp->allocated, 0); | ||
450 | |||
451 | zp->pool = mempool_create(max, mempool_zone_alloc_skb, | ||
452 | mempool_zone_free_skb, zp); | ||
453 | if (!zp->pool) { | ||
454 | kfree(zp); | ||
455 | return NULL; | ||
456 | } | ||
457 | |||
458 | return zp; | ||
459 | } | ||
460 | |||
416 | static void iscsi_conn_release(struct device *dev) | 461 | static void iscsi_conn_release(struct device *dev) |
417 | { | 462 | { |
418 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); | 463 | struct iscsi_cls_conn *conn = iscsi_dev_to_conn(dev); |
419 | struct device *parent = conn->dev.parent; | 464 | struct device *parent = conn->dev.parent; |
420 | 465 | ||
466 | mempool_zone_destroy(conn->z_pdu); | ||
467 | mempool_zone_destroy(conn->z_error); | ||
468 | |||
421 | kfree(conn); | 469 | kfree(conn); |
422 | put_device(parent); | 470 | put_device(parent); |
423 | } | 471 | } |
@@ -427,6 +475,31 @@ static int iscsi_is_conn_dev(const struct device *dev) | |||
427 | return dev->release == iscsi_conn_release; | 475 | return dev->release == iscsi_conn_release; |
428 | } | 476 | } |
429 | 477 | ||
478 | static int iscsi_create_event_pools(struct iscsi_cls_conn *conn) | ||
479 | { | ||
480 | conn->z_pdu = mempool_zone_init(Z_MAX_PDU, | ||
481 | NLMSG_SPACE(sizeof(struct iscsi_uevent) + | ||
482 | sizeof(struct iscsi_hdr) + | ||
483 | DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), | ||
484 | Z_HIWAT_PDU); | ||
485 | if (!conn->z_pdu) { | ||
486 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
487 | "pdu zone for new conn\n"); | ||
488 | return -ENOMEM; | ||
489 | } | ||
490 | |||
491 | conn->z_error = mempool_zone_init(Z_MAX_ERROR, | ||
492 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), | ||
493 | Z_HIWAT_ERROR); | ||
494 | if (!conn->z_error) { | ||
495 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
496 | "error zone for new conn\n"); | ||
497 | mempool_zone_destroy(conn->z_pdu); | ||
498 | return -ENOMEM; | ||
499 | } | ||
500 | return 0; | ||
501 | } | ||
502 | |||
430 | /** | 503 | /** |
431 | * iscsi_create_conn - create iscsi class connection | 504 | * iscsi_create_conn - create iscsi class connection |
432 | * @session: iscsi cls session | 505 | * @session: iscsi cls session |
@@ -459,9 +532,12 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
459 | conn->transport = transport; | 532 | conn->transport = transport; |
460 | conn->cid = cid; | 533 | conn->cid = cid; |
461 | 534 | ||
535 | if (iscsi_create_event_pools(conn)) | ||
536 | goto free_conn; | ||
537 | |||
462 | /* this is released in the dev's release function */ | 538 | /* this is released in the dev's release function */ |
463 | if (!get_device(&session->dev)) | 539 | if (!get_device(&session->dev)) |
464 | goto free_conn; | 540 | goto free_conn_pools; |
465 | 541 | ||
466 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", | 542 | snprintf(conn->dev.bus_id, BUS_ID_SIZE, "connection%d:%u", |
467 | session->sid, cid); | 543 | session->sid, cid); |
@@ -478,6 +554,8 @@ iscsi_create_conn(struct iscsi_cls_session *session, uint32_t cid) | |||
478 | 554 | ||
479 | release_parent_ref: | 555 | release_parent_ref: |
480 | put_device(&session->dev); | 556 | put_device(&session->dev); |
557 | free_conn_pools: | ||
558 | |||
481 | free_conn: | 559 | free_conn: |
482 | kfree(conn); | 560 | kfree(conn); |
483 | return NULL; | 561 | return NULL; |
@@ -525,20 +603,6 @@ static inline struct list_head *skb_to_lh(struct sk_buff *skb) | |||
525 | return (struct list_head *)&skb->cb; | 603 | return (struct list_head *)&skb->cb; |
526 | } | 604 | } |
527 | 605 | ||
528 | static void* | ||
529 | mempool_zone_alloc_skb(gfp_t gfp_mask, void *pool_data) | ||
530 | { | ||
531 | struct mempool_zone *zone = pool_data; | ||
532 | |||
533 | return alloc_skb(zone->size, gfp_mask); | ||
534 | } | ||
535 | |||
536 | static void | ||
537 | mempool_zone_free_skb(void *element, void *pool_data) | ||
538 | { | ||
539 | kfree_skb(element); | ||
540 | } | ||
541 | |||
542 | static void | 606 | static void |
543 | mempool_zone_complete(struct mempool_zone *zone) | 607 | mempool_zone_complete(struct mempool_zone *zone) |
544 | { | 608 | { |
@@ -558,37 +622,6 @@ mempool_zone_complete(struct mempool_zone *zone) | |||
558 | spin_unlock_irqrestore(&zone->freelock, flags); | 622 | spin_unlock_irqrestore(&zone->freelock, flags); |
559 | } | 623 | } |
560 | 624 | ||
561 | static struct mempool_zone * | ||
562 | mempool_zone_init(unsigned max, unsigned size, unsigned hiwat) | ||
563 | { | ||
564 | struct mempool_zone *zp; | ||
565 | |||
566 | zp = kzalloc(sizeof(*zp), GFP_KERNEL); | ||
567 | if (!zp) | ||
568 | return NULL; | ||
569 | |||
570 | zp->size = size; | ||
571 | zp->hiwat = hiwat; | ||
572 | INIT_LIST_HEAD(&zp->freequeue); | ||
573 | spin_lock_init(&zp->freelock); | ||
574 | atomic_set(&zp->allocated, 0); | ||
575 | |||
576 | zp->pool = mempool_create(max, mempool_zone_alloc_skb, | ||
577 | mempool_zone_free_skb, zp); | ||
578 | if (!zp->pool) { | ||
579 | kfree(zp); | ||
580 | return NULL; | ||
581 | } | ||
582 | |||
583 | return zp; | ||
584 | } | ||
585 | |||
586 | static void mempool_zone_destroy(struct mempool_zone *zp) | ||
587 | { | ||
588 | mempool_destroy(zp->pool); | ||
589 | kfree(zp); | ||
590 | } | ||
591 | |||
592 | static struct sk_buff* | 625 | static struct sk_buff* |
593 | mempool_zone_get_skb(struct mempool_zone *zone) | 626 | mempool_zone_get_skb(struct mempool_zone *zone) |
594 | { | 627 | { |
@@ -601,6 +634,27 @@ mempool_zone_get_skb(struct mempool_zone *zone) | |||
601 | } | 634 | } |
602 | 635 | ||
603 | static int | 636 | static int |
637 | iscsi_broadcast_skb(struct mempool_zone *zone, struct sk_buff *skb) | ||
638 | { | ||
639 | unsigned long flags; | ||
640 | int rc; | ||
641 | |||
642 | skb_get(skb); | ||
643 | rc = netlink_broadcast(nls, skb, 0, 1, GFP_KERNEL); | ||
644 | if (rc < 0) { | ||
645 | mempool_free(skb, zone->pool); | ||
646 | printk(KERN_ERR "iscsi: can not broadcast skb (%d)\n", rc); | ||
647 | return rc; | ||
648 | } | ||
649 | |||
650 | spin_lock_irqsave(&zone->freelock, flags); | ||
651 | INIT_LIST_HEAD(skb_to_lh(skb)); | ||
652 | list_add(skb_to_lh(skb), &zone->freequeue); | ||
653 | spin_unlock_irqrestore(&zone->freelock, flags); | ||
654 | return 0; | ||
655 | } | ||
656 | |||
657 | static int | ||
604 | iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) | 658 | iscsi_unicast_skb(struct mempool_zone *zone, struct sk_buff *skb, int pid) |
605 | { | 659 | { |
606 | unsigned long flags; | 660 | unsigned long flags; |
@@ -695,7 +749,7 @@ void iscsi_conn_error(struct iscsi_cls_conn *conn, enum iscsi_err error) | |||
695 | ev->r.connerror.cid = conn->cid; | 749 | ev->r.connerror.cid = conn->cid; |
696 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); | 750 | ev->r.connerror.sid = iscsi_conn_get_sid(conn); |
697 | 751 | ||
698 | iscsi_unicast_skb(conn->z_error, skb, priv->daemon_pid); | 752 | iscsi_broadcast_skb(conn->z_error, skb); |
699 | 753 | ||
700 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", | 754 | dev_printk(KERN_INFO, &conn->dev, "iscsi: detected conn error (%d)\n", |
701 | error); | 755 | error); |
@@ -796,6 +850,131 @@ iscsi_if_get_stats(struct iscsi_transport *transport, struct nlmsghdr *nlh) | |||
796 | return err; | 850 | return err; |
797 | } | 851 | } |
798 | 852 | ||
853 | /** | ||
854 | * iscsi_if_destroy_session_done - send session destr. completion event | ||
855 | * @conn: last connection for session | ||
856 | * | ||
857 | * This is called by HW iscsi LLDs to notify userpsace that its HW has | ||
858 | * removed a session. | ||
859 | **/ | ||
860 | int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn) | ||
861 | { | ||
862 | struct iscsi_internal *priv; | ||
863 | struct iscsi_cls_session *session; | ||
864 | struct Scsi_Host *shost; | ||
865 | struct iscsi_uevent *ev; | ||
866 | struct sk_buff *skb; | ||
867 | struct nlmsghdr *nlh; | ||
868 | unsigned long flags; | ||
869 | int rc, len = NLMSG_SPACE(sizeof(*ev)); | ||
870 | |||
871 | priv = iscsi_if_transport_lookup(conn->transport); | ||
872 | if (!priv) | ||
873 | return -EINVAL; | ||
874 | |||
875 | session = iscsi_dev_to_session(conn->dev.parent); | ||
876 | shost = iscsi_session_to_shost(session); | ||
877 | |||
878 | mempool_zone_complete(conn->z_pdu); | ||
879 | |||
880 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
881 | if (!skb) { | ||
882 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | ||
883 | "session creation event\n"); | ||
884 | return -ENOMEM; | ||
885 | } | ||
886 | |||
887 | nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); | ||
888 | ev = NLMSG_DATA(nlh); | ||
889 | ev->transport_handle = iscsi_handle(conn->transport); | ||
890 | ev->type = ISCSI_KEVENT_DESTROY_SESSION; | ||
891 | ev->r.d_session.host_no = shost->host_no; | ||
892 | ev->r.d_session.sid = session->sid; | ||
893 | |||
894 | /* | ||
895 | * this will occur if the daemon is not up, so we just warn | ||
896 | * the user and when the daemon is restarted it will handle it | ||
897 | */ | ||
898 | rc = iscsi_broadcast_skb(conn->z_pdu, skb); | ||
899 | if (rc < 0) | ||
900 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | ||
901 | "session destruction event. Check iscsi daemon\n"); | ||
902 | |||
903 | spin_lock_irqsave(&sesslock, flags); | ||
904 | list_del(&session->sess_list); | ||
905 | spin_unlock_irqrestore(&sesslock, flags); | ||
906 | |||
907 | spin_lock_irqsave(&connlock, flags); | ||
908 | conn->active = 0; | ||
909 | list_del(&conn->conn_list); | ||
910 | spin_unlock_irqrestore(&connlock, flags); | ||
911 | |||
912 | return rc; | ||
913 | } | ||
914 | EXPORT_SYMBOL_GPL(iscsi_if_destroy_session_done); | ||
915 | |||
916 | /** | ||
917 | * iscsi_if_create_session_done - send session creation completion event | ||
918 | * @conn: leading connection for session | ||
919 | * | ||
920 | * This is called by HW iscsi LLDs to notify userpsace that its HW has | ||
921 | * created a session or a existing session is back in the logged in state. | ||
922 | **/ | ||
923 | int iscsi_if_create_session_done(struct iscsi_cls_conn *conn) | ||
924 | { | ||
925 | struct iscsi_internal *priv; | ||
926 | struct iscsi_cls_session *session; | ||
927 | struct Scsi_Host *shost; | ||
928 | struct iscsi_uevent *ev; | ||
929 | struct sk_buff *skb; | ||
930 | struct nlmsghdr *nlh; | ||
931 | unsigned long flags; | ||
932 | int rc, len = NLMSG_SPACE(sizeof(*ev)); | ||
933 | |||
934 | priv = iscsi_if_transport_lookup(conn->transport); | ||
935 | if (!priv) | ||
936 | return -EINVAL; | ||
937 | |||
938 | session = iscsi_dev_to_session(conn->dev.parent); | ||
939 | shost = iscsi_session_to_shost(session); | ||
940 | |||
941 | mempool_zone_complete(conn->z_pdu); | ||
942 | |||
943 | skb = mempool_zone_get_skb(conn->z_pdu); | ||
944 | if (!skb) { | ||
945 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | ||
946 | "session creation event\n"); | ||
947 | return -ENOMEM; | ||
948 | } | ||
949 | |||
950 | nlh = __nlmsg_put(skb, priv->daemon_pid, 0, 0, (len - sizeof(*nlh)), 0); | ||
951 | ev = NLMSG_DATA(nlh); | ||
952 | ev->transport_handle = iscsi_handle(conn->transport); | ||
953 | ev->type = ISCSI_UEVENT_CREATE_SESSION; | ||
954 | ev->r.c_session_ret.host_no = shost->host_no; | ||
955 | ev->r.c_session_ret.sid = session->sid; | ||
956 | |||
957 | /* | ||
958 | * this will occur if the daemon is not up, so we just warn | ||
959 | * the user and when the daemon is restarted it will handle it | ||
960 | */ | ||
961 | rc = iscsi_broadcast_skb(conn->z_pdu, skb); | ||
962 | if (rc < 0) | ||
963 | dev_printk(KERN_ERR, &conn->dev, "Cannot notify userspace of " | ||
964 | "session creation event. Check iscsi daemon\n"); | ||
965 | |||
966 | spin_lock_irqsave(&sesslock, flags); | ||
967 | list_add(&session->sess_list, &sesslist); | ||
968 | spin_unlock_irqrestore(&sesslock, flags); | ||
969 | |||
970 | spin_lock_irqsave(&connlock, flags); | ||
971 | list_add(&conn->conn_list, &connlist); | ||
972 | conn->active = 1; | ||
973 | spin_unlock_irqrestore(&connlock, flags); | ||
974 | return rc; | ||
975 | } | ||
976 | EXPORT_SYMBOL_GPL(iscsi_if_create_session_done); | ||
977 | |||
799 | static int | 978 | static int |
800 | iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) | 979 | iscsi_if_create_session(struct iscsi_internal *priv, struct iscsi_uevent *ev) |
801 | { | 980 | { |
@@ -841,26 +1020,6 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) | |||
841 | return -ENOMEM; | 1020 | return -ENOMEM; |
842 | } | 1021 | } |
843 | 1022 | ||
844 | conn->z_pdu = mempool_zone_init(Z_MAX_PDU, | ||
845 | NLMSG_SPACE(sizeof(struct iscsi_uevent) + | ||
846 | sizeof(struct iscsi_hdr) + | ||
847 | DEFAULT_MAX_RECV_DATA_SEGMENT_LENGTH), | ||
848 | Z_HIWAT_PDU); | ||
849 | if (!conn->z_pdu) { | ||
850 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
851 | "pdu zone for new conn\n"); | ||
852 | goto destroy_conn; | ||
853 | } | ||
854 | |||
855 | conn->z_error = mempool_zone_init(Z_MAX_ERROR, | ||
856 | NLMSG_SPACE(sizeof(struct iscsi_uevent)), | ||
857 | Z_HIWAT_ERROR); | ||
858 | if (!conn->z_error) { | ||
859 | dev_printk(KERN_ERR, &conn->dev, "iscsi: can not allocate " | ||
860 | "error zone for new conn\n"); | ||
861 | goto free_pdu_pool; | ||
862 | } | ||
863 | |||
864 | ev->r.c_conn_ret.sid = session->sid; | 1023 | ev->r.c_conn_ret.sid = session->sid; |
865 | ev->r.c_conn_ret.cid = conn->cid; | 1024 | ev->r.c_conn_ret.cid = conn->cid; |
866 | 1025 | ||
@@ -870,13 +1029,6 @@ iscsi_if_create_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev) | |||
870 | spin_unlock_irqrestore(&connlock, flags); | 1029 | spin_unlock_irqrestore(&connlock, flags); |
871 | 1030 | ||
872 | return 0; | 1031 | return 0; |
873 | |||
874 | free_pdu_pool: | ||
875 | mempool_zone_destroy(conn->z_pdu); | ||
876 | destroy_conn: | ||
877 | if (transport->destroy_conn) | ||
878 | transport->destroy_conn(conn->dd_data); | ||
879 | return -ENOMEM; | ||
880 | } | 1032 | } |
881 | 1033 | ||
882 | static int | 1034 | static int |
@@ -884,7 +1036,6 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev | |||
884 | { | 1036 | { |
885 | unsigned long flags; | 1037 | unsigned long flags; |
886 | struct iscsi_cls_conn *conn; | 1038 | struct iscsi_cls_conn *conn; |
887 | struct mempool_zone *z_error, *z_pdu; | ||
888 | 1039 | ||
889 | conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid); | 1040 | conn = iscsi_conn_lookup(ev->u.d_conn.sid, ev->u.d_conn.cid); |
890 | if (!conn) | 1041 | if (!conn) |
@@ -894,15 +1045,8 @@ iscsi_if_destroy_conn(struct iscsi_transport *transport, struct iscsi_uevent *ev | |||
894 | list_del(&conn->conn_list); | 1045 | list_del(&conn->conn_list); |
895 | spin_unlock_irqrestore(&connlock, flags); | 1046 | spin_unlock_irqrestore(&connlock, flags); |
896 | 1047 | ||
897 | z_pdu = conn->z_pdu; | ||
898 | z_error = conn->z_error; | ||
899 | |||
900 | if (transport->destroy_conn) | 1048 | if (transport->destroy_conn) |
901 | transport->destroy_conn(conn); | 1049 | transport->destroy_conn(conn); |
902 | |||
903 | mempool_zone_destroy(z_pdu); | ||
904 | mempool_zone_destroy(z_error); | ||
905 | |||
906 | return 0; | 1050 | return 0; |
907 | } | 1051 | } |
908 | 1052 | ||
@@ -1331,6 +1475,7 @@ iscsi_register_transport(struct iscsi_transport *tt) | |||
1331 | if (!priv) | 1475 | if (!priv) |
1332 | return NULL; | 1476 | return NULL; |
1333 | INIT_LIST_HEAD(&priv->list); | 1477 | INIT_LIST_HEAD(&priv->list); |
1478 | priv->daemon_pid = -1; | ||
1334 | priv->iscsi_transport = tt; | 1479 | priv->iscsi_transport = tt; |
1335 | priv->t.user_scan = iscsi_user_scan; | 1480 | priv->t.user_scan = iscsi_user_scan; |
1336 | 1481 | ||
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index 8813f0f4c624..55ebf035e620 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h | |||
@@ -53,6 +53,7 @@ enum iscsi_uevent_e { | |||
53 | ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, | 53 | ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, |
54 | ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, | 54 | ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, |
55 | ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3, | 55 | ISCSI_KEVENT_IF_ERROR = KEVENT_BASE + 3, |
56 | ISCSI_KEVENT_DESTROY_SESSION = KEVENT_BASE + 4, | ||
56 | }; | 57 | }; |
57 | 58 | ||
58 | enum iscsi_tgt_dscvr { | 59 | enum iscsi_tgt_dscvr { |
@@ -157,27 +158,13 @@ struct iscsi_uevent { | |||
157 | uint32_t cid; | 158 | uint32_t cid; |
158 | uint32_t error; /* enum iscsi_err */ | 159 | uint32_t error; /* enum iscsi_err */ |
159 | } connerror; | 160 | } connerror; |
161 | struct msg_session_destroyed { | ||
162 | uint32_t host_no; | ||
163 | uint32_t sid; | ||
164 | } d_session; | ||
160 | struct msg_transport_connect_ret { | 165 | struct msg_transport_connect_ret { |
161 | uint64_t handle; | 166 | uint64_t handle; |
162 | } ep_connect_ret; | 167 | } ep_connect_ret; |
163 | struct msg_tgt_dscvr_ret { | ||
164 | /* | ||
165 | * session/connection pair used to reference | ||
166 | * the connection to server | ||
167 | */ | ||
168 | uint32_t sid; | ||
169 | uint32_t cid; | ||
170 | union { | ||
171 | struct isns { | ||
172 | /* port # for conn to iSNS server */ | ||
173 | uint16_t isns_port; | ||
174 | /* listening port to receive SCNs */ | ||
175 | uint16_t scn_port; | ||
176 | /* listening port to receive ESIs */ | ||
177 | uint16_t esi_port; | ||
178 | } isns_attrib; | ||
179 | } u; | ||
180 | } tgt_dscvr_ret; | ||
181 | } r; | 168 | } r; |
182 | } __attribute__ ((aligned (sizeof(uint64_t)))); | 169 | } __attribute__ ((aligned (sizeof(uint64_t)))); |
183 | 170 | ||
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index f7b0db5f2f5b..5a3df1d7085f 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -214,6 +214,8 @@ extern struct iscsi_cls_session *iscsi_alloc_session(struct Scsi_Host *shost, | |||
214 | struct iscsi_transport *transport); | 214 | struct iscsi_transport *transport); |
215 | extern int iscsi_add_session(struct iscsi_cls_session *session, | 215 | extern int iscsi_add_session(struct iscsi_cls_session *session, |
216 | unsigned int target_id); | 216 | unsigned int target_id); |
217 | extern int iscsi_if_create_session_done(struct iscsi_cls_conn *conn); | ||
218 | extern int iscsi_if_destroy_session_done(struct iscsi_cls_conn *conn); | ||
217 | extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, | 219 | extern struct iscsi_cls_session *iscsi_create_session(struct Scsi_Host *shost, |
218 | struct iscsi_transport *t, | 220 | struct iscsi_transport *t, |
219 | unsigned int target_id); | 221 | unsigned int target_id); |
@@ -226,4 +228,5 @@ extern int iscsi_destroy_conn(struct iscsi_cls_conn *conn); | |||
226 | extern void iscsi_unblock_session(struct iscsi_cls_session *session); | 228 | extern void iscsi_unblock_session(struct iscsi_cls_session *session); |
227 | extern void iscsi_block_session(struct iscsi_cls_session *session); | 229 | extern void iscsi_block_session(struct iscsi_cls_session *session); |
228 | 230 | ||
231 | |||
229 | #endif | 232 | #endif |