diff options
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 4 | ||||
-rw-r--r-- | drivers/scsi/scsi_transport_iscsi.c | 41 | ||||
-rw-r--r-- | include/scsi/iscsi_if.h | 19 | ||||
-rw-r--r-- | include/scsi/scsi_transport_iscsi.h | 6 |
4 files changed, 65 insertions, 5 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index fe00a3f6d204..ac507daacfeb 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -1975,7 +1975,7 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) | |||
1975 | 1975 | ||
1976 | static int | 1976 | static int |
1977 | iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session, | 1977 | iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session, |
1978 | struct iscsi_cls_conn *cls_conn, uint32_t transport_fd, | 1978 | struct iscsi_cls_conn *cls_conn, uint64_t transport_eph, |
1979 | int is_leading) | 1979 | int is_leading) |
1980 | { | 1980 | { |
1981 | struct iscsi_conn *conn = cls_conn->dd_data; | 1981 | struct iscsi_conn *conn = cls_conn->dd_data; |
@@ -1985,7 +1985,7 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session, | |||
1985 | int err; | 1985 | int err; |
1986 | 1986 | ||
1987 | /* lookup for existing socket */ | 1987 | /* lookup for existing socket */ |
1988 | sock = sockfd_lookup(transport_fd, &err); | 1988 | sock = sockfd_lookup((int)transport_eph, &err); |
1989 | if (!sock) { | 1989 | if (!sock) { |
1990 | printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err); | 1990 | printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err); |
1991 | return -EEXIST; | 1991 | return -EEXIST; |
diff --git a/drivers/scsi/scsi_transport_iscsi.c b/drivers/scsi/scsi_transport_iscsi.c index bc9071d2d212..7b7a194822da 100644 --- a/drivers/scsi/scsi_transport_iscsi.c +++ b/drivers/scsi/scsi_transport_iscsi.c | |||
@@ -929,6 +929,40 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev) | |||
929 | } | 929 | } |
930 | 930 | ||
931 | static int | 931 | static int |
932 | iscsi_if_transport_ep(struct iscsi_transport *transport, | ||
933 | struct iscsi_uevent *ev, int msg_type) | ||
934 | { | ||
935 | struct sockaddr *dst_addr; | ||
936 | int rc = 0; | ||
937 | |||
938 | switch (msg_type) { | ||
939 | case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: | ||
940 | if (!transport->ep_connect) | ||
941 | return -EINVAL; | ||
942 | |||
943 | dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev)); | ||
944 | rc = transport->ep_connect(dst_addr, | ||
945 | ev->u.ep_connect.non_blocking, | ||
946 | &ev->r.ep_connect_ret.handle); | ||
947 | break; | ||
948 | case ISCSI_UEVENT_TRANSPORT_EP_POLL: | ||
949 | if (!transport->ep_poll) | ||
950 | return -EINVAL; | ||
951 | |||
952 | ev->r.retcode = transport->ep_poll(ev->u.ep_poll.ep_handle, | ||
953 | ev->u.ep_poll.timeout_ms); | ||
954 | break; | ||
955 | case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: | ||
956 | if (!transport->ep_disconnect) | ||
957 | return -EINVAL; | ||
958 | |||
959 | transport->ep_disconnect(ev->u.ep_disconnect.ep_handle); | ||
960 | break; | ||
961 | } | ||
962 | return rc; | ||
963 | } | ||
964 | |||
965 | static int | ||
932 | iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | 966 | iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) |
933 | { | 967 | { |
934 | int err = 0; | 968 | int err = 0; |
@@ -974,7 +1008,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
974 | 1008 | ||
975 | if (session && conn) | 1009 | if (session && conn) |
976 | ev->r.retcode = transport->bind_conn(session, conn, | 1010 | ev->r.retcode = transport->bind_conn(session, conn, |
977 | ev->u.b_conn.transport_fd, | 1011 | ev->u.b_conn.transport_eph, |
978 | ev->u.b_conn.is_leading); | 1012 | ev->u.b_conn.is_leading); |
979 | else | 1013 | else |
980 | err = -EINVAL; | 1014 | err = -EINVAL; |
@@ -1009,6 +1043,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1009 | case ISCSI_UEVENT_GET_STATS: | 1043 | case ISCSI_UEVENT_GET_STATS: |
1010 | err = iscsi_if_get_stats(transport, nlh); | 1044 | err = iscsi_if_get_stats(transport, nlh); |
1011 | break; | 1045 | break; |
1046 | case ISCSI_UEVENT_TRANSPORT_EP_CONNECT: | ||
1047 | case ISCSI_UEVENT_TRANSPORT_EP_POLL: | ||
1048 | case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT: | ||
1049 | err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type); | ||
1050 | break; | ||
1012 | default: | 1051 | default: |
1013 | err = -EINVAL; | 1052 | err = -EINVAL; |
1014 | break; | 1053 | break; |
diff --git a/include/scsi/iscsi_if.h b/include/scsi/iscsi_if.h index 47524c726ee8..feff74e544b7 100644 --- a/include/scsi/iscsi_if.h +++ b/include/scsi/iscsi_if.h | |||
@@ -43,6 +43,10 @@ enum iscsi_uevent_e { | |||
43 | ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, | 43 | ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10, |
44 | ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, | 44 | ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11, |
45 | 45 | ||
46 | ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12, | ||
47 | ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13, | ||
48 | ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14, | ||
49 | |||
46 | /* up events */ | 50 | /* up events */ |
47 | ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, | 51 | ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1, |
48 | ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, | 52 | ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2, |
@@ -69,7 +73,7 @@ struct iscsi_uevent { | |||
69 | struct msg_bind_conn { | 73 | struct msg_bind_conn { |
70 | uint32_t sid; | 74 | uint32_t sid; |
71 | uint32_t cid; | 75 | uint32_t cid; |
72 | uint32_t transport_fd; | 76 | uint64_t transport_eph; |
73 | uint32_t is_leading; | 77 | uint32_t is_leading; |
74 | } b_conn; | 78 | } b_conn; |
75 | struct msg_destroy_conn { | 79 | struct msg_destroy_conn { |
@@ -102,6 +106,16 @@ struct iscsi_uevent { | |||
102 | uint32_t sid; | 106 | uint32_t sid; |
103 | uint32_t cid; | 107 | uint32_t cid; |
104 | } get_stats; | 108 | } get_stats; |
109 | struct msg_transport_connect { | ||
110 | uint32_t non_blocking; | ||
111 | } ep_connect; | ||
112 | struct msg_transport_poll { | ||
113 | uint64_t ep_handle; | ||
114 | uint32_t timeout_ms; | ||
115 | } ep_poll; | ||
116 | struct msg_transport_disconnect { | ||
117 | uint64_t ep_handle; | ||
118 | } ep_disconnect; | ||
105 | } u; | 119 | } u; |
106 | union { | 120 | union { |
107 | /* messages k -> u */ | 121 | /* messages k -> u */ |
@@ -124,6 +138,9 @@ struct iscsi_uevent { | |||
124 | uint32_t cid; | 138 | uint32_t cid; |
125 | uint32_t error; /* enum iscsi_err */ | 139 | uint32_t error; /* enum iscsi_err */ |
126 | } connerror; | 140 | } connerror; |
141 | struct msg_transport_connect_ret { | ||
142 | uint64_t handle; | ||
143 | } ep_connect_ret; | ||
127 | } r; | 144 | } r; |
128 | } __attribute__ ((aligned (sizeof(uint64_t)))); | 145 | } __attribute__ ((aligned (sizeof(uint64_t)))); |
129 | 146 | ||
diff --git a/include/scsi/scsi_transport_iscsi.h b/include/scsi/scsi_transport_iscsi.h index b332d6e839fe..c9e9475c6dff 100644 --- a/include/scsi/scsi_transport_iscsi.h +++ b/include/scsi/scsi_transport_iscsi.h | |||
@@ -88,7 +88,7 @@ struct iscsi_transport { | |||
88 | uint32_t cid); | 88 | uint32_t cid); |
89 | int (*bind_conn) (struct iscsi_cls_session *session, | 89 | int (*bind_conn) (struct iscsi_cls_session *session, |
90 | struct iscsi_cls_conn *cls_conn, | 90 | struct iscsi_cls_conn *cls_conn, |
91 | uint32_t transport_fd, int is_leading); | 91 | uint64_t transport_eph, int is_leading); |
92 | int (*start_conn) (struct iscsi_cls_conn *conn); | 92 | int (*start_conn) (struct iscsi_cls_conn *conn); |
93 | void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); | 93 | void (*stop_conn) (struct iscsi_cls_conn *conn, int flag); |
94 | void (*destroy_conn) (struct iscsi_cls_conn *conn); | 94 | void (*destroy_conn) (struct iscsi_cls_conn *conn); |
@@ -119,6 +119,10 @@ struct iscsi_transport { | |||
119 | int (*xmit_mgmt_task) (struct iscsi_conn *conn, | 119 | int (*xmit_mgmt_task) (struct iscsi_conn *conn, |
120 | struct iscsi_mgmt_task *mtask); | 120 | struct iscsi_mgmt_task *mtask); |
121 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); | 121 | void (*session_recovery_timedout) (struct iscsi_cls_session *session); |
122 | int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking, | ||
123 | uint64_t *ep_handle); | ||
124 | int (*ep_poll) (uint64_t ep_handle, int timeout_ms); | ||
125 | void (*ep_disconnect) (uint64_t ep_handle); | ||
122 | }; | 126 | }; |
123 | 127 | ||
124 | /* | 128 | /* |