aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/iscsi_tcp.c4
-rw-r--r--drivers/scsi/scsi_transport_iscsi.c41
2 files changed, 42 insertions, 3 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
1976static int 1976static int
1977iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session, 1977iscsi_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
931static int 931static int
932iscsi_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
965static int
932iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 966iscsi_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;