diff options
author | Hannes Reinecke <hare@suse.de> | 2015-11-09 13:24:28 +0100 |
---|---|---|
committer | Martin K. Petersen <martin.petersen@oracle.com> | 2015-11-30 11:23:45 -0500 |
commit | 09e2b0b14690fb13ccfc04af49f156df3e25b152 (patch) | |
tree | 4643ba86b1896df0b6a119416f31db4d4da0851b /drivers/scsi/ses.c | |
parent | fe0798c5e150be8f06959250076d3864477e74c2 (diff) |
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.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c index dcb0d76d7312..e234da78ce6e 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; |