On 2021/11/17 7:31, Bart Van Assche wrote: > Simplify the scsi_host_alloc() implementation by setting the shost_class > .dev_groups member instead of copying all host attribute group pointers > into the shost_dev_attr_groups[] array. > > Cc: Steffen Maier <maier@xxxxxxxxxxxxx> > Cc: Damien Le Moal <damien.lemoal@xxxxxxx> > Suggested-by: Benjamin Block <bblock@xxxxxxxxxxxxx> > Signed-off-by: Bart Van Assche <bvanassche@xxxxxxx> > --- > drivers/scsi/hosts.c | 15 +++------------ > drivers/scsi/scsi_priv.h | 2 +- > drivers/scsi/scsi_sysfs.c | 7 ++++++- > include/scsi/scsi_host.h | 6 ------ > 4 files changed, 10 insertions(+), 20 deletions(-) > > diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c > index 8049b00b6766..f69b77cbf538 100644 > --- a/drivers/scsi/hosts.c > +++ b/drivers/scsi/hosts.c > @@ -61,6 +61,7 @@ static void scsi_host_cls_release(struct device *dev) > static struct class shost_class = { > .name = "scsi_host", > .dev_release = scsi_host_cls_release, > + .dev_groups = scsi_shost_groups, > }; > > /** > @@ -377,7 +378,7 @@ static struct device_type scsi_host_type = { > struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) > { > struct Scsi_Host *shost; > - int index, i, j = 0; > + int index; > > shost = kzalloc(sizeof(struct Scsi_Host) + privsize, GFP_KERNEL); > if (!shost) > @@ -483,17 +484,7 @@ struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize) > shost->shost_dev.parent = &shost->shost_gendev; > shost->shost_dev.class = &shost_class; > dev_set_name(&shost->shost_dev, "host%d", shost->host_no); > - shost->shost_dev.groups = shost->shost_dev_attr_groups; > - shost->shost_dev_attr_groups[j++] = &scsi_shost_attr_group; > - if (sht->shost_groups) { > - for (i = 0; sht->shost_groups[i] && > - j < ARRAY_SIZE(shost->shost_dev_attr_groups); > - i++, j++) { > - shost->shost_dev_attr_groups[j] = > - sht->shost_groups[i]; > - } > - } > - WARN_ON_ONCE(j >= ARRAY_SIZE(shost->shost_dev_attr_groups)); > + shost->shost_dev.groups = sht->shost_groups; > > shost->ehandler = kthread_run(scsi_error_handler, shost, > "scsi_eh_%d", shost->host_no); > diff --git a/drivers/scsi/scsi_priv.h b/drivers/scsi/scsi_priv.h > index a278fc8948f4..0f5743f4769b 100644 > --- a/drivers/scsi/scsi_priv.h > +++ b/drivers/scsi/scsi_priv.h > @@ -144,7 +144,7 @@ extern struct scsi_transport_template blank_transport_template; > extern void __scsi_remove_device(struct scsi_device *); > > extern struct bus_type scsi_bus_type; > -extern const struct attribute_group scsi_shost_attr_group; > +extern const struct attribute_group *scsi_shost_groups[]; > > /* scsi_netlink.c */ > #ifdef CONFIG_SCSI_NETLINK > diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c > index 7afcec250f9b..342a3de6b994 100644 > --- a/drivers/scsi/scsi_sysfs.c > +++ b/drivers/scsi/scsi_sysfs.c > @@ -424,10 +424,15 @@ static struct attribute *scsi_sysfs_shost_attrs[] = { > NULL > }; > > -const struct attribute_group scsi_shost_attr_group = { > +static const struct attribute_group scsi_shost_attr_group = { > .attrs = scsi_sysfs_shost_attrs, > }; > > +const struct attribute_group *scsi_shost_groups[] = { > + &scsi_shost_attr_group, > + NULL > +}; > + > static void scsi_device_cls_release(struct device *class_dev) > { > struct scsi_device *sdev; > diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h > index ebe059badba0..72e1a347baa6 100644 > --- a/include/scsi/scsi_host.h > +++ b/include/scsi/scsi_host.h > @@ -691,12 +691,6 @@ struct Scsi_Host { > > /* ldm bits */ > struct device shost_gendev, shost_dev; > - /* > - * The array size 3 provides space for one attribute group defined by > - * the SCSI core, one attribute group defined by the SCSI LLD and one > - * terminating NULL pointer. > - */ > - const struct attribute_group *shost_dev_attr_groups[3]; > > /* > * Points to the transport data (if any) which is allocated > Looks good to me. Reviewed-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> -- Damien Le Moal Western Digital Research