[openfabrics-ewg] [PATCH 3/4] IB/iSER: Add open-iscsi backport patches for SLES 10
Erez Zilber
erezz at voltaire.com
Sun Dec 31 05:36:27 PST 2006
Add open-iscsi backport patches for SLES 10.
Signed-off-by: Erez Zilber <erezz at voltaire.com>
diff -ruN ofa_1_2_kernel-20061228-0200/kernel_patches/backport/2.6.16_sles10/open-iscsi-tx-hash-fixes.patch ofa_1_2_kernel-20061228-0200-open-iscsi/kernel_patches/backport/2.6.16_sles10/open-iscsi-tx-hash-fixes.patch
--- ofa_1_2_kernel-20061228-0200/kernel_patches/backport/2.6.16_sles10/open-iscsi-tx-hash-fixes.patch 1970-01-01 02:00:00.000000000 +0200
+++ ofa_1_2_kernel-20061228-0200-open-iscsi/kernel_patches/backport/2.6.16_sles10/open-iscsi-tx-hash-fixes.patch 2006-12-28 17:01:44.000000000 +0200
@@ -0,0 +1,275 @@
+diff -rup open-iscsi-kernel/drivers/scsi/iscsi_tcp.c open-iscsi-kernel-backport-sles10/drivers/scsi/iscsi_tcp.c
+--- open-iscsi-kernel/drivers/scsi/iscsi_tcp.c 2006-12-26 18:08:33.000000000 +0200
++++ open-iscsi-kernel-backport-sles10/drivers/scsi/iscsi_tcp.c 2006-12-27 15:14:51.000000000 +0200
+@@ -108,8 +108,8 @@ iscsi_hdr_digest(struct iscsi_conn *conn
+ {
+ struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+
+- crypto_hash_digest(&tcp_conn->tx_hash, &buf->sg, buf->sg.length, crc);
+- buf->sg.length = tcp_conn->hdr_size;
++ crypto_digest_digest(tcp_conn->tx_tfm, &buf->sg, 1, crc);
++ buf->sg.length += sizeof(uint32_t);
+ }
+
+ static inline int
+@@ -468,8 +468,7 @@ iscsi_tcp_hdr_recv(struct iscsi_conn *co
+
+ sg_init_one(&sg, (u8 *)hdr,
+ sizeof(struct iscsi_hdr) + ahslen);
+- crypto_hash_digest(&tcp_conn->rx_hash, &sg, sg.length,
+- (u8 *)&cdgst);
++ crypto_digest_digest(tcp_conn->rx_tfm, &sg, 1, (u8 *)&cdgst);
+ rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) +
+ ahslen);
+ if (cdgst != rdgst) {
+@@ -649,9 +648,10 @@ iscsi_ctask_copy(struct iscsi_tcp_conn *
+ * byte counters.
+ **/
+ static inline int
+-iscsi_tcp_copy(struct iscsi_conn *conn, int buf_size)
++iscsi_tcp_copy(struct iscsi_conn *conn)
+ {
+ struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
++ int buf_size = tcp_conn->in.datalen;
+ int buf_left = buf_size - tcp_conn->data_copied;
+ int size = min(tcp_conn->in.copy, buf_left);
+ int rc;
+@@ -676,7 +676,7 @@ iscsi_tcp_copy(struct iscsi_conn *conn,
+ }
+
+ static inline void
+-partial_sg_digest_update(struct hash_desc *desc, struct scatterlist *sg,
++partial_sg_digest_update(struct crypto_tfm *tfm, struct scatterlist *sg,
+ int offset, int length)
+ {
+ struct scatterlist temp;
+@@ -684,7 +684,7 @@ partial_sg_digest_update(struct hash_des
+ memcpy(&temp, sg, sizeof(struct scatterlist));
+ temp.offset = offset;
+ temp.length = length;
+- crypto_hash_update(desc, &temp, length);
++ crypto_digest_update(tfm, &temp, 1);
+ }
+
+ static void
+@@ -693,7 +693,7 @@ iscsi_recv_digest_update(struct iscsi_tc
+ struct scatterlist tmp;
+
+ sg_init_one(&tmp, buf, len);
+- crypto_hash_update(&tcp_conn->rx_hash, &tmp, len);
++ crypto_digest_update(tcp_conn->rx_tfm, &tmp, 1);
+ }
+
+ static int iscsi_scsi_data_in(struct iscsi_conn *conn)
+@@ -747,12 +747,12 @@ static int iscsi_scsi_data_in(struct isc
+ if (!rc) {
+ if (conn->datadgst_en) {
+ if (!offset)
+- crypto_hash_update(
+- &tcp_conn->rx_hash,
++ crypto_digest_update(
++ tcp_conn->rx_tfm,
+ &sg[i], 1);
+ else
+ partial_sg_digest_update(
+- &tcp_conn->rx_hash,
++ tcp_conn->rx_tfm,
+ &sg[i],
+ sg[i].offset + offset,
+ sg[i].length - offset);
+@@ -766,10 +766,9 @@ static int iscsi_scsi_data_in(struct isc
+ /*
+ * data-in is complete, but buffer not...
+ */
+- partial_sg_digest_update(&tcp_conn->rx_hash,
+- &sg[i],
+- sg[i].offset,
+- sg[i].length-rc);
++ partial_sg_digest_update(tcp_conn->rx_tfm,
++ &sg[i],
++ sg[i].offset, sg[i].length-rc);
+ rc = 0;
+ break;
+ }
+@@ -813,7 +812,7 @@ iscsi_data_recv(struct iscsi_conn *conn)
+ * Collect data segment to the connection's data
+ * placeholder
+ */
+- if (iscsi_tcp_copy(conn, tcp_conn->in.datalen)) {
++ if (iscsi_tcp_copy(conn)) {
+ rc = -EAGAIN;
+ goto exit;
+ }
+@@ -887,7 +886,7 @@ more:
+ rc = iscsi_tcp_hdr_recv(conn);
+ if (!rc && tcp_conn->in.datalen) {
+ if (conn->datadgst_en)
+- crypto_hash_init(&tcp_conn->rx_hash);
++ crypto_digest_init(tcp_conn->rx_tfm);
+ tcp_conn->in_progress = IN_PROGRESS_DATA_RECV;
+ } else if (rc) {
+ iscsi_conn_failure(conn, rc);
+@@ -900,15 +899,10 @@ more:
+
+ debug_tcp("extra data_recv offset %d copy %d\n",
+ tcp_conn->in.offset, tcp_conn->in.copy);
+- rc = iscsi_tcp_copy(conn, sizeof(uint32_t));
+- if (rc) {
+- if (rc == -EAGAIN)
+- goto again;
+- iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
+- return 0;
+- }
+-
+- memcpy(&recv_digest, conn->data, sizeof(uint32_t));
++ skb_copy_bits(tcp_conn->in.skb, tcp_conn->in.offset,
++ &recv_digest, 4);
++ tcp_conn->in.offset += 4;
++ tcp_conn->in.copy -= 4;
+ if (recv_digest != tcp_conn->in.datadgst) {
+ debug_tcp("iscsi_tcp: data digest error!"
+ "0x%x != 0x%x\n", recv_digest,
+@@ -944,14 +938,13 @@ more:
+ tcp_conn->in.padding);
+ memset(pad, 0, tcp_conn->in.padding);
+ sg_init_one(&sg, pad, tcp_conn->in.padding);
+- crypto_hash_update(&tcp_conn->rx_hash,
+- &sg, sg.length);
++ crypto_digest_update(tcp_conn->rx_tfm,
++ &sg, 1);
+ }
+- crypto_hash_final(&tcp_conn->rx_hash,
+- (u8 *) &tcp_conn->in.datadgst);
++ crypto_digest_final(tcp_conn->rx_tfm,
++ (u8 *) & tcp_conn->in.datadgst);
+ debug_tcp("rx digest 0x%x\n", tcp_conn->in.datadgst);
+ tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV;
+- tcp_conn->data_copied = 0;
+ } else
+ tcp_conn->in_progress = IN_PROGRESS_WAIT_HEADER;
+ }
+@@ -1193,7 +1186,7 @@ static inline void
+ iscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn,
+ struct iscsi_tcp_cmd_task *tcp_ctask)
+ {
+- crypto_hash_init(&tcp_conn->tx_hash);
++ crypto_digest_init(tcp_conn->tx_tfm);
+ tcp_ctask->digest_count = 4;
+ }
+
+@@ -1449,9 +1442,8 @@ iscsi_send_padding(struct iscsi_conn *co
+ iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad,
+ tcp_ctask->pad_count);
+ if (conn->datadgst_en)
+- crypto_hash_update(&tcp_conn->tx_hash,
+- &tcp_ctask->sendbuf.sg,
+- tcp_ctask->sendbuf.sg.length);
++ crypto_digest_update(tcp_conn->tx_tfm,
++ &tcp_ctask->sendbuf.sg, 1);
+ } else if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_PAD))
+ return 0;
+
+@@ -1483,7 +1475,7 @@ iscsi_send_digest(struct iscsi_conn *con
+ tcp_conn = conn->dd_data;
+
+ if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_DATA_DIGEST)) {
+- crypto_hash_final(&tcp_conn->tx_hash, (u8*)digest);
++ crypto_digest_final(tcp_conn->tx_tfm, (u8*)digest);
+ iscsi_buf_init_iov(buf, (char*)digest, 4);
+ }
+ tcp_ctask->xmstate &= ~XMSTATE_W_RESEND_DATA_DIGEST;
+@@ -1517,7 +1509,7 @@ iscsi_send_data(struct iscsi_cmd_task *c
+ rc = iscsi_sendpage(conn, sendbuf, count, &buf_sent);
+ *sent = *sent + buf_sent;
+ if (buf_sent && conn->datadgst_en)
+- partial_sg_digest_update(&tcp_conn->tx_hash,
++ partial_sg_digest_update(tcp_conn->tx_tfm,
+ &sendbuf->sg, sendbuf->sg.offset + offset,
+ buf_sent);
+ if (!iscsi_buf_left(sendbuf) && *sg != tcp_ctask->bad_sg) {
+@@ -1774,22 +1766,18 @@ iscsi_tcp_conn_create(struct iscsi_cls_s
+ /* initial operational parameters */
+ tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
+
+- tcp_conn->tx_hash.tfm = crypto_alloc_hash("crc32c", 0,
+- CRYPTO_ALG_ASYNC);
+- tcp_conn->tx_hash.flags = 0;
+- if (!tcp_conn->tx_hash.tfm)
++ tcp_conn->tx_tfm = crypto_alloc_tfm("crc32c", 0);
++ if (!tcp_conn->tx_tfm)
+ goto free_tcp_conn;
+
+- tcp_conn->rx_hash.tfm = crypto_alloc_hash("crc32c", 0,
+- CRYPTO_ALG_ASYNC);
+- tcp_conn->rx_hash.flags = 0;
+- if (!tcp_conn->rx_hash.tfm)
++ tcp_conn->rx_tfm = crypto_alloc_tfm("crc32c", 0);
++ if (!tcp_conn->rx_tfm)
+ goto free_tx_tfm;
+
+ return cls_conn;
+
+ free_tx_tfm:
+- crypto_free_hash(tcp_conn->tx_hash.tfm);
++ crypto_free_tfm(tcp_conn->tx_tfm);
+ free_tcp_conn:
+ kfree(tcp_conn);
+ tcp_conn_alloc_fail:
+@@ -1823,11 +1811,10 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_
+ iscsi_tcp_release_conn(conn);
+ iscsi_conn_teardown(cls_conn);
+
+- if (tcp_conn->tx_hash.tfm)
+- crypto_free_hash(tcp_conn->tx_hash.tfm);
+- if (tcp_conn->rx_hash.tfm)
+- crypto_free_hash(tcp_conn->rx_hash.tfm);
+-
++ if (tcp_conn->tx_tfm)
++ crypto_free_tfm(tcp_conn->tx_tfm);
++ if (tcp_conn->rx_tfm)
++ crypto_free_tfm(tcp_conn->rx_tfm);
+ kfree(tcp_conn);
+ }
+
+@@ -1835,11 +1822,9 @@ static void
+ iscsi_tcp_conn_stop(struct iscsi_cls_conn *cls_conn, int flag)
+ {
+ struct iscsi_conn *conn = cls_conn->dd_data;
+- struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+
+ iscsi_conn_stop(cls_conn, flag);
+ iscsi_tcp_release_conn(conn);
+- tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
+ }
+
+ static int
+diff -rup open-iscsi-kernel/drivers/scsi/iscsi_tcp.h open-iscsi-kernel-backport-sles10/drivers/scsi/iscsi_tcp.h
+--- open-iscsi-kernel/drivers/scsi/iscsi_tcp.h 2006-12-26 18:08:33.000000000 +0200
++++ open-iscsi-kernel-backport-sles10/drivers/scsi/iscsi_tcp.h 2006-12-27 15:07:48.000000000 +0200
+@@ -49,7 +49,6 @@
+ #define ISCSI_SG_TABLESIZE SG_ALL
+ #define ISCSI_TCP_MAX_CMD_LEN 16
+
+-struct crypto_hash;
+ struct socket;
+
+ /* Socket connection recieve helper */
+@@ -82,7 +81,6 @@ struct iscsi_tcp_conn {
+ * stop to terminate */
+ /* iSCSI connection-wide sequencing */
+ int hdr_size; /* PDU header size */
+-
+ /* control data */
+ struct iscsi_tcp_recv in; /* TCP receive context */
+ int in_progress; /* connection state machine */
+@@ -93,8 +91,8 @@ struct iscsi_tcp_conn {
+ void (*old_write_space)(struct sock *);
+
+ /* data and header digests */
+- struct hash_desc tx_hash; /* CRC32C (Tx) */
+- struct hash_desc rx_hash; /* CRC32C (Rx) */
++ struct crypto_tfm *tx_tfm; /* CRC32C (Tx) */
++ struct crypto_tfm *rx_tfm; /* CRC32C (Rx) */
+
+ /* MIB custom statistics */
+ uint32_t sendpage_failures_cnt;
More information about the ewg
mailing list