[PATCH 1/3 2.6.28] cxgb3i/open-iscsi - modified tcp out segment xmiting.

From: Karen Xie <[EMAIL PROTECTED]>

removed flush_conn() from the transport template, added xmit_segment() to
tcp_conn. For tcp transport, xmit_segment points to iscsi_xmit().

This patch is based on the cxgb3 branch of the git tree.

Signed-off-by: Karen Xie <[EMAIL PROTECTED]>
---

 drivers/scsi/cxgb3i/cxgb3i_iscsi.c  |   37 +++++++++++++++++------------------
 drivers/scsi/iscsi_tcp.c            |   10 +++++----
 drivers/scsi/iscsi_tcp.h            |    2 ++
 include/scsi/scsi_transport_iscsi.h |    2 --
 4 files changed, 25 insertions(+), 26 deletions(-)


diff --git a/drivers/scsi/cxgb3i/cxgb3i_iscsi.c 
b/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
index df97e15..e3a7443 100644
--- a/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
+++ b/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
@@ -399,6 +399,23 @@ static struct iscsi_cls_conn *cxgb3i_conn_create(struct 
iscsi_cls_session
 }
 
 /**
+ * cxgb3i_conn_xmit_segment - transmit segment
+ * @conn:      pointer to iscsi conn
+ */
+static int cxgb3i_conn_xmit_segment(struct iscsi_conn *conn)
+{
+       struct cxgb3i_conn *cconn = conn->dd_data;
+       struct iscsi_tcp_conn *tcp_conn = &cconn->tcp_conn;
+       struct iscsi_segment *segment = &tcp_conn->out.segment;
+
+       if (segment->total_copied < segment->total_size)
+                       return cxgb3i_conn_ulp2_xmit(conn);
+       return 0;
+}
+
+
+
+/**
  * cxgb3i_conn_bind - binds iscsi sess, conn and endpoint together
  * @cls_session:       pointer to iscsi cls session
  * @cls_conn:          pointer to iscsi cls conn
@@ -456,30 +473,13 @@ static int cxgb3i_conn_bind(struct iscsi_cls_session 
*cls_session,
        conn->portal_port = ntohs(c3cn->daddr.sin_port);
        spin_unlock_bh(&conn->session->lock);
 
+       tcp_conn->xmit_segment = cxgb3i_conn_xmit_segment;
        iscsi_tcp_hdr_recv_prep(tcp_conn);
 
        return 0;
 }
 
 /**
- * cxgb3i_conn_flush - flush tx
- * @conn:      pointer to iscsi conn
- */
-static int cxgb3i_conn_flush(struct iscsi_conn *conn)
-{
-       struct cxgb3i_conn *cconn = conn->dd_data;
-       struct iscsi_tcp_conn *tcp_conn = &cconn->tcp_conn;
-       struct iscsi_segment *segment = &tcp_conn->out.segment;
-
-       cxgb3i_log_debug("conn 0x%p, segment sent %u/%u.\n",
-                        conn, segment->total_copied, segment->total_size);
-
-       if (segment->total_copied < segment->total_size)
-               return cxgb3i_conn_ulp2_xmit(conn);
-       return 0;
-}
-
-/**
  * cxgb3i_conn_get_param - return iscsi connection parameter to caller
  * @cls_conn:  pointer to iscsi cls conn
  * @param:     parameter type identifier
@@ -756,7 +756,6 @@ static struct iscsi_transport cxgb3i_iscsi_transport = {
        .destroy_conn = iscsi_conn_teardown,
        .start_conn = iscsi_conn_start,
        .stop_conn = iscsi_conn_stop,
-       .flush_conn = cxgb3i_conn_flush,
        .get_conn_param = cxgb3i_conn_get_param,
        .set_param = cxgb3i_conn_set_param,
        .get_stats = cxgb3i_conn_get_stats,
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index c207fd1..4035676 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -1170,13 +1170,14 @@ iscsi_tcp_xmit_qlen(struct iscsi_conn *conn)
        return segment->total_copied - segment->total_size;
 }
 
-static int
+static inline int
 iscsi_tcp_flush(struct iscsi_conn *conn)
 {
        int rc;
+       struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
 
        while (iscsi_tcp_xmit_qlen(conn)) {
-               rc = iscsi_xmit(conn);
+               rc = tcp_conn->xmit_segment(conn);
                if (rc == 0)
                        return -EAGAIN;
                if (rc < 0)
@@ -1414,7 +1415,7 @@ iscsi_tcp_task_xmit(struct iscsi_task *task)
 
 flush:
        /* Flush any pending data first. */
