mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-02 15:18:19 +00:00
[SCSI] scsi_tcp: rm data rx and tx tfms
We currently allocated seperate tfms for data and header digests. There is no reason for this since we can never calculate a rx header and digest at the same time. Same for sends. So this patch removes the data tfms and has the send and recv sides use the rx_tfm or tx_tfm. I also made the connection creation code preallocate the tfms because I thought I hit a bug where I changed the digests settings during a relogin but could not allocate the tfm and then we just failed. Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
This commit is contained in:
parent
62f383003c
commit
dd8c0d9586
2 changed files with 38 additions and 72 deletions
|
@ -693,7 +693,7 @@ iscsi_recv_digest_update(struct iscsi_tcp_conn *tcp_conn, char* buf, int len)
|
||||||
struct scatterlist tmp;
|
struct scatterlist tmp;
|
||||||
|
|
||||||
sg_init_one(&tmp, buf, len);
|
sg_init_one(&tmp, buf, len);
|
||||||
crypto_digest_update(tcp_conn->data_rx_tfm, &tmp, 1);
|
crypto_digest_update(tcp_conn->rx_tfm, &tmp, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iscsi_scsi_data_in(struct iscsi_conn *conn)
|
static int iscsi_scsi_data_in(struct iscsi_conn *conn)
|
||||||
|
@ -748,11 +748,11 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn)
|
||||||
if (conn->datadgst_en) {
|
if (conn->datadgst_en) {
|
||||||
if (!offset)
|
if (!offset)
|
||||||
crypto_digest_update(
|
crypto_digest_update(
|
||||||
tcp_conn->data_rx_tfm,
|
tcp_conn->rx_tfm,
|
||||||
&sg[i], 1);
|
&sg[i], 1);
|
||||||
else
|
else
|
||||||
partial_sg_digest_update(
|
partial_sg_digest_update(
|
||||||
tcp_conn->data_rx_tfm,
|
tcp_conn->rx_tfm,
|
||||||
&sg[i],
|
&sg[i],
|
||||||
sg[i].offset + offset,
|
sg[i].offset + offset,
|
||||||
sg[i].length - offset);
|
sg[i].length - offset);
|
||||||
|
@ -766,7 +766,7 @@ static int iscsi_scsi_data_in(struct iscsi_conn *conn)
|
||||||
/*
|
/*
|
||||||
* data-in is complete, but buffer not...
|
* data-in is complete, but buffer not...
|
||||||
*/
|
*/
|
||||||
partial_sg_digest_update(tcp_conn->data_rx_tfm,
|
partial_sg_digest_update(tcp_conn->rx_tfm,
|
||||||
&sg[i],
|
&sg[i],
|
||||||
sg[i].offset, sg[i].length-rc);
|
sg[i].offset, sg[i].length-rc);
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
@ -885,10 +885,8 @@ iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
|
||||||
*/
|
*/
|
||||||
rc = iscsi_tcp_hdr_recv(conn);
|
rc = iscsi_tcp_hdr_recv(conn);
|
||||||
if (!rc && tcp_conn->in.datalen) {
|
if (!rc && tcp_conn->in.datalen) {
|
||||||
if (conn->datadgst_en) {
|
if (conn->datadgst_en)
|
||||||
BUG_ON(!tcp_conn->data_rx_tfm);
|
crypto_digest_init(tcp_conn->rx_tfm);
|
||||||
crypto_digest_init(tcp_conn->data_rx_tfm);
|
|
||||||
}
|
|
||||||
tcp_conn->in_progress = IN_PROGRESS_DATA_RECV;
|
tcp_conn->in_progress = IN_PROGRESS_DATA_RECV;
|
||||||
} else if (rc) {
|
} else if (rc) {
|
||||||
iscsi_conn_failure(conn, rc);
|
iscsi_conn_failure(conn, rc);
|
||||||
|
@ -940,10 +938,10 @@ iscsi_tcp_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
|
||||||
tcp_conn->in.padding);
|
tcp_conn->in.padding);
|
||||||
memset(pad, 0, tcp_conn->in.padding);
|
memset(pad, 0, tcp_conn->in.padding);
|
||||||
sg_init_one(&sg, pad, tcp_conn->in.padding);
|
sg_init_one(&sg, pad, tcp_conn->in.padding);
|
||||||
crypto_digest_update(tcp_conn->data_rx_tfm,
|
crypto_digest_update(tcp_conn->rx_tfm,
|
||||||
&sg, 1);
|
&sg, 1);
|
||||||
}
|
}
|
||||||
crypto_digest_final(tcp_conn->data_rx_tfm,
|
crypto_digest_final(tcp_conn->rx_tfm,
|
||||||
(u8 *) & tcp_conn->in.datadgst);
|
(u8 *) & tcp_conn->in.datadgst);
|
||||||
debug_tcp("rx digest 0x%x\n", 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->in_progress = IN_PROGRESS_DDIGEST_RECV;
|
||||||
|
@ -1188,7 +1186,7 @@ static inline void
|
||||||
iscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn,
|
iscsi_data_digest_init(struct iscsi_tcp_conn *tcp_conn,
|
||||||
struct iscsi_tcp_cmd_task *tcp_ctask)
|
struct iscsi_tcp_cmd_task *tcp_ctask)
|
||||||
{
|
{
|
||||||
crypto_digest_init(tcp_conn->data_tx_tfm);
|
crypto_digest_init(tcp_conn->tx_tfm);
|
||||||
tcp_ctask->digest_count = 4;
|
tcp_ctask->digest_count = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1444,7 +1442,7 @@ iscsi_send_padding(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
||||||
iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad,
|
iscsi_buf_init_iov(&tcp_ctask->sendbuf, (char*)&tcp_ctask->pad,
|
||||||
tcp_ctask->pad_count);
|
tcp_ctask->pad_count);
|
||||||
if (conn->datadgst_en)
|
if (conn->datadgst_en)
|
||||||
crypto_digest_update(tcp_conn->data_tx_tfm,
|
crypto_digest_update(tcp_conn->tx_tfm,
|
||||||
&tcp_ctask->sendbuf.sg, 1);
|
&tcp_ctask->sendbuf.sg, 1);
|
||||||
} else if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_PAD))
|
} else if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_PAD))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1477,7 +1475,7 @@ iscsi_send_digest(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask,
|
||||||
tcp_conn = conn->dd_data;
|
tcp_conn = conn->dd_data;
|
||||||
|
|
||||||
if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_DATA_DIGEST)) {
|
if (!(tcp_ctask->xmstate & XMSTATE_W_RESEND_DATA_DIGEST)) {
|
||||||
crypto_digest_final(tcp_conn->data_tx_tfm, (u8*)digest);
|
crypto_digest_final(tcp_conn->tx_tfm, (u8*)digest);
|
||||||
iscsi_buf_init_iov(buf, (char*)digest, 4);
|
iscsi_buf_init_iov(buf, (char*)digest, 4);
|
||||||
}
|
}
|
||||||
tcp_ctask->xmstate &= ~XMSTATE_W_RESEND_DATA_DIGEST;
|
tcp_ctask->xmstate &= ~XMSTATE_W_RESEND_DATA_DIGEST;
|
||||||
|
@ -1511,7 +1509,7 @@ iscsi_send_data(struct iscsi_cmd_task *ctask, struct iscsi_buf *sendbuf,
|
||||||
rc = iscsi_sendpage(conn, sendbuf, count, &buf_sent);
|
rc = iscsi_sendpage(conn, sendbuf, count, &buf_sent);
|
||||||
*sent = *sent + buf_sent;
|
*sent = *sent + buf_sent;
|
||||||
if (buf_sent && conn->datadgst_en)
|
if (buf_sent && conn->datadgst_en)
|
||||||
partial_sg_digest_update(tcp_conn->data_tx_tfm,
|
partial_sg_digest_update(tcp_conn->tx_tfm,
|
||||||
&sendbuf->sg, sendbuf->sg.offset + offset,
|
&sendbuf->sg, sendbuf->sg.offset + offset,
|
||||||
buf_sent);
|
buf_sent);
|
||||||
if (!iscsi_buf_left(sendbuf) && *sg != tcp_ctask->bad_sg) {
|
if (!iscsi_buf_left(sendbuf) && *sg != tcp_ctask->bad_sg) {
|
||||||
|
@ -1547,10 +1545,6 @@ iscsi_send_unsol_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
||||||
if (conn->hdrdgst_en)
|
if (conn->hdrdgst_en)
|
||||||
iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
|
iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
|
||||||
(u8*)dtask->hdrext);
|
(u8*)dtask->hdrext);
|
||||||
if (conn->datadgst_en) {
|
|
||||||
iscsi_data_digest_init(ctask->conn->dd_data, tcp_ctask);
|
|
||||||
dtask->digest = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
tcp_ctask->xmstate &= ~XMSTATE_UNS_INIT;
|
tcp_ctask->xmstate &= ~XMSTATE_UNS_INIT;
|
||||||
iscsi_set_padding(tcp_ctask, ctask->data_count);
|
iscsi_set_padding(tcp_ctask, ctask->data_count);
|
||||||
|
@ -1563,6 +1557,12 @@ iscsi_send_unsol_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (conn->datadgst_en) {
|
||||||
|
dtask = &tcp_ctask->unsol_dtask;
|
||||||
|
iscsi_data_digest_init(ctask->conn->dd_data, tcp_ctask);
|
||||||
|
dtask->digest = 0;
|
||||||
|
}
|
||||||
|
|
||||||
debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n",
|
debug_scsi("uns dout [itt 0x%x dlen %d sent %d]\n",
|
||||||
ctask->itt, ctask->unsol_count, tcp_ctask->sent);
|
ctask->itt, ctask->unsol_count, tcp_ctask->sent);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1629,12 +1629,6 @@ static int iscsi_send_sol_pdu(struct iscsi_conn *conn,
|
||||||
if (conn->hdrdgst_en)
|
if (conn->hdrdgst_en)
|
||||||
iscsi_hdr_digest(conn, &r2t->headbuf,
|
iscsi_hdr_digest(conn, &r2t->headbuf,
|
||||||
(u8*)dtask->hdrext);
|
(u8*)dtask->hdrext);
|
||||||
|
|
||||||
if (conn->datadgst_en) {
|
|
||||||
iscsi_data_digest_init(conn->dd_data, tcp_ctask);
|
|
||||||
dtask->digest = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count);
|
rc = iscsi_sendhdr(conn, &r2t->headbuf, r2t->data_count);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
|
tcp_ctask->xmstate &= ~XMSTATE_SOL_DATA;
|
||||||
|
@ -1642,6 +1636,11 @@ static int iscsi_send_sol_pdu(struct iscsi_conn *conn,
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (conn->datadgst_en) {
|
||||||
|
iscsi_data_digest_init(conn->dd_data, tcp_ctask);
|
||||||
|
dtask->digest = 0;
|
||||||
|
}
|
||||||
|
|
||||||
iscsi_set_padding(tcp_ctask, r2t->data_count);
|
iscsi_set_padding(tcp_ctask, r2t->data_count);
|
||||||
debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n",
|
debug_scsi("sol dout [dsn %d itt 0x%x dlen %d sent %d]\n",
|
||||||
r2t->solicit_datasn - 1, ctask->itt, r2t->data_count,
|
r2t->solicit_datasn - 1, ctask->itt, r2t->data_count,
|
||||||
|
@ -1764,8 +1763,20 @@ iscsi_tcp_conn_create(struct iscsi_cls_session *cls_session, uint32_t conn_idx)
|
||||||
/* initial operational parameters */
|
/* initial operational parameters */
|
||||||
tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
|
tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
|
||||||
|
|
||||||
|
tcp_conn->tx_tfm = crypto_alloc_tfm("crc32c", 0);
|
||||||
|
if (!tcp_conn->tx_tfm)
|
||||||
|
goto free_tcp_conn;
|
||||||
|
|
||||||
|
tcp_conn->rx_tfm = crypto_alloc_tfm("crc32c", 0);
|
||||||
|
if (!tcp_conn->rx_tfm)
|
||||||
|
goto free_tx_tfm;
|
||||||
|
|
||||||
return cls_conn;
|
return cls_conn;
|
||||||
|
|
||||||
|
free_tx_tfm:
|
||||||
|
crypto_free_tfm(tcp_conn->tx_tfm);
|
||||||
|
free_tcp_conn:
|
||||||
|
kfree(tcp_conn);
|
||||||
tcp_conn_alloc_fail:
|
tcp_conn_alloc_fail:
|
||||||
iscsi_conn_teardown(cls_conn);
|
iscsi_conn_teardown(cls_conn);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1807,10 +1818,6 @@ iscsi_tcp_conn_destroy(struct iscsi_cls_conn *cls_conn)
|
||||||
crypto_free_tfm(tcp_conn->tx_tfm);
|
crypto_free_tfm(tcp_conn->tx_tfm);
|
||||||
if (tcp_conn->rx_tfm)
|
if (tcp_conn->rx_tfm)
|
||||||
crypto_free_tfm(tcp_conn->rx_tfm);
|
crypto_free_tfm(tcp_conn->rx_tfm);
|
||||||
if (tcp_conn->data_tx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->data_tx_tfm);
|
|
||||||
if (tcp_conn->data_rx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->data_rx_tfm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
kfree(tcp_conn);
|
kfree(tcp_conn);
|
||||||
|
@ -1968,48 +1975,11 @@ iscsi_conn_set_param(struct iscsi_cls_conn *cls_conn, enum iscsi_param param,
|
||||||
case ISCSI_PARAM_HDRDGST_EN:
|
case ISCSI_PARAM_HDRDGST_EN:
|
||||||
iscsi_set_param(cls_conn, param, buf, buflen);
|
iscsi_set_param(cls_conn, param, buf, buflen);
|
||||||
tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
|
tcp_conn->hdr_size = sizeof(struct iscsi_hdr);
|
||||||
if (conn->hdrdgst_en) {
|
if (conn->hdrdgst_en)
|
||||||
tcp_conn->hdr_size += sizeof(__u32);
|
tcp_conn->hdr_size += sizeof(__u32);
|
||||||
if (!tcp_conn->tx_tfm)
|
|
||||||
tcp_conn->tx_tfm = crypto_alloc_tfm("crc32c",
|
|
||||||
0);
|
|
||||||
if (!tcp_conn->tx_tfm)
|
|
||||||
return -ENOMEM;
|
|
||||||
if (!tcp_conn->rx_tfm)
|
|
||||||
tcp_conn->rx_tfm = crypto_alloc_tfm("crc32c",
|
|
||||||
0);
|
|
||||||
if (!tcp_conn->rx_tfm) {
|
|
||||||
crypto_free_tfm(tcp_conn->tx_tfm);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (tcp_conn->tx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->tx_tfm);
|
|
||||||
if (tcp_conn->rx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->rx_tfm);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ISCSI_PARAM_DATADGST_EN:
|
case ISCSI_PARAM_DATADGST_EN:
|
||||||
iscsi_set_param(cls_conn, param, buf, buflen);
|
iscsi_set_param(cls_conn, param, buf, buflen);
|
||||||
if (conn->datadgst_en) {
|
|
||||||
if (!tcp_conn->data_tx_tfm)
|
|
||||||
tcp_conn->data_tx_tfm =
|
|
||||||
crypto_alloc_tfm("crc32c", 0);
|
|
||||||
if (!tcp_conn->data_tx_tfm)
|
|
||||||
return -ENOMEM;
|
|
||||||
if (!tcp_conn->data_rx_tfm)
|
|
||||||
tcp_conn->data_rx_tfm =
|
|
||||||
crypto_alloc_tfm("crc32c", 0);
|
|
||||||
if (!tcp_conn->data_rx_tfm) {
|
|
||||||
crypto_free_tfm(tcp_conn->data_tx_tfm);
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (tcp_conn->data_tx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->data_tx_tfm);
|
|
||||||
if (tcp_conn->data_rx_tfm)
|
|
||||||
crypto_free_tfm(tcp_conn->data_rx_tfm);
|
|
||||||
}
|
|
||||||
tcp_conn->sendpage = conn->datadgst_en ?
|
tcp_conn->sendpage = conn->datadgst_en ?
|
||||||
sock_no_sendpage : tcp_conn->sock->ops->sendpage;
|
sock_no_sendpage : tcp_conn->sock->ops->sendpage;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -81,10 +81,6 @@ struct iscsi_tcp_conn {
|
||||||
* stop to terminate */
|
* stop to terminate */
|
||||||
/* iSCSI connection-wide sequencing */
|
/* iSCSI connection-wide sequencing */
|
||||||
int hdr_size; /* PDU header size */
|
int hdr_size; /* PDU header size */
|
||||||
|
|
||||||
struct crypto_tfm *rx_tfm; /* CRC32C (Rx) */
|
|
||||||
struct crypto_tfm *data_rx_tfm; /* CRC32C (Rx) for data */
|
|
||||||
|
|
||||||
/* control data */
|
/* control data */
|
||||||
struct iscsi_tcp_recv in; /* TCP receive context */
|
struct iscsi_tcp_recv in; /* TCP receive context */
|
||||||
int in_progress; /* connection state machine */
|
int in_progress; /* connection state machine */
|
||||||
|
@ -94,9 +90,9 @@ struct iscsi_tcp_conn {
|
||||||
void (*old_state_change)(struct sock *);
|
void (*old_state_change)(struct sock *);
|
||||||
void (*old_write_space)(struct sock *);
|
void (*old_write_space)(struct sock *);
|
||||||
|
|
||||||
/* xmit */
|
/* data and header digests */
|
||||||
struct crypto_tfm *tx_tfm; /* CRC32C (Tx) */
|
struct crypto_tfm *tx_tfm; /* CRC32C (Tx) */
|
||||||
struct crypto_tfm *data_tx_tfm; /* CRC32C (Tx) for data */
|
struct crypto_tfm *rx_tfm; /* CRC32C (Rx) */
|
||||||
|
|
||||||
/* MIB custom statistics */
|
/* MIB custom statistics */
|
||||||
uint32_t sendpage_failures_cnt;
|
uint32_t sendpage_failures_cnt;
|
||||||
|
|
Loading…
Reference in a new issue