Skip to content

Commit 264faaa

Browse files
Or GerlitzJames Bottomley
authored andcommitted
[SCSI] iscsi: add transport end point callbacks
add transport end point callbacks so iscsi drivers that cannot connect from userspace, like iscsi tcp, using sockets do not have to implement their own socket infrastructure. Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
1 parent 169e1a2 commit 264faaa

File tree

4 files changed

+65
-5
lines changed

4 files changed

+65
-5
lines changed

drivers/scsi/iscsi_tcp.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1975,7 +1975,7 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
19751975

19761976
static int
19771977
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,
19791979
int is_leading)
19801980
{
19811981
struct iscsi_conn *conn = cls_conn->dd_data;
@@ -1985,7 +1985,7 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
19851985
int err;
19861986

19871987
/* lookup for existing socket */
1988-
sock = sockfd_lookup(transport_fd, &err);
1988+
sock = sockfd_lookup((int)transport_eph, &err);
19891989
if (!sock) {
19901990
printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err);
19911991
return -EEXIST;

drivers/scsi/scsi_transport_iscsi.c

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,6 +928,40 @@ iscsi_set_param(struct iscsi_transport *transport, struct iscsi_uevent *ev)
928928
return err;
929929
}
930930

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+
931965
static int
932966
iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
933967
{
@@ -974,7 +1008,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
9741008

9751009
if (session && conn)
9761010
ev->r.retcode = transport->bind_conn(session, conn,
977-
ev->u.b_conn.transport_fd,
1011+
ev->u.b_conn.transport_eph,
9781012
ev->u.b_conn.is_leading);
9791013
else
9801014
err = -EINVAL;
@@ -1009,6 +1043,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
10091043
case ISCSI_UEVENT_GET_STATS:
10101044
err = iscsi_if_get_stats(transport, nlh);
10111045
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;
10121051
default:
10131052
err = -EINVAL;
10141053
break;

include/scsi/iscsi_if.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ enum iscsi_uevent_e {
4343
ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10,
4444
ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11,
4545

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+
4650
/* up events */
4751
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
4852
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
@@ -69,7 +73,7 @@ struct iscsi_uevent {
6973
struct msg_bind_conn {
7074
uint32_t sid;
7175
uint32_t cid;
72-
uint32_t transport_fd;
76+
uint64_t transport_eph;
7377
uint32_t is_leading;
7478
} b_conn;
7579
struct msg_destroy_conn {
@@ -102,6 +106,16 @@ struct iscsi_uevent {
102106
uint32_t sid;
103107
uint32_t cid;
104108
} 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;
105119
} u;
106120
union {
107121
/* messages k -> u */
@@ -124,6 +138,9 @@ struct iscsi_uevent {
124138
uint32_t cid;
125139
uint32_t error; /* enum iscsi_err */
126140
} connerror;
141+
struct msg_transport_connect_ret {
142+
uint64_t handle;
143+
} ep_connect_ret;
127144
} r;
128145
} __attribute__ ((aligned (sizeof(uint64_t))));
129146

include/scsi/scsi_transport_iscsi.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ struct iscsi_transport {
8888
uint32_t cid);
8989
int (*bind_conn) (struct iscsi_cls_session *session,
9090
struct iscsi_cls_conn *cls_conn,
91-
uint32_t transport_fd, int is_leading);
91+
uint64_t transport_eph, int is_leading);
9292
int (*start_conn) (struct iscsi_cls_conn *conn);
9393
void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
9494
void (*destroy_conn) (struct iscsi_cls_conn *conn);
@@ -119,6 +119,10 @@ struct iscsi_transport {
119119
int (*xmit_mgmt_task) (struct iscsi_conn *conn,
120120
struct iscsi_mgmt_task *mtask);
121121
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);
122126
};
123127

124128
/*

0 commit comments

Comments
 (0)