> 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 09e2b0b14690 ("scsi: rescan VPD attributes") > Signed-off-by: Bart Van Assche <bart.vanassche@xxxxxxx> > Acked-by: Hannes Reinecke <hare@xxxxxxx> > Cc: Christoph Hellwig <hch@xxxxxx> > Cc: Johannes Thumshirn <jthumshirn@xxxxxxx> > Cc: Shane Seymour <shane.seymour@xxxxxxx> > --- > drivers/scsi/scsi.c | 44 ++++++++++++++++++-------------------------- > drivers/scsi/scsi_lib.c | 16 ++++++++-------- > drivers/scsi/scsi_sysfs.c | 29 ++++++++++++++++++++--------- > include/scsi/scsi_device.h | 18 ++++++++++++++---- > 4 files changed, 60 insertions(+), 47 deletions(-) Reviewed-by: Shane Seymour <shane.seymour@xxxxxxx>