On 9/25/19 8:02 PM, Ryan Attard wrote: > Add sysfs attributes for the ATA information page and > Supported VPD Pages page. > > Signed-off-by: Ryan Attard <ryanattard@xxxxxxxxxxxxxxx> > --- > drivers/scsi/scsi.c | 4 ++++ > drivers/scsi/scsi_sysfs.c | 19 +++++++++++++++++++ > include/scsi/scsi_device.h | 2 ++ > 3 files changed, 25 insertions(+) > > diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c > index a7e4fba724b7..088b8ca473e6 100644 > --- a/drivers/scsi/scsi.c > +++ b/drivers/scsi/scsi.c > @@ -485,10 +485,14 @@ void scsi_attach_vpd(struct scsi_device *sdev) > return; > > for (i = 4; i < vpd_buf->len; i++) { > + if (vpd_buf->data[i] == 0x0) > + scsi_update_vpd_page(sdev, 0x0, &sdev->vpd_pg0); > if (vpd_buf->data[i] == 0x80) > scsi_update_vpd_page(sdev, 0x80, &sdev->vpd_pg80); > if (vpd_buf->data[i] == 0x83) > scsi_update_vpd_page(sdev, 0x83, &sdev->vpd_pg83); > + if (vpd_buf->data[i] == 0x89) > + scsi_update_vpd_page(sdev, 0x89, &sdev->vpd_pg89); > } > kfree(vpd_buf); > } > diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c > index 8ce12ffcbb7a..eb6764f92c93 100644 > --- a/drivers/scsi/scsi_sysfs.c > +++ b/drivers/scsi/scsi_sysfs.c > @@ -429,6 +429,7 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) > struct device *parent; > struct list_head *this, *tmp; > struct scsi_vpd *vpd_pg80 = NULL, *vpd_pg83 = NULL; > + struct scsi_vpd *vpd_pg0 = NULL, *vpd_pg89 = NULL; > unsigned long flags; > > sdev = container_of(work, struct scsi_device, ew.work); > @@ -458,16 +459,24 @@ static void scsi_device_dev_release_usercontext(struct work_struct *work) > sdev->request_queue = NULL; > > mutex_lock(&sdev->inquiry_mutex); > + rcu_swap_protected(sdev->vpd_pg0, vpd_pg0, > + lockdep_is_held(&sdev->inquiry_mutex)); > rcu_swap_protected(sdev->vpd_pg80, vpd_pg80, > lockdep_is_held(&sdev->inquiry_mutex)); > rcu_swap_protected(sdev->vpd_pg83, vpd_pg83, > lockdep_is_held(&sdev->inquiry_mutex)); > + rcu_swap_protected(sdev->vpd_pg89, vpd_pg89, > + lockdep_is_held(&sdev->inquiry_mutex)); > mutex_unlock(&sdev->inquiry_mutex); > > + if (vpd_pg0) > + kfree_rcu(vpd_pg0, rcu); > if (vpd_pg83) > kfree_rcu(vpd_pg83, rcu); > if (vpd_pg80) > kfree_rcu(vpd_pg80, rcu); > + if (vpd_pg89) > + kfree_rcu(vpd_pg89, rcu); > kfree(sdev->inquiry); > kfree(sdev); > > @@ -840,6 +849,8 @@ static struct bin_attribute dev_attr_vpd_##_page = { \ > > sdev_vpd_pg_attr(pg83); > sdev_vpd_pg_attr(pg80); > +sdev_vpd_pg_attr(pg89); > +sdev_vpd_pg_attr(pg0); > > static ssize_t show_inquiry(struct file *filep, struct kobject *kobj, > struct bin_attribute *bin_attr, > @@ -1136,12 +1147,18 @@ static umode_t scsi_sdev_bin_attr_is_visible(struct kobject *kobj, > struct scsi_device *sdev = to_scsi_device(dev); > > > + if (attr == &dev_attr_vpd_pg0 && !sdev->vpd_pg0) > + return 0; > + > if (attr == &dev_attr_vpd_pg80 && !sdev->vpd_pg80) > return 0; > > if (attr == &dev_attr_vpd_pg83 && !sdev->vpd_pg83) > return 0; > > + if (attr == &dev_attr_vpd_pg89 && !sdev->vpd_pg89) > + return 0; > + > return S_IRUGO; > } > > @@ -1183,8 +1200,10 @@ static struct attribute *scsi_sdev_attrs[] = { > }; > > static struct bin_attribute *scsi_sdev_bin_attrs[] = { > + &dev_attr_vpd_pg0, > &dev_attr_vpd_pg83, > &dev_attr_vpd_pg80, > + &dev_attr_vpd_pg89, > &dev_attr_inquiry, > NULL > }; > diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h > index 571ddb49b926..5e91b0d00393 100644 > --- a/include/scsi/scsi_device.h > +++ b/include/scsi/scsi_device.h > @@ -137,6 +137,8 @@ struct scsi_device { > #define SCSI_VPD_PG_LEN 255 > struct scsi_vpd __rcu *vpd_pg83; > struct scsi_vpd __rcu *vpd_pg80; > + struct scsi_vpd __rcu *vpd_pg89; > + struct scsi_vpd __rcu *vpd_pg0; > unsigned char current_tag; /* current tag */ > struct scsi_target *sdev_target; /* used only for single_lun */ > > Reviewed-by: Hannes Reinecke <hare@xxxxxxxx> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@xxxxxxx +49 911 74053 688 SUSE Software Solutions Germany GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 247165 (AG München), GF: Felix Imendörffer