diff options
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
-rw-r--r-- | drivers/scsi/iscsi_tcp.c | 134 |
1 files changed, 73 insertions, 61 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c index 058f094f945a..66a1ae1d6982 100644 --- a/drivers/scsi/iscsi_tcp.c +++ b/drivers/scsi/iscsi_tcp.c | |||
@@ -26,6 +26,7 @@ | |||
26 | * Zhenyu Wang | 26 | * Zhenyu Wang |
27 | */ | 27 | */ |
28 | 28 | ||
29 | #include <linux/err.h> | ||
29 | #include <linux/types.h> | 30 | #include <linux/types.h> |
30 | #include <linux/list.h> | 31 | #include <linux/list.h> |
31 | #include <linux/inet.h> | 32 | #include <linux/inet.h> |
@@ -107,8 +108,11 @@ iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf, | |||
107 | u8* crc) | 108 | u8* crc) |
108 | { | 109 | { |
109 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; | 110 | struct iscsi_tcp_conn *tcp_conn = conn->dd_data; |
111 | struct hash_desc desc; | ||
110 | 112 | ||
111 | crypto_digest_digest(tcp_conn->tx_tfm, &buf->sg, 1, crc); | 113 | desc.tfm = tcp_conn->tx_tfm; |
114 | desc.flags = 0; | ||
115 | crypto_hash_digest(&desc, &buf->sg, buf->sg.length, crc); | ||
112 | buf->sg.length += sizeof(uint32_t); | 116 | buf->sg.length += sizeof(uint32_t); |
113 | } | 117 | } |
114 | 118 | ||
@@ -452,11 +456,14 @@ iscsi_tcp_hdr_recv(struct iscsi_conn *conn) | |||
452 | } | 456 | } |
453 | 457 | ||
454 | if (conn->hdrdgst_en) { | 458 | if (conn->hdrdgst_en) { |
459 | struct hash_desc desc; | ||
455 | struct scatterlist sg; | 460 | struct scatterlist sg; |
456 | 461 | ||
457 | sg_init_one(&sg, (u8 *)hdr, | 462 | sg_init_one(&sg, (u8 *)hdr, |
458 | sizeof(struct iscsi_hdr) + ahslen); | 463 | sizeof(struct iscsi_hdr) + ahslen); |
459 | crypto_digest_digest(tcp_conn->rx_tfm, &sg, 1, (u8 *)&cdgst); | 464 | desc.tfm = tcp_conn->rx_tfm; |
465 | desc.flags = 0; | ||
466 | crypto_hash_digest(&desc, &sg, sg.length, (u8 *)&cdgst); | ||
460 | rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) + | 467 | rdgst = *(uint32_t*)((char*)hdr + sizeof(struct iscsi_hdr) + |
461 | ahslen); | 468 | ahslen); |
462 | if (cdgst != rdgst) { | 469 | if (cdgst != rdgst) { |
@@ -673,7 +680,7 @@ partial_sg_digest_update(struct iscsi_tcp_conn *tcp_conn, | |||
673 | memcpy(&temp, sg, sizeof(struct scatterlist)); | 680 | memcpy(&temp, sg, sizeof(struct scatterlist)); |
674 | temp.offset = offset; | 681 | temp.offset = offset; |
675 | temp.length = length; | 682 | temp.length = length; |
676 | crypto_digest_update(tcp_conn->data_rx_tfm, &temp, 1); | 683 | crypto_hash_update(&tcp_conn->data_rx_hash, &temp, length); |
677 | } | 684 | } |
678 | 685 | ||
679 | static void | 686 | static void |
@@ -682,7 +689,7 @@ iscsi_recv_digest_update(struct iscsi_tcp_conn *tcp_conn, char* buf, int len) | |||
682 | struct scatterlist tmp; | 689 | struct scatterlist tmp; |
683 | 690 | ||
684 | sg_init_one(&tmp, buf, len); | 691 | sg_init_one(&tmp, buf, len); |
685 | crypto_digest_update(tcp_conn->data_rx_tfm, &tmp, 1); | 692 | crypto_hash_update(&tcp_conn->data_rx_hash, &tmp, len); |
686 | } | 693 | } |
687 | 694 | ||
688 | static int iscsi_scsi_data_in(struct iscsi_conn *conn) | 695 | static int iscsi_scsi_data_in(struct iscsi_conn *conn) |
@@ -736,9 +743,9 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn) | |||
736 | if (!rc) { | 743 | if (!rc) { |
737 | if (conn->datadgst_en) { | 744 | if (conn->datadgst_en) { |
738 | if (!offset) | 745 | if (!offset) |
739 | crypto_digest_update( | 746 | crypto_hash_update( |
740 | tcp_conn->data_rx_tfm, | 747 | &tcp_conn->data_rx_hash, |
741 | &sg[i], 1); | 748 | &sg[i], sg[i].length); |
742 | else | 749 | else |
743 | partial_sg_digest_update(tcp_conn, | 750 | partial_sg_digest_update(tcp_conn, |
744 | &sg[i], | 751 | &sg[i], |
@@ -877,8 +884,7 @@ more: | |||
877 | rc = iscsi_tcp_hdr_recv(conn); | 884 | rc = iscsi_tcp_hdr_recv(conn); |
878 | if (!rc && tcp_conn->in.datalen) { | 885 | if (!rc && tcp_conn->in.datalen) { |
879 | if (conn->datadgst_en) { | 886 | if (conn->datadgst_en) { |
880 | BUG_ON(!tcp_conn->data_rx_tfm); | 887 | crypto_hash_init(&tcp_conn->data_rx_hash); |
881 | crypto_digest_init(tcp_conn->data_rx_tfm); | ||
882 | } | 888 | } |
883 | tcp_conn->in_progress = IN_PROGRESS_DATA_RECV; | 889 | tcp_conn->in_progress = IN_PROGRESS_DATA_RECV; |
884 | } else if (rc) { | 890 | } else if (rc) { |
@@ -931,11 +937,11 @@ more: | |||
931 | tcp_conn->in.padding); | 937 | tcp_conn->in.padding); |
932 | memset(pad, 0, tcp_conn->in.padding); | 938 | memset(pad, 0, tcp_conn->in.padding); |
933 | sg_init_one(&sg, pad, tcp_conn->in.padding); | 939 | sg_init_one(&sg, pad, tcp_conn->in.padding); |
934 | crypto_digest_update(tcp_conn->data_rx_tfm, | 940 | crypto_hash_update(&tcp_conn->data_rx_hash, |
935 | &sg, 1); | 941 | &sg, sg.length); |
936 | } | 942 | } |
937 | crypto_digest_final(tcp_conn->data_rx_tfm, | 943 | crypto_hash_final(&tcp_conn->data_rx_hash, |
938 | (u8 *) & tcp_conn->in.datadgst); | 944 | (u8 *)&tcp_conn->in.datadgst); |
939 | debug_tcp("rx digest 0x%x\n", tcp_conn->in.datadgst); | 945 | debug_tcp("rx digest 0x%x\n", tcp_conn->in.datadgst); |
940 | tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV; | 946 | tcp_conn->in_progress = IN_PROGRESS_DDIGEST_RECV; |
941 | } else | 947 | } else |
@@ -1181,8 +1187,7 @@ iscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn, | |||
1181 | { | 1187 | { |
1182 | struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; | 1188 | struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; |
1183 | 1189 | ||
1184 | BUG_ON(!tcp_conn->data_tx_tfm); | 1190 | crypto_hash_init(&tcp_conn->data_tx_hash); |
1185 | crypto_digest_init(tcp_conn->data_tx_tfm); | ||
1186 | tcp_ctask->digest_count = 4; | 1191 | tcp_ctask->digest_count = 4; |
1187 | } | 1192 | } |
1188 | 1193 | ||
@@ -1196,7 +1201,7 @@ iscsi_digest_final_send(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask, | |||
1196 | int sent = 0; | 1201 | int sent = 0; |
1197 | 1202 | ||
1198 | if (final) | 1203 | if (final) |
1199 | crypto_digest_final(tcp_conn->data_tx_tfm, (u8*)digest); | 1204 | crypto_hash_final(&tcp_conn->data_tx_hash, (u8 *)digest); |
1200 | 1205 | ||
1201 | iscsi_buf_init_iov(buf, (char*)digest, 4); | 1206 | iscsi_buf_init_iov(buf, (char*)digest, 4); |
1202 | rc = iscsi_sendpage(conn, buf, &tcp_ctask->digest_count, &sent); | 1207 | rc = iscsi_sendpage(conn, buf, &tcp_ctask->digest_count, &sent); |
@@ -1491,16 +1496,17 @@ handle_xmstate_imm_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
1491 | if (rc) { | 1496 | if (rc) { |
1492 | tcp_ctask->xmstate |= XMSTATE_IMM_DATA; | 1497 | tcp_ctask->xmstate |= XMSTATE_IMM_DATA; |
1493 | if (conn->datadgst_en) { | 1498 | if (conn->datadgst_en) { |
1494 | crypto_digest_final(tcp_conn->data_tx_tfm, | 1499 | crypto_hash_final(&tcp_conn->data_tx_hash, |
1495 | (u8*)&tcp_ctask->immdigest); | 1500 | (u8 *)&tcp_ctask->immdigest); |
1496 | debug_tcp("tx imm sendpage fail 0x%x\n", | 1501 | debug_tcp("tx imm sendpage fail 0x%x\n", |
1497 | tcp_ctask->datadigest); | 1502 | tcp_ctask->datadigest); |
1498 | } | 1503 | } |
1499 | return rc; | 1504 | return rc; |
1500 | } | 1505 | } |
1501 | if (conn->datadgst_en) | 1506 | if (conn->datadgst_en) |
1502 | crypto_digest_update(tcp_conn->data_tx_tfm, | 1507 | crypto_hash_update(&tcp_conn->data_tx_hash, |
1503 | &tcp_ctask->sendbuf.sg, 1); | 1508 | &tcp_ctask->sendbuf.sg, |
1509 | tcp_ctask->sendbuf.sg.length); | ||
1504 | 1510 | ||
1505 | if (!ctask->imm_count) | 1511 | if (!ctask->imm_count) |
1506 | break; | 1512 | break; |
@@ -1577,8 +1583,8 @@ handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
1577 | tcp_ctask->xmstate |= XMSTATE_UNS_DATA; | 1583 | tcp_ctask->xmstate |= XMSTATE_UNS_DATA; |
1578 | /* will continue with this ctask later.. */ | 1584 | /* will continue with this ctask later.. */ |
1579 | if (conn->datadgst_en) { | 1585 | if (conn->datadgst_en) { |
1580 | crypto_digest_final(tcp_conn->data_tx_tfm, | 1586 | crypto_hash_final(&tcp_conn->data_tx_hash, |
1581 | (u8 *)&dtask->digest); | 1587 | (u8 *)&dtask->digest); |
1582 | debug_tcp("tx uns data fail 0x%x\n", | 1588 | debug_tcp("tx uns data fail 0x%x\n", |
1583 | dtask->digest); | 1589 | dtask->digest); |
1584 | } | 1590 | } |
@@ -1593,8 +1599,9 @@ handle_xmstate_uns_data(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
1593 | * so pass it | 1599 | * so pass it |
1594 | */ | 1600 | */ |
1595 | if (conn->datadgst_en && tcp_ctask->sent - start > 0) | 1601 | if (conn->datadgst_en && tcp_ctask->sent - start > 0) |
1596 | crypto_digest_update(tcp_conn->data_tx_tfm, | 1602 | crypto_hash_update(&tcp_conn->data_tx_hash, |
1597 | &tcp_ctask->sendbuf.sg, 1); | 1603 | &tcp_ctask->sendbuf.sg, |
1604 | tcp_ctask->sendbuf.sg.length); | ||
1598 | 1605 | ||
1599 | if (!ctask->data_count) | 1606 | if (!ctask->data_count) |
1600 | break; | 1607 | break; |
@@ -1668,7 +1675,7 @@ solicit_again: | |||
1668 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; | 1675 | tcp_ctask->xmstate |= XMSTATE_SOL_DATA; |
1669 | /* will continue with this ctask later.. */ | 1676 | /* will continue with this ctask later.. */ |
1670 | if (conn->datadgst_en) { | 1677 | if (conn->datadgst_en) { |
1671 | crypto_digest_final(tcp_conn->data_tx_tfm, | 1678 | crypto_hash_final(&tcp_conn->data_tx_hash, |
1672 | (u8 *)&dtask->digest); | 1679 | (u8 *)&dtask->digest); |
1673 | debug_tcp("r2t data send fail 0x%x\n", dtask->digest); | 1680 | debug_tcp("r2t data send fail 0x%x\n", dtask->digest); |
1674 | } | 1681 | } |
@@ -1677,8 +1684,8 @@ solicit_again: | |||
1677 | 1684 | ||
1678 | BUG_ON(r2t->data_count < 0); | 1685 | BUG_ON(r2t->data_count < 0); |
1679 | if (conn->datadgst_en) | 1686 | if (conn->datadgst_en) |
1680 | crypto_digest_update(tcp_conn->data_tx_tfm, &r2t->sendbuf.sg, | 1687 | crypto_hash_update(&tcp_conn->data_tx_hash, &r2t->sendbuf.sg, |
1681 | 1); | 1688 | r2t->sendbuf.sg.length); |
1682 | 1689 | ||
1683 | if (r2t->data_count) { | 1690 | if (r2t->data_count) { |
1684 | BUG_ON(ctask->sc->use_sg == 0); | 1691 | BUG_ON(ctask->sc->use_sg == 0); |
@@ -1766,8 +1773,9 @@ handle_xmstate_w_pad(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask) | |||
1766 | } | 1773 | } |
1767 | 1774 | ||
1768 | if (conn->datadgst_en) { | 1775 | if (conn->datadgst_en) { |
1769 | crypto_digest_update(tcp_conn->data_tx_tfm, | 1776 | crypto_hash_update(&tcp_conn->data_tx_hash, |
1770 | &tcp_ctask->sendbuf.sg, 1); | 1777 | &tcp_ctask->sendbuf.sg, |
1778 | tcp_ctask->sendbuf.sg.length); | ||
1771 | /* imm data? */ | 1779 | /* imm data? */ |
1772 | if (!dtask) { | 1780 | if (!dtask) { |
1773 | rc = iscsi_digest_final_send(conn, ctask, | 1781 | rc = iscsi_digest_final_send(conn, ctask, |
@@ -1963,13 +1971,13 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn) | |||
1963 | /* now free tcp_conn */ | 1971 | /* now free tcp_conn */ |
1964 | if (digest) { | 1972 | if (digest) { |
1965 | if (tcp_conn->tx_tfm) | 1973 | if (tcp_conn->tx_tfm) |
1966 | crypto_free_tfm(tcp_conn->tx_tfm); | 1974 | crypto_free_hash(tcp_conn->tx_tfm); |
1967 | if (tcp_conn->rx_tfm) | 1975 | if (tcp_conn->rx_tfm) |
1968 | crypto_free_tfm(tcp_conn->rx_tfm); | 1976 | crypto_free_hash(tcp_conn->rx_tfm); |
1969 | if (tcp_conn->data_tx_tfm) | 1977 | if (tcp_conn->data_tx_hash.tfm) |
1970 | crypto_free_tfm(tcp_conn->data_tx_tfm); | 1978 | crypto_free_hash(tcp_conn->data_tx_hash.tfm); |
1971 | if (tcp_conn->data_rx_tfm) | 1979 | if (tcp_conn->data_rx_hash.tfm) |
1972 | crypto_free_tfm(tcp_conn->data_rx_tfm); | 1980 | crypto_free_hash(tcp_conn->data_rx_hash.tfm); |
1973 | } | 1981 | } |
1974 | 1982 | ||
1975 | kfree(tcp_conn); | 1983 | kfree(tcp_conn); |
@@ -2130,44 +2138,48 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param, | |||
2130 | if (conn->hdrdgst_en) { | 2138 | if (conn->hdrdgst_en) { |
2131 | tcp_conn->hdr_size += sizeof(__u32); | 2139 | tcp_conn->hdr_size += sizeof(__u32); |
2132 | if (!tcp_conn->tx_tfm) | 2140 | if (!tcp_conn->tx_tfm) |
2133 | tcp_conn->tx_tfm = crypto_alloc_tfm("crc32c", | 2141 | tcp_conn->tx_tfm = |
2134 | 0); | 2142 | crypto_alloc_hash("crc32c", 0, |
2135 | if (!tcp_conn->tx_tfm) | 2143 | CRYPTO_ALG_ASYNC); |
2136 | return -ENOMEM; | 2144 | if (IS_ERR(tcp_conn->tx_tfm)) |
2145 | return PTR_ERR(tcp_conn->tx_tfm); | ||
2137 | if (!tcp_conn->rx_tfm) | 2146 | if (!tcp_conn->rx_tfm) |
2138 | tcp_conn->rx_tfm = crypto_alloc_tfm("crc32c", | 2147 | tcp_conn->rx_tfm = |
2139 | 0); | 2148 | crypto_alloc_hash("crc32c", 0, |
2140 | if (!tcp_conn->rx_tfm) { | 2149 | CRYPTO_ALG_ASYNC); |
2141 | crypto_free_tfm(tcp_conn->tx_tfm); | 2150 | if (IS_ERR(tcp_conn->rx_tfm)) { |
2142 | return -ENOMEM; | 2151 | crypto_free_hash(tcp_conn->tx_tfm); |
2152 | return PTR_ERR(tcp_conn->rx_tfm); | ||
2143 | } | 2153 | } |
2144 | } else { | 2154 | } else { |
2145 | if (tcp_conn->tx_tfm) | 2155 | if (tcp_conn->tx_tfm) |
2146 | crypto_free_tfm(tcp_conn->tx_tfm); | 2156 | crypto_free_hash(tcp_conn->tx_tfm); |
2147 | if (tcp_conn->rx_tfm) | 2157 | if (tcp_conn->rx_tfm) |
2148 | crypto_free_tfm(tcp_conn->rx_tfm); | 2158 | crypto_free_hash(tcp_conn->rx_tfm); |
2149 | } | 2159 | } |
2150 | break; | 2160 | break; |
2151 | case ISCSI_PARAM_DATADGST_EN: | 2161 | case ISCSI_PARAM_DATADGST_EN: |
2152 | iscsi_set_param(cls_conn, param, buf, buflen); | 2162 | iscsi_set_param(cls_conn, param, buf, buflen); |
2153 | if (conn->datadgst_en) { | 2163 | if (conn->datadgst_en) { |
2154 | if (!tcp_conn->data_tx_tfm) | 2164 | if (!tcp_conn->data_tx_hash.tfm) |
2155 | tcp_conn->data_tx_tfm = | 2165 | tcp_conn->data_tx_hash.tfm = |
2156 | crypto_alloc_tfm("crc32c", 0); | 2166 | crypto_alloc_hash("crc32c", 0, |
2157 | if (!tcp_conn->data_tx_tfm) | 2167 | CRYPTO_ALG_ASYNC); |
2158 | return -ENOMEM; | 2168 | if (IS_ERR(tcp_conn->data_tx_hash.tfm)) |
2159 | if (!tcp_conn->data_rx_tfm) | 2169 | return PTR_ERR(tcp_conn->data_tx_hash.tfm); |
2160 | tcp_conn->data_rx_tfm = | 2170 | if (!tcp_conn->data_rx_hash.tfm) |
2161 | crypto_alloc_tfm("crc32c", 0); | 2171 | tcp_conn->data_rx_hash.tfm = |
2162 | if (!tcp_conn->data_rx_tfm) { | 2172 | crypto_alloc_hash("crc32c", 0, |
2163 | crypto_free_tfm(tcp_conn->data_tx_tfm); | 2173 | CRYPTO_ALG_ASYNC); |
2164 | return -ENOMEM; | 2174 | if (IS_ERR(tcp_conn->data_rx_hash.tfm)) { |
2175 | crypto_free_hash(tcp_conn->data_tx_hash.tfm); | ||
2176 | return PTR_ERR(tcp_conn->data_rx_hash.tfm); | ||
2165 | } | 2177 | } |
2166 | } else { | 2178 | } else { |
2167 | if (tcp_conn->data_tx_tfm) | 2179 | if (tcp_conn->data_tx_hash.tfm) |
2168 | crypto_free_tfm(tcp_conn->data_tx_tfm); | 2180 | crypto_free_hash(tcp_conn->data_tx_hash.tfm); |
2169 | if (tcp_conn->data_rx_tfm) | 2181 | if (tcp_conn->data_rx_hash.tfm) |
2170 | crypto_free_tfm(tcp_conn->data_rx_tfm); | 2182 | crypto_free_hash(tcp_conn->data_rx_hash.tfm); |
2171 | } | 2183 | } |
2172 | tcp_conn->sendpage = conn->datadgst_en ? | 2184 | tcp_conn->sendpage = conn->datadgst_en ? |
2173 | sock_no_sendpage : tcp_conn->sock->ops->sendpage; | 2185 | sock_no_sendpage : tcp_conn->sock->ops->sendpage; |