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 <erezz at voltaire.com>. Signed-off-by: Pete Wyckoff <pw at osc.edu> --- 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 |