Virtualize malloc and free when dealing with memory that the
transport will use.  It must be per-connection for RDMA.

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

diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index c775594..0d189c7 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -241,6 +241,18 @@ void iscsi_event_modify(int fd, int events)
                eprintf("tgt_event_modify failed\n");
 }
 
+void *iscsi_tcp_malloc(struct iscsi_connection *conn __attribute__((unused)),
+                      size_t sz)
+{
+       return malloc(sz);
+}
+
+void iscsi_tcp_free(struct iscsi_connection *conn __attribute__((unused)),
+                   void *buf)
+{
+       free(buf);
+}
+
 struct iscsi_transport iscsi_tcp = {
        .name                   = "iscsi",
        .rdma                   = 0,
@@ -251,4 +263,6 @@ struct iscsi_transport iscsi_tcp = {
        .ep_close               = iscsi_tcp_close,
        .ep_show                = iscsi_tcp_show,
        .ep_event_modify        = iscsi_event_modify,
+       .ep_malloc              = iscsi_tcp_malloc,
+       .ep_free                = iscsi_tcp_free,
 };
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index 8463947..59f226c 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -967,7 +967,7 @@ iscsi_alloc_task(struct iscsi_connection *conn, int ext_len)
        struct iscsi_hdr *req = (struct iscsi_hdr *) &conn->req.bhs;
        struct iscsi_task *task;
 
-       task = malloc(sizeof(*task) + ext_len);
+       task = conn->tp->ep_malloc(conn, sizeof(*task) + ext_len);
        if (!task)
                return NULL;
        memset(task, 0, sizeof(*task));
@@ -989,8 +989,8 @@ void iscsi_free_task(struct iscsi_task *task)
        struct iscsi_connection *conn = task->conn;
 
        if (task->addr && task->addr != (unsigned long) task->data)
-               free((void *) (unsigned long) task->addr);
-       free(task);
+               conn->tp->ep_free(conn, (void *) (unsigned long) task->addr);
+       conn->tp->ep_free(conn, task);
        /* from alloc */
        conn_put(conn);
 }
@@ -1129,7 +1129,7 @@ static int iscsi_target_cmd_queue(struct iscsi_task *task)
                        void *buf;
 
                        len = roundup(task->read_len, 4);
-                       buf = malloc(len);
+                       buf = conn->tp->ep_malloc(conn, len);
                        if (!buf)
                                return -ENOMEM;
                        scmd->bidi_uaddr = (unsigned long) buf;
diff --git a/usr/iscsi/transport.h b/usr/iscsi/transport.h
index 9660396..c37d0da 100644
--- a/usr/iscsi/transport.h
+++ b/usr/iscsi/transport.h
@@ -1,6 +1,8 @@
 #ifndef __TRANSPORT_H
 #define __TRANSPORT_H
 
+struct iscsi_connection;
+
 struct iscsi_transport {
        const char *name;
        int rdma;
@@ -12,6 +14,8 @@ struct iscsi_transport {
        size_t (*ep_close) (int ep);
        int (*ep_show) (int ep, char *buf, int rest);
        void (*ep_event_modify) (int ep, int events);
+       void *(*ep_malloc) (struct iscsi_connection *conn, size_t sz);
+       void (*ep_free) (struct iscsi_connection *conn, void *buf);
 };
 
 extern struct iscsi_transport iscsi_tcp;
-- 
1.5.3.4

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

Reply via email to