diff options
author | Arnd Bergmann <arnd@arndb.de> | 2014-06-26 14:58:29 +0200 |
---|---|---|
committer | Jiri Slaby <jslaby@suse.cz> | 2015-08-19 08:36:44 +0200 |
commit | e75c8f5a78096a6ee5e63b076cb885fe0e0ea08f (patch) | |
tree | 6234e68496f7337cc054cf6f87109d4d89569f5a /drivers/scsi | |
parent | be07157cfb776db3907169ab3c2cb2aa724cb3d9 (diff) | |
download | lwn-e75c8f5a78096a6ee5e63b076cb885fe0e0ea08f.tar.gz lwn-e75c8f5a78096a6ee5e63b076cb885fe0e0ea08f.zip |
3w-xxxx: fix mis-aligned struct accesses
commit 4bfaa5c4b99ddec00907e854d70453bd2aef39a0 upstream.
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>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/3w-xxxx.h | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h index 1d31858766ce..6f65e663d393 100644 --- a/drivers/scsi/3w-xxxx.h +++ b/drivers/scsi/3w-xxxx.h @@ -387,6 +387,8 @@ typedef struct TAG_TW_Passthru unsigned char padding[12]; } TW_Passthru; +#pragma pack() + typedef struct TAG_TW_Device_Extension { u32 base_addr; unsigned long *alignment_virtual_address[TW_Q_LENGTH]; @@ -425,6 +427,4 @@ typedef struct TAG_TW_Device_Extension { wait_queue_head_t ioctl_wqueue; } TW_Device_Extension; -#pragma pack() - #endif /* _3W_XXXX_H */ |