[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 -~----------~----~----~----~------~----~------~--~---