summaryrefslogtreecommitdiff
path: root/drivers/scsi/ses.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2015-11-09 12:24:28 (GMT)
committerMartin K. Petersen <martin.petersen@oracle.com>2015-11-30 16:23:45 (GMT)
commit09e2b0b14690fb13ccfc04af49f156df3e25b152 (patch)
tree4643ba86b1896df0b6a119416f31db4d4da0851b /drivers/scsi/ses.c
parentfe0798c5e150be8f06959250076d3864477e74c2 (diff)
downloadlinux-09e2b0b14690fb13ccfc04af49f156df3e25b152.tar.xz
scsi: rescan VPD attributes
The VPD page information might change, so we need to be able to update it. This patch implements a VPD page rescan whenever the 'rescan' sysfs attribute is triggered. Signed-off-by: Hannes Reinecke <hare@suse.de> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Shane Seymour <shane.seymour@hpe.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/ses.c')
-rw-r--r--drivers/scsi/ses.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
index dcb0d76..e234da7 100644
--- a/drivers/scsi/ses.c
+++ b/drivers/scsi/ses.c
@@ -554,17 +554,22 @@ static void ses_match_to_enclosure(struct enclosure_device *edev,
struct scsi_device *sdev)
{
unsigned char *desc;
+ unsigned char __rcu *vpd_pg83;
struct efd efd = {
.addr = 0,
};
ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0);
- if (!sdev->vpd_pg83_len)
+ rcu_read_lock();
+ vpd_pg83 = rcu_dereference(sdev->vpd_pg83);
+ if (!vpd_pg83) {
+ rcu_read_unlock();
return;
+ }
- desc = sdev->vpd_pg83 + 4;
- while (desc < sdev->vpd_pg83 + sdev->vpd_pg83_len) {
+ desc = vpd_pg83 + 4;
+ while (desc < vpd_pg83 + sdev->vpd_pg83_len) {
enum scsi_protocol proto = desc[0] >> 4;
u8 code_set = desc[0] & 0x0f;
u8 piv = desc[1] & 0x80;
@@ -578,6 +583,7 @@ static void ses_match_to_enclosure(struct enclosure_device *edev,
desc += len + 4;
}
+ rcu_read_unlock();
if (efd.addr) {
efd.dev = &sdev->sdev_gendev;