RDMA will need to store some per-task data to use initiator-provided tags
in later RDMA operations.  Provide some space for this and hook into the
transport at task initialization time.

Based on the patch by Erez Zilber <[EMAIL PROTECTED]>.

Signed-off-by: Pete Wyckoff <[EMAIL PROTECTED]>
---
 usr/iscsi/iscsi_tcp.c |    6 ++++++
 usr/iscsi/iscsid.c    |   13 +++++++++++--
 usr/iscsi/iscsid.h    |    8 ++++----
 usr/iscsi/transport.h |    3 +++
 4 files changed, 24 insertions(+), 6 deletions(-)

diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index 38d2df6..99db99d 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -226,6 +226,10 @@ static int iscsi_tcp_conn_login_complete(struct 
iscsi_connection *conn)
        return 0;
 }
 
+static void iscsi_tcp_task_init(struct iscsi_task *task)
+{
+}
+
 static size_t iscsi_tcp_read(struct iscsi_connection *conn, void *buf,
                             size_t nbytes)
 {
@@ -334,8 +338,10 @@ int iscsi_tcp_getpeername(struct iscsi_connection *conn, 
struct sockaddr *sa,
 struct iscsi_transport iscsi_tcp = {
        .name                   = "iscsi",
        .rdma                   = 0,
+       .task_trans_len         = 0,
        .ep_init                = iscsi_tcp_init,
        .ep_login_complete      = iscsi_tcp_conn_login_complete,
+       .ep_task_init           = iscsi_tcp_task_init,
        .ep_read                = iscsi_tcp_read,
        .ep_write_begin         = iscsi_tcp_write_begin,
        .ep_write_end           = iscsi_tcp_write_end,
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index ab1999d..3cb804e 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -997,10 +997,10 @@ static struct iscsi_task *iscsi_alloc_task(struct 
iscsi_connection *conn,
        struct iscsi_task *task;
        void *buf;
 
-       task = malloc(sizeof(*task) + ext_len);
+       task = malloc(sizeof(*task) + conn->tp->task_trans_len + ext_len);
        if (!task)
                return NULL;
-       memset(task, 0, sizeof(*task) + ext_len);
+       memset(task, 0, sizeof(*task) + conn->tp->task_trans_len + ext_len);
 
        if (data_len) {
                buf = conn->tp->alloc_data_buf(conn, data_len);
@@ -1016,6 +1016,13 @@ static struct iscsi_task *iscsi_alloc_task(struct 
iscsi_connection *conn,
        INIT_LIST_HEAD(&task->c_hlist);
        INIT_LIST_HEAD(&task->c_list);
 
+       if (conn->tp->task_trans_len)
+               task->trans_data = (void *) &task[1];
+
+       if (ext_len)
+               task->extdata = (void *)((uintptr_t) &task[1] +
+                                     conn->tp->task_trans_len);
+
        conn_get(conn);
        return task;
 }
@@ -1465,6 +1472,8 @@ static int iscsi_scsi_cmd_rx_start(struct 
iscsi_connection *conn)
 
        task->tag = req->itt;
 
+       conn->tp->ep_task_init(task);
+
        if (ahs_len) {
                task->ahs = task->extdata + sizeof(req->cdb);
                conn->req.ahs = task->ahs;
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index 518c0eb..3fabfba 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -117,12 +117,12 @@ struct iscsi_task {
        int unsol_count;
        int exp_r2tsn;
 
-       void *ahs;
-       void *data;
-
        struct scsi_cmd scmd;
 
-       unsigned long extdata[0];
+       void *trans_data;   /* transport specific data */
+       void *extdata;      /* extra data, after transport, for ahs only */
+       void *ahs;
+       void *data;
 };
 
 struct iscsi_connection {
diff --git a/usr/iscsi/transport.h b/usr/iscsi/transport.h
index e1b514d..38e28ae 100644
--- a/usr/iscsi/transport.h
+++ b/usr/iscsi/transport.h
@@ -4,13 +4,16 @@
 #include <sys/socket.h>
 
 struct iscsi_connection;
+struct iscsi_task;
 
 struct iscsi_transport {
        const char *name;
        int rdma;
+       int task_trans_len;
 
        int (*ep_init) (void);
        int (*ep_login_complete)(struct iscsi_connection *conn);
+       void (*ep_task_init)(struct iscsi_task *task);
        size_t (*ep_read)(struct iscsi_connection *conn, void *buf,
                          size_t nbytes);
        size_t (*ep_write_begin)(struct iscsi_connection *conn, void *buf,
-- 
1.5.3.4

_______________________________________________
Stgt-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/stgt-devel

Reply via email to