[openib-general] [PATCH 8/8] [RFC] iscsi ep callbacks support
Or Gerlitz
ogerlitz at voltaire.com
Thu Apr 6 05:21:51 PDT 2006
The kernel part of the change in open iscsi which allows to connect
from the kernel (and later run the login/logout/etc negotiation from user
space)
diff --exclude=.svn -rup oiscsi-529-canq2/include/iscsi_if.h oiscsi-529-canq2-ep2/include/iscsi_if.h
--- oiscsi-529-canq2/include/iscsi_if.h 2006-04-06 10:44:23.000000000 +0300
+++ oiscsi-529-canq2-ep2/include/iscsi_if.h 2006-04-06 13:26:39.000000000 +0300
@@ -43,6 +43,10 @@ enum iscsi_uevent_e {
ISCSI_UEVENT_GET_STATS = UEVENT_BASE + 10,
ISCSI_UEVENT_GET_PARAM = UEVENT_BASE + 11,
+ ISCSI_UEVENT_TRANSPORT_EP_CONNECT = UEVENT_BASE + 12,
+ ISCSI_UEVENT_TRANSPORT_EP_POLL = UEVENT_BASE + 13,
+ ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT = UEVENT_BASE + 14,
+
/* up events */
ISCSI_KEVENT_RECV_PDU = KEVENT_BASE + 1,
ISCSI_KEVENT_CONN_ERROR = KEVENT_BASE + 2,
@@ -70,7 +74,7 @@ struct iscsi_uevent {
struct msg_bind_conn {
uint32_t sid;
uint32_t cid;
- uint32_t transport_fd;
+ uint64_t transport_eph;
uint32_t is_leading;
} b_conn;
struct msg_destroy_conn {
@@ -103,6 +107,16 @@ struct iscsi_uevent {
uint32_t sid;
uint32_t cid;
} get_stats;
+ struct msg_transport_connect {
+ uint32_t non_blocking;
+ } ep_connect;
+ struct msg_transport_poll {
+ uint64_t ep_handle;
+ uint32_t timeout_ms;
+ } ep_poll;
+ struct msg_transport_disconnect {
+ uint64_t ep_handle;
+ } ep_disconnect;
} u;
union {
/* messages k -> u */
@@ -125,6 +139,9 @@ struct iscsi_uevent {
uint32_t cid;
uint32_t error; /* enum iscsi_err */
} connerror;
+ struct msg_transport_connect_ret {
+ uint64_t handle;
+ } ep_connect_ret;
} r;
} __attribute__ ((aligned (sizeof(uint64_t))));
diff --exclude=.svn -rup oiscsi-529-canq2/kernel/iscsi_tcp.c oiscsi-529-canq2-ep2/kernel/iscsi_tcp.c
--- oiscsi-529-canq2/kernel/iscsi_tcp.c 2006-04-06 10:44:23.000000000 +0300
+++ oiscsi-529-canq2-ep2/kernel/iscsi_tcp.c 2006-04-06 13:26:39.000000000 +0300
@@ -1975,7 +1975,7 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_
static int
iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
- struct iscsi_cls_conn *cls_conn, uint32_t transport_fd,
+ struct iscsi_cls_conn *cls_conn, uint64_t transport_eph,
int is_leading)
{
struct iscsi_conn *conn = cls_conn->dd_data;
@@ -1985,7 +1985,7 @@ iscsi_tcp_conn_bind(struct iscsi_cls_ses
int err;
/* lookup for existing socket */
- sock = sockfd_lookup(transport_fd, &err);
+ sock = sockfd_lookup((int)transport_eph, &err);
if (!sock) {
printk(KERN_ERR "iscsi_tcp: sockfd_lookup failed %d\n", err);
return -EEXIST;
diff --exclude=.svn -rup oiscsi-529-canq2/kernel/scsi_transport_iscsi.c oiscsi-529-canq2-ep2/kernel/scsi_transport_iscsi.c
--- oiscsi-529-canq2/kernel/scsi_transport_iscsi.c 2006-04-06 10:44:23.000000000 +0300
+++ oiscsi-529-canq2-ep2/kernel/scsi_transport_iscsi.c 2006-04-06 13:26:39.000000000 +0300
@@ -930,6 +930,40 @@ iscsi_set_param(struct iscsi_transport *
}
static int
+iscsi_if_transport_ep(struct iscsi_transport *transport,
+ struct iscsi_uevent *ev, int msg_type)
+{
+ struct sockaddr *dst_addr;
+ int rc = 0;
+
+ switch (msg_type) {
+ case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
+ if (!transport->ep_connect)
+ return -EINVAL;
+
+ dst_addr = (struct sockaddr *)((char*)ev + sizeof(*ev));
+ rc = transport->ep_connect(dst_addr,
+ ev->u.ep_connect.non_blocking,
+ &ev->r.ep_connect_ret.handle);
+ break;
+ case ISCSI_UEVENT_TRANSPORT_EP_POLL:
+ if (!transport->ep_poll)
+ return -EINVAL;
+
+ ev->r.retcode = transport->ep_poll(ev->u.ep_poll.ep_handle,
+ ev->u.ep_poll.timeout_ms);
+ break;
+ case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
+ if (!transport->ep_disconnect)
+ return -EINVAL;
+
+ transport->ep_disconnect(ev->u.ep_disconnect.ep_handle);
+ break;
+ }
+ return rc;
+}
+
+static int
iscsi_if_recv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
{
int err = 0;
@@ -975,7 +1009,7 @@ iscsi_if_recv_msg(struct sk_buff *skb, s
if (session && conn)
ev->r.retcode = transport->bind_conn(session, conn,
- ev->u.b_conn.transport_fd,
+ ev->u.b_conn.transport_eph,
ev->u.b_conn.is_leading);
else
err = -EINVAL;
@@ -1010,6 +1044,11 @@ iscsi_if_recv_msg(struct sk_buff *skb, s
case ISCSI_UEVENT_GET_STATS:
err = iscsi_if_get_stats(transport, nlh);
break;
+ case ISCSI_UEVENT_TRANSPORT_EP_CONNECT:
+ case ISCSI_UEVENT_TRANSPORT_EP_POLL:
+ case ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT:
+ err = iscsi_if_transport_ep(transport, ev, nlh->nlmsg_type);
+ break;
default:
err = -EINVAL;
break;
diff --exclude=.svn -rup oiscsi-529-canq2/kernel/scsi_transport_iscsi.h oiscsi-529-canq2-ep2/kernel/scsi_transport_iscsi.h
--- oiscsi-529-canq2/kernel/scsi_transport_iscsi.h 2006-04-06 10:44:23.000000000 +0300
+++ oiscsi-529-canq2-ep2/kernel/scsi_transport_iscsi.h 2006-04-06 13:26:39.000000000 +0300
@@ -89,7 +89,7 @@ struct iscsi_transport {
uint32_t cid);
int (*bind_conn) (struct iscsi_cls_session *session,
struct iscsi_cls_conn *cls_conn,
- uint32_t transport_fd, int is_leading);
+ uint64_t transport_eph, int is_leading);
int (*start_conn) (struct iscsi_cls_conn *conn);
void (*stop_conn) (struct iscsi_cls_conn *conn, int flag);
void (*destroy_conn) (struct iscsi_cls_conn *conn);
@@ -120,6 +120,10 @@ struct iscsi_transport {
int (*xmit_mgmt_task) (struct iscsi_conn *conn,
struct iscsi_mgmt_task *mtask);
void (*session_recovery_timedout) (struct iscsi_cls_session *session);
+ int (*ep_connect) (struct sockaddr *dst_addr, int non_blocking,
+ uint64_t *ep_handle);
+ int (*ep_poll) (uint64_t ep_handle, int timeout_ms);
+ void (*ep_disconnect) (uint64_t ep_handle);
};
/*
More information about the general
mailing list