• Bart Van Assche's avatar
    scsi: Rework handling of scsi_device.vpd_pg8[03] · ccf1e004
    Bart Van Assche authored
    Introduce struct scsi_vpd for the VPD page length, data and the RCU head
    that will be used to free the VPD data. Use kfree_rcu() instead of
    kfree() to free VPD data. Move the VPD buffer pointer check inside the
    RCU read lock in the sysfs code. Only annotate pointers that are shared
    across threads with __rcu. Use rcu_dereference() when dereferencing an
    RCU pointer. This patch suppresses about twenty sparse complaints about
    the vpd_pg8[03] pointers. This patch also fixes a race condition, namely
    that updating of the VPD pointers and length variables in struct
    scsi_device was not atomic with reference to the code reading these
    variables. See also "Does the update code tolerate concurrent accesses?"
    in Documentation/RCU/checklist.txt.
    
    Fixes: commit 09e2b0b1 ("scsi: rescan VPD attributes")
    Signed-off-by: default avatarBart Van Assche <bart.vanassche@wdc.com>
    Acked-by: default avatarHannes Reinecke <hare@suse.de>
    Reviewed-by: default avatarShane Seymour <shane.seymour@hpe.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Johannes Thumshirn <jthumshirn@suse.de>
    Cc: Shane Seymour <shane.seymour@hpe.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    ccf1e004
scsi.c 23.1 KB