
On Friday 10 July 2009 19:05:28 Wolfgang Denk wrote:
Scott Wood wrote:
On Mon, Jul 06, 2009 at 10:10:20AM -0500, Kumar Gala wrote:
static int ata_scsiop_read_capacity10(ccb *pccb) { u8 buf[8];
memset(buf, 0, 8); *(u32 *) buf = le32_to_cpu(ataid[pccb->target]->lba_capacity); buf[6] = 512 >> 8; buf[7] = 512 & 0xff; memcpy(pccb->pdata, buf, 8); return 0;
}
how do we fix this (the *u32 *)buf ... line is the one causing warnings ?
Use a union.
Or simply a temporary variable to perform the conversion in two separate steps.
a union is generally what people are moving to to avoid aliasing issues, but that's only when rewriting the code isnt trivial to do. in this case, it should be as you say and it would be simpler. and the buf[] could be tossed completely as well as the largely useless memset().
probably something like: u32 cap = le32_to_cpu(ataid[pccb->target]->lba_capacity); memcpy(pccb->pdata, &cap, sizeof(cap)); pccb->pdata[4] = pccb->pdata[5] = '\0'; pccb->pdata[6] = 512 >> 8; pccb->pdata[7] = 512 & 0xff; -mike