Commit 4bfaa5c4 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Christoph Hellwig

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: default avatarArnd Bergmann <arnd@arndb.de>
Acked-by: default avatarAdam Radford <aradford@gmail.com>
Cc: Adam Radford <linuxraid@lsi.com>
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
parent 6919a366
...@@ -392,6 +392,8 @@ typedef struct TAG_TW_Passthru ...@@ -392,6 +392,8 @@ typedef struct TAG_TW_Passthru
unsigned char padding[12]; unsigned char padding[12];
} TW_Passthru; } TW_Passthru;
#pragma pack()
typedef struct TAG_TW_Device_Extension { typedef struct TAG_TW_Device_Extension {
u32 base_addr; u32 base_addr;
unsigned long *alignment_virtual_address[TW_Q_LENGTH]; unsigned long *alignment_virtual_address[TW_Q_LENGTH];
...@@ -430,6 +432,4 @@ typedef struct TAG_TW_Device_Extension { ...@@ -430,6 +432,4 @@ typedef struct TAG_TW_Device_Extension {
wait_queue_head_t ioctl_wqueue; wait_queue_head_t ioctl_wqueue;
} TW_Device_Extension; } TW_Device_Extension;
#pragma pack()
#endif /* _3W_XXXX_H */ #endif /* _3W_XXXX_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment