aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/iscsi_tcp.c
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2007-12-13 13:43:23 -0500
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2008-01-11 19:28:23 -0500
commit004d6530f83bee43a55b51bb5960db96e7ae0ffa (patch)
treea7bb6ffb3e6e89ca6ee9b164d5f19899a0c100dd /drivers/scsi/iscsi_tcp.c
parent7207fea452cfdd2d4e2f4419e2c31f570edbade3 (diff)
[SCSI] iscsi_tcp, libiscsi: initial AHS Support
at libiscsi generic code - currently code assumes a storage space of pdu header is allocated at llds ctask and is pointed to by iscsi_cmd_task->hdr. Here I add a hdr_max field pertaining to that storage, and an hdr_len that accumulates the current use of the pdu-header. - Add an iscsi_next_hdr() inline which returns the next free space to write new Header at. Also iscsi_next_hdr() is used to retrieve the address at which to write the header-digest. - Add iscsi_add_hdr(length). What the user do is calls iscsi_next_hdr() for address of the new header, than calls iscsi_add_hdr(length) with the size of the new header. iscsi_add_hdr() will check if space is available and update to the new size. length must be padded according to standard. - Add 2 padding inline helpers thanks to Olaf. Current patch does not use them but Following patches will. Also moved definition of ISCSI_PAD_LEN to iscsi_proto.h which had PAD_WORD_LEN that was never used anywhere. - Let iscsi_prep_scsi_cmd_pdu() signal an Error return since now it is possible that it will fail. - I was tired of yet again writing a "this is a digest" comment next to sizeof(__u32) so I defined a new ISCSI_DIGEST_SIZE. Now I don't need any comments. Changed all places that used sizeof(__u32) or "4" in connection to a digest. iscsi_tcp specific code - At struct iscsi_tcp_cmd_task allocate maximum space allowed in standard for all headers following the iscsi_cmd header. and mark it so in iscsi_tcp_session_create() - At iscsi_send_cmd_hdr() retrieve the correct headers size and write header digest at iscsi_next_hdr(). Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> Signed-off-by: Olaf Kirch <olaf.kirch@oracle.com> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/iscsi_tcp.c')
-rw-r--r--drivers/scsi/iscsi_tcp.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
index fd88777df28b..491845f18710 100644
--- a/drivers/scsi/iscsi_tcp.c
+++ b/drivers/scsi/iscsi_tcp.c
@@ -113,7 +113,7 @@ iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf,
113 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 113 struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
114 114
115 crypto_hash_digest(&tcp_conn->tx_hash, &buf->sg, buf->sg.length, crc); 115 crypto_hash_digest(&tcp_conn->tx_hash, &buf->sg, buf->sg.length, crc);
116 buf->sg.length += sizeof(u32); 116 buf->sg.length += ISCSI_DIGEST_SIZE;
117} 117}
118 118
119/* 119/*
@@ -220,6 +220,7 @@ static inline int
220iscsi_tcp_chunk_done(struct iscsi_chunk *chunk) 220iscsi_tcp_chunk_done(struct iscsi_chunk *chunk)
221{ 221{
222 static unsigned char padbuf[ISCSI_PAD_LEN]; 222 static unsigned char padbuf[ISCSI_PAD_LEN];
223 unsigned int pad;
223 224
224 if (chunk->copied < chunk->size) { 225 if (chunk->copied < chunk->size) {
225 iscsi_tcp_chunk_map(chunk); 226 iscsi_tcp_chunk_map(chunk);
@@ -243,10 +244,8 @@ iscsi_tcp_chunk_done(struct iscsi_chunk *chunk)
243 } 244 }
244 245
245 /* Do we need to handle padding? */ 246 /* Do we need to handle padding? */
246 if (chunk->total_copied & (ISCSI_PAD_LEN-1)) { 247 pad = iscsi_padding(chunk->total_copied);
247 unsigned int pad; 248 if (pad != 0) {
248
249 pad = ISCSI_PAD_LEN - (chunk->total_copied & (ISCSI_PAD_LEN-1));
250 debug_tcp("consume %d pad bytes\n", pad); 249 debug_tcp("consume %d pad bytes\n", pad);
251 chunk->total_size += pad; 250 chunk->total_size += pad;
252 chunk->size = pad; 251 chunk->size = pad;
@@ -1385,11 +1384,11 @@ iscsi_send_cmd_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
1385 } 1384 }
1386 1385
1387 iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr, 1386 iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr,
1388 sizeof(struct iscsi_hdr)); 1387 ctask->hdr_len);
1389 1388
1390 if (conn->hdrdgst_en) 1389 if (conn->hdrdgst_en)
1391 iscsi_hdr_digest(conn, &tcp_ctask->headbuf, 1390 iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
1392 (u8*)tcp_ctask->hdrext); 1391 iscsi_next_hdr(ctask));
1393 tcp_ctask->xmstate &= ~XMSTATE_CMD_HDR_INIT; 1392 tcp_ctask->xmstate &= ~XMSTATE_CMD_HDR_INIT;
1394 tcp_ctask->xmstate |= XMSTATE_CMD_HDR_XMIT; 1393 tcp_ctask->xmstate |= XMSTATE_CMD_HDR_XMIT;
1395 } 1394 }
@@ -2176,7 +2175,8 @@ iscsi_tcp_session_create(struct iscsi_transport *iscsit,
2176 struct iscsi_cmd_task *ctask = session->cmds[cmd_i]; 2175 struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
2177 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data; 2176 struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
2178 2177
2179 ctask->hdr = &tcp_ctask->hdr; 2178 ctask->hdr = &tcp_ctask->hdr.cmd_hdr;
2179 ctask->hdr_max = sizeof(tcp_ctask->hdr) - ISCSI_DIGEST_SIZE;
2180 } 2180 }
2181 2181
2182 for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) { 2182 for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) {