lkml.org 
[lkml]   [2015]   [Aug]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 30/82] 3w-xxxx: fix mis-aligned struct accesses
    Date
    From: Arnd Bergmann <arnd@arndb.de>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    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>
    ---
    drivers/scsi/3w-xxxx.h | 4 ++--
    1 file 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 */
    --
    2.5.0


    \
     
     \ /
      Last update: 2015-08-24 12:01    [W:6.754 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site