[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>
This commit is contained in:
committed by
James Bottomley
parent
7207fea452
commit
004d6530f8
@ -113,7 +113,7 @@ iscsi_hdr_digest(struct iscsi_conn *conn, struct iscsi_buf *buf,
|
||||
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 += sizeof(u32);
|
||||
buf->sg.length += ISCSI_DIGEST_SIZE;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -220,6 +220,7 @@ static inline int
|
||||
iscsi_tcp_chunk_done(struct iscsi_chunk *chunk)
|
||||
{
|
||||
static unsigned char padbuf[ISCSI_PAD_LEN];
|
||||
unsigned int pad;
|
||||
|
||||
if (chunk->copied < chunk->size) {
|
||||
iscsi_tcp_chunk_map(chunk);
|
||||
@ -243,10 +244,8 @@ iscsi_tcp_chunk_done(struct iscsi_chunk *chunk)
|
||||
}
|
||||
|
||||
/* Do we need to handle padding? */
|
||||
if (chunk->total_copied & (ISCSI_PAD_LEN-1)) {
|
||||
unsigned int pad;
|
||||
|
||||
pad = ISCSI_PAD_LEN - (chunk->total_copied & (ISCSI_PAD_LEN-1));
|
||||
pad = iscsi_padding(chunk->total_copied);
|
||||
if (pad != 0) {
|
||||
debug_tcp("consume %d pad bytes\n", pad);
|
||||
chunk->total_size += pad;
|
||||
chunk->size = pad;
|
||||
@ -1385,11 +1384,11 @@ iscsi_send_cmd_hdr(struct iscsi_conn *conn, struct iscsi_cmd_task *ctask)
|
||||
}
|
||||
|
||||
iscsi_buf_init_iov(&tcp_ctask->headbuf, (char*)ctask->hdr,
|
||||
sizeof(struct iscsi_hdr));
|
||||
ctask->hdr_len);
|
||||
|
||||
if (conn->hdrdgst_en)
|
||||
iscsi_hdr_digest(conn, &tcp_ctask->headbuf,
|
||||
(u8*)tcp_ctask->hdrext);
|
||||
iscsi_next_hdr(ctask));
|
||||
tcp_ctask->xmstate &= ~XMSTATE_CMD_HDR_INIT;
|
||||
tcp_ctask->xmstate |= XMSTATE_CMD_HDR_XMIT;
|
||||
}
|
||||
@ -2176,7 +2175,8 @@ iscsi_tcp_session_create(struct iscsi_transport *iscsit,
|
||||
struct iscsi_cmd_task *ctask = session->cmds[cmd_i];
|
||||
struct iscsi_tcp_cmd_task *tcp_ctask = ctask->dd_data;
|
||||
|
||||
ctask->hdr = &tcp_ctask->hdr;
|
||||
ctask->hdr = &tcp_ctask->hdr.cmd_hdr;
|
||||
ctask->hdr_max = sizeof(tcp_ctask->hdr) - ISCSI_DIGEST_SIZE;
|
||||
}
|
||||
|
||||
for (cmd_i = 0; cmd_i < session->mgmtpool_max; cmd_i++) {
|
||||
|
Reference in New Issue
Block a user