[openfabrics-ewg] [PATCH 3/4] IB/iSER: Add open-iscsi backport patches for SLES 10

Vladimir Sokolovsky vlad at dev.mellanox.co.il
Wed Jan 3 05:16:07 PST 2007


Erez Zilber wrote:
> 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,
>   
Done,
Currently patches are duplicated.


Regards,
Vladimir




More information about the ewg mailing list