Commit 4bfaa5c4b99ddec00907e854d70453bd2aef39a0
Committed by
Christoph Hellwig
1 parent
6919a3663a
Exists in
ti-lsk-linux-4.1.y
and in
10 other branches
3w-xxxx: fix mis-aligned struct accesses
Building an allmodconfig ARM kernel, I get multiple such warnings because of a spinlock contained in packed structure in the 3w-xxxx driver: ../drivers/scsi/3w-xxxx.c: In function 'tw_chrdev_ioctl': ../drivers/scsi/3w-xxxx.c:1001:68: warning: mis-aligned access used for structure member [-fstrict-volatile-bitfields] timeout = wait_event_timeout(tw_dev->ioctl_wqueue, tw_dev->chrdev_request_id == TW_IOCTL_CHRDEV_FREE, timeout); ^ ../drivers/scsi/3w-xxxx.c:1001:68: note: when a volatile object spans multiple type-sized locations, the compiler must choose between using a single mis-aligned access to preserve the volatility, or using multiple aligned accesses to avoid runtime faults; this code may fail at runtime if the hardware does not allow this access The same bug apparently was present in 3w-sas and 3w-9xxx, but has been fixed in the past. This patch uses the same fix by moving the pragma in front of the TW_Device_Extension definition, so it only covers hardware structures. Signed-off-by: Arnd Bergmann <arnd@arndb.de> Acked-by: Adam Radford <aradford@gmail.com> Cc: Adam Radford <linuxraid@lsi.com> Signed-off-by: Christoph Hellwig <hch@lst.de>
Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff
drivers/scsi/3w-xxxx.h
... | ... | @@ -392,6 +392,8 @@ |
392 | 392 | unsigned char padding[12]; |
393 | 393 | } TW_Passthru; |
394 | 394 | |
395 | +#pragma pack() | |
396 | + | |
395 | 397 | typedef struct TAG_TW_Device_Extension { |
396 | 398 | u32 base_addr; |
397 | 399 | unsigned long *alignment_virtual_address[TW_Q_LENGTH]; |
... | ... | @@ -429,8 +431,6 @@ |
429 | 431 | volatile int chrdev_request_id; |
430 | 432 | wait_queue_head_t ioctl_wqueue; |
431 | 433 | } TW_Device_Extension; |
432 | - | |
433 | -#pragma pack() | |
434 | 434 | |
435 | 435 | #endif /* _3W_XXXX_H */ |