From 66443899073b8194aed3ab6a1c4919dab313f02d Mon Sep 17 00:00:00 2001 From: Bernhard Kohl Date: Fri, 23 Nov 2012 23:14:09 +0100 Subject: [PATCH] Use the (un)marshalling functions scsi_get/set_uint16/32() anywhere in the code This has the nice side effect to remove the compiler warning "dereferencing type-punned pointer will break strict-aliasing rules" which occur since gcc-4.7. There are 79 locations where the warning occurs. All of them are in statements where the htonl/htons/ntohl/ntohs functions are used, e.g.: in lib/pdu.c itt = ntohl(*(uint32_t *)&in->hdr[16]); in lib/scsi-lowlevel.c *(uint32_t *)&task->cdb[2] = htonl(lba); The warning is not related to the htonl/htons/ntohl/ntohs functions but to the casting/dereferencing operation. If the dereferenced variable is already a pointer, the warning does not not occur, e.g. this one: in lib/pdu.c itt = ntohl(*(uint32_t *)&in->data[16]); The warning is caused by the -fstrict-aliasing option. The -fstrict-aliasing option is enabled at optimization levels -O2, -O3, -Os. Signed-off-by: Bernhard Kohl --- lib/iscsi-command.c | 44 +++++----- lib/login.c | 9 +- lib/pdu.c | 36 ++++---- lib/scsi-lowlevel.c | 205 ++++++++++++++++++++++---------------------- lib/task_mgmt.c | 2 +- 5 files changed, 148 insertions(+), 148 deletions(-) diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index efe23de..7e6781a 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -329,12 +329,12 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct iscsi_scsi_cbdata *scsi_cbdata = pdu->scsi_cbdata; struct scsi_task *task = scsi_cbdata->task; - statsn = ntohl(*(uint32_t *)&in->hdr[24]); + statsn = scsi_get_uint32(&in->hdr[24]); if (statsn > iscsi->statsn) { iscsi->statsn = statsn; } - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; } @@ -369,7 +369,7 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, * These flags should only be set if the S flag is also set */ if (flags & (ISCSI_PDU_DATA_RESIDUAL_OVERFLOW|ISCSI_PDU_DATA_RESIDUAL_UNDERFLOW)) { - task->residual = ntohl(*((uint32_t *)&in->hdr[44])); + task->residual = scsi_get_uint32(&in->hdr[44]); if (flags & ISCSI_PDU_DATA_RESIDUAL_UNDERFLOW) { task->residual_status = SCSI_RESIDUAL_UNDERFLOW; } else { @@ -397,14 +397,14 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, case 0x70: case 0x71: task->sense.key = task->datain.data[4] & 0x0f; - task->sense.ascq = ntohs(*(uint16_t *) - &(task->datain.data[14])); + task->sense.ascq = scsi_get_uint16( + &(task->datain.data[14])); break; case 0x72: case 0x73: task->sense.key = task->datain.data[3] & 0x0f; - task->sense.ascq = ntohs(*(uint16_t *) - &(task->datain.data[4])); + task->sense.ascq = scsi_get_uint16( + &(task->datain.data[4])); break; } iscsi_set_error(iscsi, "SENSE KEY:%s(%d) ASCQ:%s(0x%04x)", @@ -440,12 +440,12 @@ iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct scsi_task *task = scsi_cbdata->task; int dsl; - statsn = ntohl(*(uint32_t *)&in->hdr[24]); + statsn = scsi_get_uint32(&in->hdr[24]); if (statsn > iscsi->statsn) { iscsi->statsn = statsn; } - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; } @@ -458,7 +458,7 @@ iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, pdu->private_data); return -1; } - dsl = ntohl(*(uint32_t *)&in->hdr[4])&0x00ffffff; + dsl = scsi_get_uint32(&in->hdr[4]) & 0x00ffffff; /* Dont add to reassembly buffer if we already have a user buffer */ if (scsi_task_get_data_in_buffer(task, 0, NULL) == NULL) { @@ -495,7 +495,7 @@ iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, * These flags should only be set if the S flag is also set */ if (flags & (ISCSI_PDU_DATA_RESIDUAL_OVERFLOW|ISCSI_PDU_DATA_RESIDUAL_UNDERFLOW)) { - task->residual = ntohl(*((uint32_t *)&in->hdr[44])); + task->residual = scsi_get_uint32(&in->hdr[44]); if (flags & ISCSI_PDU_DATA_RESIDUAL_UNDERFLOW) { task->residual_status = SCSI_RESIDUAL_UNDERFLOW; } else { @@ -525,11 +525,11 @@ iscsi_process_r2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, { uint32_t ttt, offset, len, maxcmdsn; - ttt = ntohl(*(uint32_t *)&in->hdr[20]); - offset = ntohl(*(uint32_t *)&in->hdr[40]); - len = ntohl(*(uint32_t *)&in->hdr[44]); + ttt = scsi_get_uint32(&in->hdr[20]); + offset = scsi_get_uint32(&in->hdr[40]); + len = scsi_get_uint32(&in->hdr[44]); - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; } @@ -1450,12 +1450,12 @@ iscsi_unmap_task(struct iscsi_context *iscsi, int lun, int anchor, int group, scsi_free_scsi_task(task); return NULL; } - *((uint16_t *)&data[0]) = htons(xferlen - 2); - *((uint16_t *)&data[2]) = htons(xferlen - 8); + scsi_set_uint16(&data[0], xferlen - 2); + scsi_set_uint16(&data[2], xferlen - 8); for (i = 0; i < list_len; i++) { - *((uint32_t *)&data[8 + 16 * i]) = htonl(list[0].lba >> 32); - *((uint32_t *)&data[8 + 16 * i + 4]) = htonl(list[0].lba & 0xffffffff); - *((uint32_t *)&data[8 + 16 * i + 8]) = htonl(list[0].num); + scsi_set_uint32(&data[8 + 16 * i], list[0].lba >> 32); + scsi_set_uint32(&data[8 + 16 * i + 4], list[0].lba & 0xffffffff); + scsi_set_uint32(&data[8 + 16 * i + 8], list[0].num); } outdata.data = data; @@ -1481,9 +1481,9 @@ iscsi_get_user_in_buffer(struct iscsi_context *iscsi, struct iscsi_in_pdu *in, u return NULL; } - offset = ntohl(*(uint32_t *)&in->hdr[40]); + offset = scsi_get_uint32(&in->hdr[40]); - itt = ntohl(*(uint32_t *)&in->hdr[16]); + itt = scsi_get_uint32(&in->hdr[16]); for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { if (pdu->itt == itt) { break; diff --git a/lib/login.c b/lib/login.c index 8e4cf56..bf85b73 100644 --- a/lib/login.c +++ b/lib/login.c @@ -30,6 +30,7 @@ #include #include "iscsi.h" #include "iscsi-private.h" +#include "scsi-lowlevel.h" #include "md5.h" static int @@ -944,11 +945,11 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, char *ptr = (char *)in->data; int size = in->data_pos; - status = ntohs(*(uint16_t *)&in->hdr[36]); + status = scsi_get_uint16(&in->hdr[36]); - iscsi->statsn = ntohs(*(uint16_t *)&in->hdr[24]); + iscsi->statsn = scsi_get_uint16(&in->hdr[24]); - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; } @@ -1134,7 +1135,7 @@ struct iscsi_in_pdu *in) { uint32_t maxcmdsn; - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; } diff --git a/lib/pdu.c b/lib/pdu.c index fdcd6e2..947c0fc 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -196,8 +196,8 @@ iscsi_pdu_add_data(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, } /* update data segment length */ - *(uint32_t *)&pdu->outdata.data[4] = htonl(pdu->outdata.size - - ISCSI_HEADER_SIZE); + scsi_set_uint32(&pdu->outdata.data[4], pdu->outdata.size + - ISCSI_HEADER_SIZE); return 0; } @@ -207,8 +207,8 @@ iscsi_get_pdu_data_size(const unsigned char *hdr) { int size; - size = (ntohl(*(uint32_t *)&hdr[4])&0x00ffffff); - size = (size+3)&0xfffffffc; + size = scsi_get_uint32(&hdr[4]) & 0x00ffffff; + size = (size+3) & 0xfffffffc; return size; } @@ -266,9 +266,9 @@ int iscsi_process_target_nop_in(struct iscsi_context *iscsi, uint32_t ttt; uint32_t statsn; - ttt = ntohl(*(uint32_t *)&in->hdr[20]); + ttt = scsi_get_uint32(&in->hdr[20]); - statsn = ntohl(*(uint32_t *)&in->hdr[24]); + statsn = scsi_get_uint32(&in->hdr[24]); if (statsn > iscsi->statsn) { iscsi->statsn = statsn; } @@ -298,7 +298,7 @@ int iscsi_process_reject(struct iscsi_context *iscsi, return -1; } - itt = ntohl(*(uint32_t *)&in->data[16]); + itt = scsi_get_uint32(&in->data[16]); for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) { if (pdu->itt == itt) { @@ -332,7 +332,7 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) opcode = in->hdr[0] & 0x3f; ahslen = in->hdr[4]; - itt = ntohl(*(uint32_t *)&in->hdr[16]); + itt = scsi_get_uint32(&in->hdr[16]); if (ahslen != 0) { iscsi_set_error(iscsi, "cant handle expanded headers yet"); @@ -479,13 +479,13 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) void iscsi_pdu_set_itt(struct iscsi_pdu *pdu, uint32_t itt) { - *(uint32_t *)&pdu->outdata.data[16] = htonl(itt); + scsi_set_uint32(&pdu->outdata.data[16], itt); } void iscsi_pdu_set_ritt(struct iscsi_pdu *pdu, uint32_t ritt) { - *(uint32_t *)&pdu->outdata.data[20] = htonl(ritt); + scsi_set_uint32(&pdu->outdata.data[20], ritt); } void @@ -503,43 +503,43 @@ iscsi_pdu_set_immediate(struct iscsi_pdu *pdu) void iscsi_pdu_set_ttt(struct iscsi_pdu *pdu, uint32_t ttt) { - *(uint32_t *)&pdu->outdata.data[20] = htonl(ttt); + scsi_set_uint32(&pdu->outdata.data[20], ttt); } void iscsi_pdu_set_cmdsn(struct iscsi_pdu *pdu, uint32_t cmdsn) { - *(uint32_t *)&pdu->outdata.data[24] = htonl(cmdsn); + scsi_set_uint32(&pdu->outdata.data[24], cmdsn); } void iscsi_pdu_set_rcmdsn(struct iscsi_pdu *pdu, uint32_t rcmdsn) { - *(uint32_t *)&pdu->outdata.data[32] = htonl(rcmdsn); + scsi_set_uint32(&pdu->outdata.data[32], rcmdsn); } void iscsi_pdu_set_datasn(struct iscsi_pdu *pdu, uint32_t datasn) { - *(uint32_t *)&pdu->outdata.data[36] = htonl(datasn); + scsi_set_uint32(&pdu->outdata.data[36], datasn); } void iscsi_pdu_set_expstatsn(struct iscsi_pdu *pdu, uint32_t expstatsnsn) { - *(uint32_t *)&pdu->outdata.data[28] = htonl(expstatsnsn); + scsi_set_uint32(&pdu->outdata.data[28], expstatsnsn); } void iscsi_pdu_set_bufferoffset(struct iscsi_pdu *pdu, uint32_t bufferoffset) { - *(uint32_t *)&pdu->outdata.data[40] = htonl(bufferoffset); + scsi_set_uint32(&pdu->outdata.data[40], bufferoffset); } void iscsi_pdu_set_cdb(struct iscsi_pdu *pdu, struct scsi_task *task) { - memset(&pdu->outdata.data[32], 0, 16); + memset(&pdu->outdata.data[32], 0, 16); memcpy(&pdu->outdata.data[32], task->cdb, task->cdb_size); } @@ -553,5 +553,5 @@ iscsi_pdu_set_lun(struct iscsi_pdu *pdu, uint32_t lun) void iscsi_pdu_set_expxferlen(struct iscsi_pdu *pdu, uint32_t expxferlen) { - *(uint32_t *)&pdu->outdata.data[20] = htonl(expxferlen); + scsi_set_uint32(&pdu->outdata.data[20], expxferlen); } diff --git a/lib/scsi-lowlevel.c b/lib/scsi-lowlevel.c index 0cf7f0a..04febce 100644 --- a/lib/scsi-lowlevel.c +++ b/lib/scsi-lowlevel.c @@ -224,7 +224,7 @@ scsi_reportluns_cdb(int report_type, int alloc_len) memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_REPORTLUNS; task->cdb[2] = report_type; - *(uint32_t *)&task->cdb[6] = htonl(alloc_len); + scsi_set_uint32(&task->cdb[6], alloc_len); task->cdb_size = 12; if (alloc_len != 0) { @@ -246,7 +246,7 @@ scsi_reportluns_datain_getfullsize(struct scsi_task *task) { uint32_t list_size; - list_size = htonl(*(uint32_t *)&(task->datain.data[0])) + 8; + list_size = scsi_get_uint32(&task->datain.data[0]) + 8; return list_size; } @@ -265,7 +265,7 @@ scsi_reportluns_datain_unmarshall(struct scsi_task *task) return NULL; } - list_size = htonl(*(uint32_t *)&(task->datain.data[0])) + 8; + list_size = scsi_get_uint32(&task->datain.data[0]) + 8; if (list_size < task->datain.size) { return NULL; } @@ -279,8 +279,7 @@ scsi_reportluns_datain_unmarshall(struct scsi_task *task) list->num = num_luns; for (i = 0; i < num_luns; i++) { - list->luns[i] = htons(*(uint16_t *) - &(task->datain.data[i*8+8])); + list->luns[i] = scsi_get_uint16(&task->datain.data[i*8+8]); } return list; @@ -302,7 +301,7 @@ scsi_cdb_readcapacity10(int lba, int pmi) memset(task, 0, sizeof(struct scsi_task)); task->cdb[0] = SCSI_OPCODE_READCAPACITY10; - *(uint32_t *)&task->cdb[2] = htonl(lba); + scsi_set_uint32(&task->cdb[2], lba); if (pmi) { task->cdb[8] |= 0x01; @@ -348,7 +347,7 @@ scsi_cdb_readtoc(int msf, int format, int track_session, uint16_t alloc_len) task->cdb[6] = 0xff & track_session; } - *(uint16_t *)&task->cdb[7] = htons(alloc_len); + scsi_set_uint16(&task->cdb[7], alloc_len); task->cdb_size = 10; if (alloc_len != 0) { @@ -370,7 +369,7 @@ scsi_readtoc_datain_getfullsize(struct scsi_task *task) { uint16_t toc_data_len; - toc_data_len = ntohs(*((uint16_t *)&task->datain.data[0])) + 2; + toc_data_len = scsi_get_uint16(&task->datain.data[0]) + 2; return toc_data_len; } @@ -393,7 +392,7 @@ scsi_readtoc_desc_unmarshall(struct scsi_task *task, struct scsi_readtoc_list *l list->desc[i].desc.toc.track = task->datain.data[4+8*i+2]; list->desc[i].desc.toc.lba - = ntohl(*(uint32_t *)&task->datain.data[4+8*i+4]); + = scsi_get_uint32(&task->datain.data[4+8*i+4]); break; case SCSI_READ_SESSION_INFO: list->desc[i].desc.ses.adr @@ -403,7 +402,7 @@ scsi_readtoc_desc_unmarshall(struct scsi_task *task, struct scsi_readtoc_list *l list->desc[i].desc.ses.first_in_last = task->datain.data[4+8*i+2]; list->desc[i].desc.ses.lba - = ntohl(*(uint32_t *)&task->datain.data[4+8*i+4]); + = scsi_get_uint32(&task->datain.data[4+8*i+4]); break; case SCSI_READ_FULL_TOC: list->desc[i].desc.full.session @@ -538,22 +537,22 @@ scsi_serviceactionin_datain_unmarshall(struct scsi_task *task) if (rc16 == NULL) { return NULL; } - rc16->returned_lba = ntohl(*(uint32_t *)&(task->datain.data[0])); - rc16->returned_lba = (rc16->returned_lba << 32) | ntohl(*(uint32_t *)&(task->datain.data[4])); - rc16->block_length = ntohl(*(uint32_t *)&(task->datain.data[8])); + rc16->returned_lba = scsi_get_uint32(&task->datain.data[0]); + rc16->returned_lba = (rc16->returned_lba << 32) | scsi_get_uint32(&task->datain.data[4]); + rc16->block_length = scsi_get_uint32(&task->datain.data[8]); rc16->p_type = (task->datain.data[12] >> 1) & 0x07; rc16->prot_en = task->datain.data[12] & 0x01; rc16->p_i_exp = (task->datain.data[13] >> 4) & 0x0f; rc16->lbppbe = task->datain.data[13] & 0x0f; rc16->lbpme = !!(task->datain.data[14] & 0x80); rc16->lbprz = !!(task->datain.data[14] & 0x40); - rc16->lalba = ntohs(*(uint16_t *)&(task->datain.data[14])) & 0x3fff; + rc16->lalba = scsi_get_uint16(&task->datain.data[14]) & 0x3fff; return rc16; } case SCSI_GET_LBA_STATUS: { struct scsi_get_lba_status *gls = scsi_malloc(task, sizeof(*gls)); - int32_t len = ntohl(*(uint32_t *)&(task->datain.data[0])); + int32_t len = scsi_get_uint32(&task->datain.data[0]); int i; if (gls == NULL) { @@ -574,11 +573,11 @@ scsi_serviceactionin_datain_unmarshall(struct scsi_task *task) } for (i = 0; i < (int)gls->num_descriptors; i++) { - gls->descriptors[i].lba = ntohl(*(uint32_t *)&(task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 0])); + gls->descriptors[i].lba = scsi_get_uint32(&task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 0]); gls->descriptors[i].lba <<= 32; - gls->descriptors[i].lba |= ntohl(*(uint32_t *)&(task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 4])); + gls->descriptors[i].lba |= scsi_get_uint32(&task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 4]); - gls->descriptors[i].num_blocks = ntohl(*(uint32_t *)&(task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 8])); + gls->descriptors[i].num_blocks = scsi_get_uint32(&task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 8]); gls->descriptors[i].provisioning = task->datain.data[8 + i * sizeof(struct scsi_lba_status_descriptor) + 12] & 0x0f; } @@ -612,7 +611,7 @@ scsi_maintenancein_datain_getfullsize(struct scsi_task *task) switch (scsi_maintenancein_sa(task)) { case SCSI_REPORT_SUPPORTED_OP_CODES: - return ntohl(*(uint32_t *)&(task->datain.data[0])) + 4; + return scsi_get_uint32(&task->datain.data[0]) + 4; default: return -1; } @@ -635,7 +634,7 @@ scsi_maintenancein_datain_unmarshall(struct scsi_task *task) return NULL; } - len = ntohl(*(uint32_t *)&(task->datain.data[0])); + len = scsi_get_uint32(&task->datain.data[0]); rsoc = scsi_malloc(task, sizeof(struct scsi_report_supported_op_codes) + len); if (rsoc == NULL) { return NULL; @@ -697,7 +696,7 @@ scsi_cdb_report_supported_opcodes(int return_timeouts, uint32_t alloc_len) task->cdb[2] |= 0x80; } - *(uint32_t *)&task->cdb[6] = htonl(alloc_len); + scsi_set_uint32(&task->cdb[6], alloc_len); task->cdb_size = 12; if (alloc_len != 0) { @@ -736,8 +735,8 @@ scsi_readcapacity10_datain_unmarshall(struct scsi_task *task) return NULL; } - rc10->lba = htonl(*(uint32_t *)&(task->datain.data[0])); - rc10->block_size = htonl(*(uint32_t *)&(task->datain.data[4])); + rc10->lba = scsi_get_uint32(&task->datain.data[0]); + rc10->block_size = scsi_get_uint32(&task->datain.data[4]); return rc10; } @@ -764,7 +763,7 @@ scsi_cdb_inquiry(int evpd, int page_code, int alloc_len) task->cdb[2] = page_code; - *(uint16_t *)&task->cdb[3] = htons(alloc_len); + scsi_set_uint16(&task->cdb[3], alloc_len); task->cdb_size = 6; if (alloc_len != 0) { @@ -808,7 +807,7 @@ scsi_inquiry_datain_getfullsize(struct scsi_task *task) case SCSI_INQUIRY_PAGECODE_DEVICE_IDENTIFICATION: case SCSI_INQUIRY_PAGECODE_BLOCK_LIMITS: case SCSI_INQUIRY_PAGECODE_LOGICAL_BLOCK_PROVISIONING: - return ntohs(*(uint16_t *)&task->datain.data[2]) + 4; + return scsi_get_uint16(&task->datain.data[2]) + 4; default: return -1; } @@ -908,7 +907,7 @@ scsi_inquiry_unmarshall_device_identification(struct scsi_task *task) { struct scsi_inquiry_device_identification *inq = scsi_malloc(task, sizeof(*inq)); - int remaining = ntohs(*(uint16_t *)&task->datain.data[2]); + int remaining = scsi_get_uint16(&task->datain.data[2]); unsigned char *dptr; if (inq == NULL) { @@ -977,17 +976,17 @@ scsi_inquiry_unmarshall_block_limits(struct scsi_task *task) inq->wsnz = task->datain.data[4] & 0x01; inq->max_cmp = task->datain.data[5]; - inq->opt_gran = ntohs(*(uint16_t *)&task->datain.data[6]); - inq->max_xfer_len = ntohl(*(uint32_t *)&task->datain.data[8]); - inq->opt_xfer_len = ntohl(*(uint32_t *)&task->datain.data[12]); - inq->max_prefetch = ntohl(*(uint32_t *)&task->datain.data[16]); - inq->max_unmap = ntohl(*(uint32_t *)&task->datain.data[20]); - inq->max_unmap_bdc = ntohl(*(uint32_t *)&task->datain.data[24]); - inq->opt_unmap_gran = ntohl(*(uint32_t *)&task->datain.data[28]); + inq->opt_gran = scsi_get_uint16(&task->datain.data[6]); + inq->max_xfer_len = scsi_get_uint32(&task->datain.data[8]); + inq->opt_xfer_len = scsi_get_uint32(&task->datain.data[12]); + inq->max_prefetch = scsi_get_uint32(&task->datain.data[16]); + inq->max_unmap = scsi_get_uint32(&task->datain.data[20]); + inq->max_unmap_bdc = scsi_get_uint32(&task->datain.data[24]); + inq->opt_unmap_gran = scsi_get_uint32(&task->datain.data[28]); inq->ugavalid = !!(task->datain.data[32]&0x80); - inq->unmap_gran_align = ntohl(*(uint32_t *)&task->datain.data[32]) & 0x7fffffff; - inq->max_ws_len = ntohl(*(uint32_t *)&task->datain.data[36]); - inq->max_ws_len = (inq->max_ws_len << 32) | ntohl(*(uint32_t *)&task->datain.data[40]); + inq->unmap_gran_align = scsi_get_uint32(&task->datain.data[32]) & 0x7fffffff; + inq->max_ws_len = scsi_get_uint32(&task->datain.data[36]); + inq->max_ws_len = (inq->max_ws_len << 32) | scsi_get_uint32(&task->datain.data[40]); return inq; } @@ -1004,7 +1003,7 @@ scsi_inquiry_unmarshall_block_device_characteristics(struct scsi_task *task) inq->device_type = task->datain.data[0]&0x1f; inq->pagecode = task->datain.data[1]; - inq->medium_rotation_rate = ntohs(*(uint16_t *)&task->datain.data[4]); + inq->medium_rotation_rate = scsi_get_uint16(&task->datain.data[4]); return inq; } @@ -1133,8 +1132,8 @@ scsi_cdb_read10(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, in task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint16_t *)&task->cdb[7] = htons(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint16(&task->cdb[7], xferlen/blocksize); task->cdb[6] |= (group_number & 0x1f); @@ -1176,8 +1175,8 @@ scsi_cdb_read12(uint32_t lba, uint32_t xferlen, int blocksize, int rdprotect, in task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint32_t *)&task->cdb[6] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint32(&task->cdb[6], xferlen/blocksize); task->cdb[10] |= (group_number & 0x1f); @@ -1219,9 +1218,9 @@ scsi_cdb_read16(uint64_t lba, uint32_t xferlen, int blocksize, int rdprotect, in task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], xferlen/blocksize); task->cdb[14] |= (group_number & 0x1f); @@ -1263,8 +1262,8 @@ scsi_cdb_write10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, i task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint16_t *)&task->cdb[7] = htons(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint16(&task->cdb[7], xferlen/blocksize); task->cdb[6] |= (group_number & 0x1f); @@ -1306,8 +1305,8 @@ scsi_cdb_write12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprotect, i task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint32_t *)&task->cdb[6] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint32(&task->cdb[6], xferlen/blocksize); task->cdb[10] |= (group_number & 0x1f); @@ -1349,9 +1348,9 @@ scsi_cdb_write16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, i task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], xferlen/blocksize); task->cdb[14] |= (group_number & 0x1f); @@ -1393,9 +1392,9 @@ scsi_cdb_orwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrprotect, i task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], xferlen/blocksize); task->cdb[14] |= (group_number & 0x1f); @@ -1437,8 +1436,8 @@ scsi_cdb_compareandwrite(uint64_t lba, uint32_t xferlen, int blocksize, int wrpr task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); task->cdb[13] = xferlen/blocksize; task->cdb[14] |= (group_number & 0x1f); @@ -1479,8 +1478,8 @@ scsi_cdb_verify10(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int byt task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint16_t *)&task->cdb[7] = htons(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint16(&task->cdb[7], xferlen/blocksize); task->cdb_size = 10; if (xferlen != 0 && bytchk) { @@ -1520,8 +1519,8 @@ scsi_cdb_verify12(uint32_t lba, uint32_t xferlen, int vprotect, int dpo, int byt task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint32_t *)&task->cdb[6] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint32(&task->cdb[6], xferlen/blocksize); task->cdb_size = 12; if (xferlen != 0 && bytchk) { @@ -1561,9 +1560,9 @@ scsi_cdb_verify16(uint64_t lba, uint32_t xferlen, int vprotect, int dpo, int byt task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], xferlen/blocksize); task->cdb_size = 16; if (xferlen != 0 && bytchk) { @@ -1598,7 +1597,7 @@ scsi_cdb_unmap(int anchor, int group, uint16_t xferlen) } task->cdb[6] |= group & 0x1f; - *(uint16_t *)&task->cdb[7] = htons(xferlen); + scsi_set_uint16(&task->cdb[7], xferlen); task->cdb_size = 10; if (xferlen != 0) { @@ -1642,11 +1641,11 @@ scsi_cdb_writesame10(int wrprotect, int anchor, int unmap, int pbdata, int lbdat if (lbdata) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); + scsi_set_uint32(&task->cdb[2], lba); if (group) { task->cdb[6] |= (group & 0x1f); } - *(uint16_t *)&task->cdb[7] = htons(num_blocks); + scsi_set_uint16(&task->cdb[7], num_blocks); task->cdb_size = 10; task->xfer_dir = SCSI_XFER_WRITE; @@ -1686,9 +1685,9 @@ scsi_cdb_writesame16(int wrprotect, int anchor, int unmap, int pbdata, int lbdat if (lbdata) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(num_blocks); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], num_blocks); if (group) { task->cdb[14] |= (group & 0x1f); } @@ -1765,10 +1764,10 @@ scsi_parse_mode_caching(struct scsi_task *task, int pos, struct scsi_mode_page * mp->caching.demand_read_retention_priority = (task->datain.data[pos+1] >> 4) & 0x0f; mp->caching.write_retention_priority = task->datain.data[pos+1] & 0x0f; - mp->caching.disable_prefetch_transfer_length = htons(*(uint16_t *)&(task->datain.data[pos+2])); - mp->caching.minimum_prefetch = htons(*(uint16_t *)&(task->datain.data[pos+4])); - mp->caching.maximum_prefetch = htons(*(uint16_t *)&(task->datain.data[pos+6])); - mp->caching.maximum_prefetch_ceiling = htons(*(uint16_t *)&(task->datain.data[pos+8])); + mp->caching.disable_prefetch_transfer_length = scsi_get_uint16(&task->datain.data[pos+2]); + mp->caching.minimum_prefetch = scsi_get_uint16(&task->datain.data[pos+4]); + mp->caching.maximum_prefetch = scsi_get_uint16(&task->datain.data[pos+6]); + mp->caching.maximum_prefetch_ceiling = scsi_get_uint16(&task->datain.data[pos+8]); mp->caching.fsw = task->datain.data[pos+10] & 0x80; mp->caching.lbcss = task->datain.data[pos+10] & 0x40; @@ -1776,7 +1775,7 @@ scsi_parse_mode_caching(struct scsi_task *task, int pos, struct scsi_mode_page * mp->caching.nv_dis = task->datain.data[pos+10] & 0x01; mp->caching.number_of_cache_segments = task->datain.data[pos+11]; - mp->caching.cache_segment_size = htons(*(uint16_t *)&(task->datain.data[pos+12])); + mp->caching.cache_segment_size = scsi_get_uint16(&task->datain.data[pos+12]); } static void @@ -1784,15 +1783,15 @@ scsi_parse_mode_disconnect_reconnect(struct scsi_task *task, int pos, struct scs { mp->disconnect_reconnect.buffer_full_ratio = task->datain.data[pos]; mp->disconnect_reconnect.buffer_empty_ratio = task->datain.data[pos+1]; - mp->disconnect_reconnect.bus_inactivity_limit = htons(*(uint16_t *)&(task->datain.data[pos+2])); - mp->disconnect_reconnect.disconnect_time_limit = htons(*(uint16_t *)&(task->datain.data[pos+4])); - mp->disconnect_reconnect.connect_time_limit = htons(*(uint16_t *)&(task->datain.data[pos+6])); - mp->disconnect_reconnect.maximum_burst_size = htons(*(uint16_t *)&(task->datain.data[pos+8])); + mp->disconnect_reconnect.bus_inactivity_limit = scsi_get_uint16(&task->datain.data[pos+2]); + mp->disconnect_reconnect.disconnect_time_limit = scsi_get_uint16(&task->datain.data[pos+4]); + mp->disconnect_reconnect.connect_time_limit = scsi_get_uint16(&task->datain.data[pos+6]); + mp->disconnect_reconnect.maximum_burst_size = scsi_get_uint16(&task->datain.data[pos+8]); mp->disconnect_reconnect.emdp = task->datain.data[pos+10] & 0x80; mp->disconnect_reconnect.fair_arbitration = (task->datain.data[pos+10]>>4) & 0x0f; mp->disconnect_reconnect.dimm = task->datain.data[pos+10] & 0x08; mp->disconnect_reconnect.dtdc = task->datain.data[pos+10] & 0x07; - mp->disconnect_reconnect.first_burst_size = htons(*(uint16_t *)&(task->datain.data[pos+12])); + mp->disconnect_reconnect.first_burst_size = scsi_get_uint16(&task->datain.data[pos+12]); } static void @@ -1806,8 +1805,8 @@ scsi_parse_mode_informational_exceptions_control(struct scsi_task *task, int pos mp->iec.ebackerr = task->datain.data[pos] & 0x02; mp->iec.logerr = task->datain.data[pos] & 0x01; mp->iec.mrie = task->datain.data[pos+1] & 0x0f; - mp->iec.interval_timer = htonl(*(uint32_t *)&(task->datain.data[pos+2])); - mp->iec.report_count = htonl(*(uint32_t *)&(task->datain.data[pos+6])); + mp->iec.interval_timer = scsi_get_uint32(&task->datain.data[pos+2]); + mp->iec.report_count = scsi_get_uint32(&task->datain.data[pos+6]); } @@ -1854,7 +1853,7 @@ scsi_modesense_datain_unmarshall(struct scsi_task *task) if (mp->spf) { mp->subpage_code = task->datain.data[pos++]; - mp->len = ntohs(*(uint16_t *)&task->datain.data[pos]); + mp->len = scsi_get_uint16(&task->datain.data[pos]); pos += 2; } else { mp->subpage_code = 0; @@ -1972,8 +1971,8 @@ scsi_cdb_synchronizecache10(int lba, int num_blocks, int syncnv, int immed) if (immed) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint16_t *)&task->cdb[7] = htons(num_blocks); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint16(&task->cdb[7], num_blocks); task->cdb_size = 10; task->xfer_dir = SCSI_XFER_NONE; @@ -2004,9 +2003,9 @@ scsi_cdb_synchronizecache16(uint64_t lba, uint32_t num_blocks, int syncnv, int i if (immed) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(num_blocks); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], num_blocks); task->cdb_size = 16; task->xfer_dir = SCSI_XFER_NONE; @@ -2034,9 +2033,9 @@ scsi_cdb_prefetch10(uint32_t lba, int num_blocks, int immed, int group) if (immed) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); + scsi_set_uint32(&task->cdb[2], lba); task->cdb[6] |= group & 0x1f; - *(uint16_t *)&task->cdb[7] = htons(num_blocks); + scsi_set_uint16(&task->cdb[7], num_blocks); task->cdb_size = 10; task->xfer_dir = SCSI_XFER_NONE; @@ -2064,9 +2063,9 @@ scsi_cdb_prefetch16(uint64_t lba, int num_blocks, int immed, int group) if (immed) { task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(num_blocks); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], num_blocks); task->cdb[14] |= group & 0x1f; @@ -2095,7 +2094,7 @@ scsi_cdb_serviceactionin16(enum scsi_service_action_in sa, uint32_t xferlen) task->cdb[1] = sa; - *(uint32_t *)&task->cdb[10] = htonl(xferlen); + scsi_set_uint32(&task->cdb[10], xferlen); task->cdb_size = 16; if (xferlen != 0) { @@ -2135,9 +2134,9 @@ scsi_cdb_get_lba_status(uint64_t starting_lba, uint32_t alloc_len) task->cdb[1] = SCSI_GET_LBA_STATUS; - *(uint32_t *)&task->cdb[2] = htonl(starting_lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(starting_lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(alloc_len); + scsi_set_uint32(&task->cdb[2], starting_lba >> 32); + scsi_set_uint32(&task->cdb[6], starting_lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], alloc_len); task->cdb_size = 16; if (alloc_len != 0) { @@ -2174,8 +2173,8 @@ scsi_cdb_writeverify10(uint32_t lba, uint32_t xferlen, int blocksize, int wrprot task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint16_t *)&task->cdb[7] = htons(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint16(&task->cdb[7], xferlen/blocksize); task->cdb[6] |= (group_number & 0x1f); @@ -2214,8 +2213,8 @@ scsi_cdb_writeverify12(uint32_t lba, uint32_t xferlen, int blocksize, int wrprot task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba); - *(uint32_t *)&task->cdb[6] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba); + scsi_set_uint32(&task->cdb[6], xferlen/blocksize); task->cdb[10] |= (group_number & 0x1f); @@ -2254,9 +2253,9 @@ scsi_cdb_writeverify16(uint64_t lba, uint32_t xferlen, int blocksize, int wrprot task->cdb[1] |= 0x02; } - *(uint32_t *)&task->cdb[2] = htonl(lba >> 32); - *(uint32_t *)&task->cdb[6] = htonl(lba & 0xffffffff); - *(uint32_t *)&task->cdb[10] = htonl(xferlen/blocksize); + scsi_set_uint32(&task->cdb[2], lba >> 32); + scsi_set_uint32(&task->cdb[6], lba & 0xffffffff); + scsi_set_uint32(&task->cdb[10], xferlen/blocksize); task->cdb[14] |= (group_number & 0x1f); diff --git a/lib/task_mgmt.c b/lib/task_mgmt.c index 5767aed..9585bd1 100644 --- a/lib/task_mgmt.c +++ b/lib/task_mgmt.c @@ -87,7 +87,7 @@ iscsi_process_task_mgmt_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu response = in->hdr[2]; - maxcmdsn = ntohl(*(uint32_t *)&in->hdr[32]); + maxcmdsn = scsi_get_uint32(&in->hdr[32]); if (maxcmdsn > iscsi->maxcmdsn) { iscsi->maxcmdsn = maxcmdsn; }