[openfabrics-ewg] [PATCH 3/4] IB/iSER: Add open-iscsi backport patches for SLES 10
Erez Zilber
erezz at voltaire.com
Sun Dec 31 08:37:56 PST 2006
Erez Zilber wrote:
>
> 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;
>
>
> _______________________________________________
> openfabrics-ewg mailing list
> openfabrics-ewg at openib.org
> http://openib.org/mailman/listinfo/openfabrics-ewg
>
Vlad,
Can you add this backport patch also to kernel_patches/backport/2.6.18?
Is there a way to share patches between different kernels or do you just
need to duplicate them?
Thanks,
--
____________________________________________________________
Erez Zilber | 972-9-971-7689
Software Engineer, Storage Team
Voltaire – _The Grid Backbone_
__
www.voltaire.com <http://www.voltaire.com/>
More information about the ewg
mailing list