-       rc = conn->session->tt->flush_conn(conn);
+       rc = iscsi_tcp_flush(conn);
        if (rc < 0)
                return rc;
 
@@ -1702,6 +1703,7 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
 
        iscsi_conn_set_callbacks(conn);
        tcp_conn->sendpage = tcp_conn->sock->ops->sendpage;
+       tcp_conn->xmit_segment = iscsi_xmit;
        /*
         * set receive state machine into initial state
         */
@@ -1923,7 +1925,6 @@ static void iscsi_tcp_session_destroy(struct 
iscsi_cls_session *cls_session)
        struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
 
        iscsi_r2tpool_free(cls_session->dd_data);
-       iscsi_session_teardown(cls_session);
 
        iscsi_host_remove(shost);
        iscsi_host_free(shost);
@@ -1998,7 +1999,6 @@ static struct iscsi_transport iscsi_tcp_transport = {
        .get_session_param      = iscsi_session_get_param,
        .start_conn             = iscsi_conn_start,
        .stop_conn              = iscsi_tcp_conn_stop,
-       .flush_conn             = iscsi_tcp_flush,
        /* iscsi host params */
        .get_host_param         = iscsi_host_get_param,
        .set_host_param         = iscsi_host_set_param,
diff --git a/drivers/scsi/iscsi_tcp.h b/drivers/scsi/iscsi_tcp.h
index 81ed0fb..dc42514 100644
--- a/drivers/scsi/iscsi_tcp.h
+++ b/drivers/scsi/iscsi_tcp.h
@@ -97,6 +97,8 @@ struct iscsi_tcp_conn {
 
        int                     error;
 
+       /* segment transmit */
+       int (*xmit_segment)(struct iscsi_conn *);
        ssize_t (*sendpage)(struct socket *, struct page *, int, size_t, int);
 };
 
diff --git a/include/scsi/scsi_transport_iscsi.h 
b/include/scsi/scsi_transport_iscsi.h
index eb4e34c..c678590 100644
--- a/include/scsi/scsi_transport_iscsi.h
+++ b/include/scsi/scsi_transport_iscsi.h
@@ -56,7 +56,6 @@ struct sockaddr;
  *                     is not supported, and a -Exx value on other error
  * @start_conn:                set connection to be operational
  * @stop_conn:         suspend/recover/terminate connection
- * @flush_conn:                flush a connection's transmit queue
  * @parse_itt:         parse the itt rcv'ed in BHS
  * @reserve_itt:       construct a task itt to be sent in BHS
  * @release_itt:       release a itt (constructed by reserve_itt)
@@ -113,7 +112,6 @@ struct iscsi_transport {
        int (*set_host_param) (struct Scsi_Host *shost,
                               enum iscsi_host_param param, char *buf,
                               int buflen);
-       int (*flush_conn) (struct iscsi_conn *conn);
        void (*parse_itt)(struct iscsi_conn *conn, itt_t hdr_itt,
                          int *idx, int *age);
        int (*reserve_itt)(struct iscsi_task *task, itt_t *hdr_itt);

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"open-iscsi" group.
To post to this group, send email to open-iscsi@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/open-iscsi
-~----------~----~----~----~------~----~------~--~---

Reply via email to