[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