From 3d4f1af1fe85f0f2cc435ea177d25f9bad454965 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Fri, 24 Sep 2021 14:40:16 -0700 Subject: [PATCH] scsi: Register SCSI device sysfs attributes earlier A quote from Documentation/driver-api/driver-model/device.rst: "Word of warning: While the kernel allows device_create_file() and device_remove_file() to be called on a device at any time, userspace has strict expectations on when attributes get created. When a new device is registered in the kernel, a uevent is generated to notify userspace (like udev) that a new device is available. If attributes are added after the device is registered, then userspace won't get notified and userspace will not know about the new attributes." Hence register SCSI device sysfs attributes before the SCSI host shost_dev uevent is emitted instead of after that event has been emitted. Fixes: 86b87cde0b55 ("scsi: core: host template attribute groups") Signed-off-by: Bart Van Assche --- drivers/ata/ahci.h | 4 ++-- drivers/ata/libahci.c | 21 ++++++++++++------ drivers/ata/libata-sata.c | 19 +++++++++++----- drivers/ata/libata-scsi.c | 15 ++++++++++--- drivers/ata/pata_macio.c | 2 +- drivers/ata/sata_mv.c | 2 +- drivers/ata/sata_nv.c | 4 ++-- drivers/ata/sata_sil24.c | 2 +- drivers/firewire/sbp2.c | 6 +++--- drivers/s390/scsi/zfcp_ext.h | 2 +- drivers/s390/scsi/zfcp_scsi.c | 2 +- drivers/s390/scsi/zfcp_sysfs.c | 31 +++++++++++++++++---------- drivers/scsi/53c700.c | 19 +++++++++++----- drivers/scsi/aacraid/linit.c | 17 +++++++++++---- drivers/scsi/cxlflash/main.c | 11 +++++++++- drivers/scsi/hpsa.c | 25 ++++++++++++++------- drivers/scsi/ipr.c | 23 ++++++++++++++------ drivers/scsi/megaraid/megaraid_mbox.c | 15 ++++++++++--- drivers/scsi/mpt3sas/mpt3sas_base.h | 2 +- drivers/scsi/mpt3sas/mpt3sas_ctl.c | 19 +++++++++++----- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 4 ++-- drivers/scsi/myrb.c | 21 ++++++++++++------ drivers/scsi/myrs.c | 21 ++++++++++++------ drivers/scsi/scsi_sysfs.c | 25 +++------------------ drivers/scsi/smartpqi/smartpqi_init.c | 18 ++++++++-------- drivers/usb/storage/scsiglue.c | 15 ++++++++++--- include/linux/libata.h | 8 +++---- include/scsi/scsi_host.h | 4 ++-- 28 files changed, 232 insertions(+), 125 deletions(-) diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index e9434a09c19193..b9c3f7f70cf7b4 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -377,7 +377,7 @@ struct ahci_host_priv { extern int ahci_ignore_sss; extern const struct attribute_group *ahci_shost_attr_groups[]; -extern struct device_attribute *ahci_sdev_attrs[]; +extern const struct attribute_group *ahci_sdev_attr_groups[]; /* * This must be instantiated by the edge drivers. Read the comments @@ -389,7 +389,7 @@ extern struct device_attribute *ahci_sdev_attrs[]; .sg_tablesize = AHCI_MAX_SG, \ .dma_boundary = AHCI_DMA_BOUNDARY, \ .shost_attr_groups = ahci_shost_attr_groups, \ - .sdev_attrs = ahci_sdev_attrs, \ + .sdev_attr_groups = ahci_sdev_attr_groups, \ .change_queue_depth = ata_scsi_change_queue_depth, \ .tag_alloc_policy = BLK_TAG_ALLOC_RR, \ .slave_configure = ata_scsi_slave_config diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c index fa9f3b379c6006..ebf9909440544d 100644 --- a/drivers/ata/libahci.c +++ b/drivers/ata/libahci.c @@ -131,14 +131,23 @@ const struct attribute_group *ahci_shost_attr_groups[] = { }; EXPORT_SYMBOL_GPL(ahci_shost_attr_groups); -struct device_attribute *ahci_sdev_attrs[] = { - &dev_attr_sw_activity, - &dev_attr_unload_heads, - &dev_attr_ncq_prio_supported, - &dev_attr_ncq_prio_enable, +struct attribute *ahci_sdev_attrs[] = { + &dev_attr_sw_activity.attr, + &dev_attr_unload_heads.attr, + &dev_attr_ncq_prio_supported.attr, + &dev_attr_ncq_prio_enable.attr, NULL }; -EXPORT_SYMBOL_GPL(ahci_sdev_attrs); + +static const struct attribute_group ahci_sdev_attr_group = { + .attrs = ahci_sdev_attrs +}; + +const struct attribute_group *ahci_sdev_attr_groups[] = { + &ahci_sdev_attr_group, + NULL +}; +EXPORT_SYMBOL_GPL(ahci_sdev_attr_groups); struct ata_port_operations ahci_ops = { .inherits = &sata_pmp_port_ops, diff --git a/drivers/ata/libata-sata.c b/drivers/ata/libata-sata.c index 8f3ff830ab0c6e..0d332b40ec42f7 100644 --- a/drivers/ata/libata-sata.c +++ b/drivers/ata/libata-sata.c @@ -922,13 +922,22 @@ DEVICE_ATTR(ncq_prio_enable, S_IRUGO | S_IWUSR, ata_ncq_prio_enable_show, ata_ncq_prio_enable_store); EXPORT_SYMBOL_GPL(dev_attr_ncq_prio_enable); -struct device_attribute *ata_ncq_sdev_attrs[] = { - &dev_attr_unload_heads, - &dev_attr_ncq_prio_enable, - &dev_attr_ncq_prio_supported, +struct attribute *ata_ncq_sdev_attrs[] = { + &dev_attr_unload_heads.attr, + &dev_attr_ncq_prio_enable.attr, + &dev_attr_ncq_prio_supported.attr, NULL }; -EXPORT_SYMBOL_GPL(ata_ncq_sdev_attrs); + +static const struct attribute_group ata_ncq_sdev_attr_group = { + .attrs = ata_ncq_sdev_attrs +}; + +const struct attribute_group *ata_ncq_sdev_attr_groups[] = { + &ata_ncq_sdev_attr_group, + NULL +}; +EXPORT_SYMBOL_GPL(ata_ncq_sdev_attr_groups); static ssize_t ata_scsi_em_message_store(struct device *dev, struct device_attribute *attr, diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 1fb4611f7eeb9e..84c696960f4c15 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -234,11 +234,20 @@ static void ata_scsi_set_invalid_parameter(struct ata_device *dev, field, 0xff, 0); } -struct device_attribute *ata_common_sdev_attrs[] = { - &dev_attr_unload_heads, +static struct attribute *ata_common_sdev_attrs[] = { + &dev_attr_unload_heads.attr, NULL }; -EXPORT_SYMBOL_GPL(ata_common_sdev_attrs); + +static const struct attribute_group ata_common_sdev_attr_group = { + .attrs = ata_common_sdev_attrs +}; + +const struct attribute_group *ata_common_sdev_attr_groups[] = { + &ata_common_sdev_attr_group, + NULL +}; +EXPORT_SYMBOL_GPL(ata_common_sdev_attr_groups); /** * ata_std_bios_param - generic bios head/sector/cylinder calculator used by sd. diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c index be0ca8d5b3452e..e67222d7feb5b0 100644 --- a/drivers/ata/pata_macio.c +++ b/drivers/ata/pata_macio.c @@ -923,7 +923,7 @@ static struct scsi_host_template pata_macio_sht = { */ .max_segment_size = MAX_DBDMA_SEG, .slave_configure = pata_macio_slave_config, - .sdev_attrs = ata_common_sdev_attrs, + .sdev_attr_groups = ata_common_sdev_attr_groups, .can_queue = ATA_DEF_QUEUE, .tag_alloc_policy = BLK_TAG_ALLOC_RR, }; diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index 9d86203e1e7a10..6d5a217d301f84 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c @@ -670,7 +670,7 @@ static struct scsi_host_template mv6_sht = { .can_queue = MV_MAX_Q_DEPTH - 1, .sg_tablesize = MV_MAX_SG_CT / 2, .dma_boundary = MV_DMA_BOUNDARY, - .sdev_attrs = ata_ncq_sdev_attrs, + .sdev_attr_groups = ata_ncq_sdev_attr_groups, .change_queue_depth = ata_scsi_change_queue_depth, .tag_alloc_policy = BLK_TAG_ALLOC_RR, .slave_configure = ata_scsi_slave_config diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c index c385d18ce87b76..908b62de0cbe31 100644 --- a/drivers/ata/sata_nv.c +++ b/drivers/ata/sata_nv.c @@ -380,7 +380,7 @@ static struct scsi_host_template nv_adma_sht = { .sg_tablesize = NV_ADMA_SGTBL_TOTAL_LEN, .dma_boundary = NV_ADMA_DMA_BOUNDARY, .slave_configure = nv_adma_slave_config, - .sdev_attrs = ata_ncq_sdev_attrs, + .sdev_attr_groups = ata_ncq_sdev_attr_groups, .change_queue_depth = ata_scsi_change_queue_depth, .tag_alloc_policy = BLK_TAG_ALLOC_RR, }; @@ -391,7 +391,7 @@ static struct scsi_host_template nv_swncq_sht = { .sg_tablesize = LIBATA_MAX_PRD, .dma_boundary = ATA_DMA_BOUNDARY, .slave_configure = nv_swncq_slave_config, - .sdev_attrs = ata_ncq_sdev_attrs, + .sdev_attr_groups = ata_ncq_sdev_attr_groups, .change_queue_depth = ata_scsi_change_queue_depth, .tag_alloc_policy = BLK_TAG_ALLOC_RR, }; diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 06a1e27c4f84a9..19381707cb6eb7 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c @@ -379,7 +379,7 @@ static struct scsi_host_template sil24_sht = { .sg_tablesize = SIL24_MAX_SGE, .dma_boundary = ATA_DMA_BOUNDARY, .tag_alloc_policy = BLK_TAG_ALLOC_FIFO, - .sdev_attrs = ata_ncq_sdev_attrs, + .sdev_attr_groups = ata_ncq_sdev_attr_groups, .change_queue_depth = ata_scsi_change_queue_depth, .slave_configure = ata_scsi_slave_config }; diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c index 4d5054211550b9..b9cb41e25621cb 100644 --- a/drivers/firewire/sbp2.c +++ b/drivers/firewire/sbp2.c @@ -1578,8 +1578,8 @@ static ssize_t sbp2_sysfs_ieee1394_id_show(struct device *dev, static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL); -static struct device_attribute *sbp2_scsi_sysfs_attrs[] = { - &dev_attr_ieee1394_id, +static struct attribute *sbp2_scsi_sysfs_attrs[] = { + &dev_attr_ieee1394_id.attr, NULL }; @@ -1595,7 +1595,7 @@ static struct scsi_host_template scsi_driver_template = { .sg_tablesize = SG_ALL, .max_segment_size = SBP2_MAX_SEG_SIZE, .can_queue = 1, - .sdev_attrs = sbp2_scsi_sysfs_attrs, + .sdev_attr_groups = sbp2_scsi_sysfs_attr_groups, }; MODULE_AUTHOR("Kristian Hoegsberg "); diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 40ce2595e1e724..87a35a755464ad 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h @@ -184,7 +184,7 @@ extern const struct attribute_group *zfcp_sysfs_adapter_attr_groups[]; extern const struct attribute_group *zfcp_unit_attr_groups[]; extern const struct attribute_group *zfcp_port_attr_groups[]; extern struct mutex zfcp_sysfs_port_units_mutex; -extern struct device_attribute *zfcp_sysfs_sdev_attrs[]; +extern const struct attribute_group *zfcp_sysfs_sdev_attr_groups[]; extern const struct attribute_group *zfcp_shost_attr_groups[]; bool zfcp_sysfs_port_is_removing(const struct zfcp_port *const port); diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index cbbccbdbedec21..416a3196bf4c64 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c @@ -445,7 +445,7 @@ static struct scsi_host_template zfcp_scsi_host_template = { .max_segment_size = ZFCP_QDIO_SBALE_LEN, .dma_boundary = ZFCP_QDIO_SBALE_LEN - 1, .shost_attr_groups = zfcp_shost_attr_groups, - .sdev_attrs = zfcp_sysfs_sdev_attrs, + .sdev_attr_groups = zfcp_sysfs_sdev_attr_groups, .track_queue_depth = 1, .supported_mode = MODE_INITIATOR, }; diff --git a/drivers/s390/scsi/zfcp_sysfs.c b/drivers/s390/scsi/zfcp_sysfs.c index 5ff1b6cc31ea1c..999cf6ee3598e4 100644 --- a/drivers/s390/scsi/zfcp_sysfs.c +++ b/drivers/s390/scsi/zfcp_sysfs.c @@ -672,17 +672,26 @@ ZFCP_DEFINE_SCSI_ATTR(zfcp_in_recovery, "%d\n", ZFCP_DEFINE_SCSI_ATTR(zfcp_status, "0x%08x\n", atomic_read(&zfcp_sdev->status)); -struct device_attribute *zfcp_sysfs_sdev_attrs[] = { - &dev_attr_fcp_lun, - &dev_attr_wwpn, - &dev_attr_hba_id, - &dev_attr_read_latency, - &dev_attr_write_latency, - &dev_attr_cmd_latency, - &dev_attr_zfcp_access_denied, - &dev_attr_zfcp_failed, - &dev_attr_zfcp_in_recovery, - &dev_attr_zfcp_status, +struct attribute *zfcp_sysfs_sdev_attrs[] = { + &dev_attr_fcp_lun.attr, + &dev_attr_wwpn.attr, + &dev_attr_hba_id.attr, + &dev_attr_read_latency.attr, + &dev_attr_write_latency.attr, + &dev_attr_cmd_latency.attr, + &dev_attr_zfcp_access_denied.attr, + &dev_attr_zfcp_failed.attr, + &dev_attr_zfcp_in_recovery.attr, + &dev_attr_zfcp_status.attr, + NULL +}; + +static const struct attribute_group zfcp_sysfs_sdev_attr_group = { + .attrs = zfcp_sysfs_sdev_attrs +}; + +const struct attribute_group *zfcp_sysfs_sdev_attr_groups[] = { + &zfcp_sysfs_sdev_attr_group, NULL }; diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c index a12e3525977d8f..26f83b5504b7cb 100644 --- a/drivers/scsi/53c700.c +++ b/drivers/scsi/53c700.c @@ -163,7 +163,7 @@ STATIC int NCR_700_slave_configure(struct scsi_device *SDpnt); STATIC void NCR_700_slave_destroy(struct scsi_device *SDpnt); static int NCR_700_change_queue_depth(struct scsi_device *SDpnt, int depth); -STATIC struct device_attribute *NCR_700_dev_attrs[]; +STATIC const struct attribute_group *NCR_700_dev_attr_groups[]; STATIC struct scsi_transport_template *NCR_700_transport_template = NULL; @@ -300,8 +300,8 @@ NCR_700_detect(struct scsi_host_template *tpnt, static int banner = 0; int j; - if(tpnt->sdev_attrs == NULL) - tpnt->sdev_attrs = NCR_700_dev_attrs; + if (tpnt->sdev_attr_groups == NULL) + tpnt->sdev_attr_groups = NCR_700_dev_attr_groups; memory = dma_alloc_coherent(dev, TOTAL_MEM_SIZE, &pScript, GFP_KERNEL); if (!memory) { @@ -2087,11 +2087,20 @@ static struct device_attribute NCR_700_active_tags_attr = { .show = NCR_700_show_active_tags, }; -STATIC struct device_attribute *NCR_700_dev_attrs[] = { - &NCR_700_active_tags_attr, +STATIC struct attribute *NCR_700_dev_attrs[] = { + &NCR_700_active_tags_attr.attr, NULL, }; +STATIC const struct attribute_group NCR_700_dev_attr_group = { + .attrs = NCR_700_dev_attrs +}; + +STATIC const struct attribute_group *NCR_700_dev_attr_groups[] = { + &NCR_700_dev_attr_group, + NULL +}; + EXPORT_SYMBOL(NCR_700_detect); EXPORT_SYMBOL(NCR_700_release); EXPORT_SYMBOL(NCR_700_intr); diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c index aec9eb933e9eda..9c321a036503f4 100644 --- a/drivers/scsi/aacraid/linit.c +++ b/drivers/scsi/aacraid/linit.c @@ -605,12 +605,21 @@ static struct device_attribute aac_unique_id_attr = { -static struct device_attribute *aac_dev_attrs[] = { - &aac_raid_level_attr, - &aac_unique_id_attr, +static struct attribute *aac_dev_attrs[] = { + &aac_raid_level_attr.attr, + &aac_unique_id_attr.attr, NULL, }; +static const struct attribute_group aac_dev_attr_group = { + .attrs = aac_dev_attrs +}; + +static const struct attribute_group *aac_dev_attr_groups[] = { + &aac_dev_attr_group, + NULL +}; + static int aac_ioctl(struct scsi_device *sdev, unsigned int cmd, void __user *arg) { @@ -1495,7 +1504,7 @@ static struct scsi_host_template aac_driver_template = { .shost_attr_groups = aac_attr_groups, .slave_configure = aac_slave_configure, .change_queue_depth = aac_change_queue_depth, - .sdev_attrs = aac_dev_attrs, + .sdev_attr_groups = aac_dev_attr_groups, .eh_abort_handler = aac_eh_abort, .eh_device_reset_handler = aac_eh_dev_reset, .eh_target_reset_handler = aac_eh_target_reset, diff --git a/drivers/scsi/cxlflash/main.c b/drivers/scsi/cxlflash/main.c index 2797a09c869d8b..3253ed0f6634b1 100644 --- a/drivers/scsi/cxlflash/main.c +++ b/drivers/scsi/cxlflash/main.c @@ -3139,6 +3139,15 @@ static struct attribute *cxlflash_dev_attrs[] = { NULL }; +static const struct attribute_group cxlflash_dev_attr_group = { + .attrs = cxlflash_dev_attrs +}; + +static const struct attribute_group *cxlflash_dev_attr_groups[] = { + &cxlflash_dev_attr_group, + NULL +}; + /* * Host template */ @@ -3160,7 +3169,7 @@ static struct scsi_host_template driver_template = { .sg_tablesize = 1, /* No scatter gather support */ .max_sectors = CXLFLASH_MAX_SECTORS, .shost_attr_groups = cxlflash_host_attr_groups, - .sdev_attrs = cxlflash_dev_attrs, + .sdev_attr_groups = cxlflash_dev_attr_groups, }; /* diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index db3d8d6b798791..6c1b0f5e3a6d41 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c @@ -936,16 +936,25 @@ static DEVICE_ATTR(ctlr_num, S_IRUGO, static DEVICE_ATTR(legacy_board, S_IRUGO, host_show_legacy_board, NULL); -static struct device_attribute *hpsa_sdev_attrs[] = { - &dev_attr_raid_level, - &dev_attr_lunid, - &dev_attr_unique_id, - &dev_attr_hp_ssd_smart_path_enabled, - &dev_attr_path_info, - &dev_attr_sas_address, +static struct attribute *hpsa_sdev_attrs[] = { + &dev_attr_raid_level.attr, + &dev_attr_lunid.attr, + &dev_attr_unique_id.attr, + &dev_attr_hp_ssd_smart_path_enabled.attr, + &dev_attr_path_info.attr, + &dev_attr_sas_address.attr, NULL, }; +static const struct attribute_group hpsa_sdev_attr_group = { + .attrs = hpsa_sdev_attrs +}; + +static const struct attribute_group *hpsa_sdev_attr_groups[] = { + &hpsa_sdev_attr_group, + NULL +}; + static struct attribute *hpsa_shost_attrs[] = { &dev_attr_rescan.attr, &dev_attr_firmware_revision.attr, @@ -989,7 +998,7 @@ static struct scsi_host_template hpsa_driver_template = { #ifdef CONFIG_COMPAT .compat_ioctl = hpsa_compat_ioctl, #endif - .sdev_attrs = hpsa_sdev_attrs, + .sdev_attr_groups = hpsa_sdev_attr_groups, .shost_attr_groups = hpsa_shost_attr_groups, .max_sectors = 2048, .no_write_same = 1, diff --git a/drivers/scsi/ipr.c b/drivers/scsi/ipr.c index 5b65159bf3bab8..68a87ac3887044 100644 --- a/drivers/scsi/ipr.c +++ b/drivers/scsi/ipr.c @@ -4741,15 +4741,24 @@ static struct device_attribute ipr_raw_mode_attr = { .store = ipr_store_raw_mode }; -static struct device_attribute *ipr_dev_attrs[] = { - &ipr_adapter_handle_attr, - &ipr_resource_path_attr, - &ipr_device_id_attr, - &ipr_resource_type_attr, - &ipr_raw_mode_attr, +static struct attribute *ipr_dev_attrs[] = { + &ipr_adapter_handle_attr.attr, + &ipr_resource_path_attr.attr, + &ipr_device_id_attr.attr, + &ipr_resource_type_attr.attr, + &ipr_raw_mode_attr.attr, NULL, }; +static const struct attribute_group ipr_dev_attr_group = { + .attrs = ipr_dev_attrs +}; + +static const struct attribute_group *ipr_dev_attr_groups[] = { + &ipr_dev_attr_group, + NULL +}; + /** * ipr_biosparam - Return the HSC mapping * @sdev: scsi device struct @@ -6772,7 +6781,7 @@ static struct scsi_host_template driver_template = { .max_sectors = IPR_IOA_MAX_SECTORS, .cmd_per_lun = IPR_MAX_CMD_PER_LUN, .shost_attr_groups = ipr_ioa_attr_groups, - .sdev_attrs = ipr_dev_attrs, + .sdev_attr_groups = ipr_dev_attr_groups, .proc_name = IPR_NAME, }; diff --git a/drivers/scsi/megaraid/megaraid_mbox.c b/drivers/scsi/megaraid/megaraid_mbox.c index e09490892fafbd..99534f8241b3fd 100644 --- a/drivers/scsi/megaraid/megaraid_mbox.c +++ b/drivers/scsi/megaraid/megaraid_mbox.c @@ -322,11 +322,20 @@ static const struct attribute_group *megaraid_shost_attr_groups[] = { static DEVICE_ATTR_ADMIN_RO(megaraid_mbox_ld); // Host template initializer for megaraid mbox sysfs device attributes -static struct device_attribute *megaraid_sdev_attrs[] = { - &dev_attr_megaraid_mbox_ld, +static struct attribute *megaraid_sdev_attrs[] = { + &dev_attr_megaraid_mbox_ld.attr, NULL, }; +static const struct attribute_group megaraid_sdev_attr_group = { + .attrs = megaraid_sdev_attrs +}; + +static const struct attribute_group *megaraid_sdev_attr_groups[] = { + &megaraid_sdev_attr_group, + NULL +}; + /* * Scsi host template for megaraid unified driver */ @@ -339,7 +348,7 @@ static struct scsi_host_template megaraid_template_g = { .eh_host_reset_handler = megaraid_reset_handler, .change_queue_depth = scsi_change_queue_depth, .no_write_same = 1, - .sdev_attrs = megaraid_sdev_attrs, + .sdev_attr_groups = megaraid_sdev_attr_groups, .shost_attr_groups = megaraid_shost_attr_groups, }; diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h index f5f283e6866449..cf3fbc4adc6df2 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_base.h +++ b/drivers/scsi/mpt3sas/mpt3sas_base.h @@ -1940,7 +1940,7 @@ mpt3sas_config_update_driver_trigger_pg4(struct MPT3SAS_ADAPTER *ioc, /* ctl shared API */ extern const struct attribute_group *mpt3sas_host_attr_groups[]; -extern struct device_attribute *mpt3sas_dev_attrs[]; +extern const struct attribute_group *mpt3sas_dev_attr_groups[]; void mpt3sas_ctl_init(ushort hbas_to_enumerate); void mpt3sas_ctl_exit(ushort hbas_to_enumerate); u8 mpt3sas_ctl_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c index 50571ad84ffe73..2e6f73f5b9a1d0 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c +++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c @@ -3985,14 +3985,23 @@ sas_ncq_prio_enable_store(struct device *dev, } static DEVICE_ATTR_RW(sas_ncq_prio_enable); -struct device_attribute *mpt3sas_dev_attrs[] = { - &dev_attr_sas_address, - &dev_attr_sas_device_handle, - &dev_attr_sas_ncq_prio_supported, - &dev_attr_sas_ncq_prio_enable, +struct attribute *mpt3sas_dev_attrs[] = { + &dev_attr_sas_address.attr, + &dev_attr_sas_device_handle.attr, + &dev_attr_sas_ncq_prio_supported.attr, + &dev_attr_sas_ncq_prio_enable.attr, NULL, }; +static const struct attribute_group mpt3sas_dev_attr_group = { + .attrs = mpt3sas_dev_attrs +}; + +const struct attribute_group *mpt3sas_dev_attr_groups[] = { + &mpt3sas_dev_attr_group, + NULL +}; + /* file operations table for mpt3ctl device */ static const struct file_operations ctl_fops = { .owner = THIS_MODULE, diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c index 348282ca7c749d..67833892b415cf 100644 --- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c +++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c @@ -11877,7 +11877,7 @@ static struct scsi_host_template mpt2sas_driver_template = { .max_sectors = 32767, .cmd_per_lun = 7, .shost_attr_groups = mpt3sas_host_attr_groups, - .sdev_attrs = mpt3sas_dev_attrs, + .sdev_attr_groups = mpt3sas_dev_attr_groups, .track_queue_depth = 1, .cmd_size = sizeof(struct scsiio_tracker), }; @@ -11916,7 +11916,7 @@ static struct scsi_host_template mpt3sas_driver_template = { .max_segment_size = 0xffffffff, .cmd_per_lun = 7, .shost_attr_groups = mpt3sas_host_attr_groups, - .sdev_attrs = mpt3sas_dev_attrs, + .sdev_attr_groups = mpt3sas_dev_attr_groups, .track_queue_depth = 1, .cmd_size = sizeof(struct scsiio_tracker), .map_queues = scsih_map_queues, diff --git a/drivers/scsi/myrb.c b/drivers/scsi/myrb.c index 71c1e06338fc14..7a37d98fd281e3 100644 --- a/drivers/scsi/myrb.c +++ b/drivers/scsi/myrb.c @@ -2182,14 +2182,23 @@ static ssize_t flush_cache_store(struct device *dev, } static DEVICE_ATTR_WO(flush_cache); -static struct device_attribute *myrb_sdev_attrs[] = { - &dev_attr_rebuild, - &dev_attr_consistency_check, - &dev_attr_raid_state, - &dev_attr_raid_level, +static struct attribute *myrb_sdev_attrs[] = { + &dev_attr_rebuild.attr, + &dev_attr_consistency_check.attr, + &dev_attr_raid_state.attr, + &dev_attr_raid_level.attr, NULL, }; +static const struct attribute_group myrb_sdev_attr_group = { + .attrs = myrb_sdev_attrs +}; + +static const struct attribute_group *myrb_sdev_attr_groups[] = { + &myrb_sdev_attr_group, + NULL +}; + static struct attribute *myrb_shost_attrs[] = { &dev_attr_ctlr_num.attr, &dev_attr_model.attr, @@ -2219,7 +2228,7 @@ static struct scsi_host_template myrb_template = { .bios_param = myrb_biosparam, .cmd_size = sizeof(struct myrb_cmdblk), .shost_attr_groups = myrb_shost_attr_groups, - .sdev_attrs = myrb_sdev_attrs, + .sdev_attr_groups = myrb_sdev_attr_groups, .this_id = -1, }; diff --git a/drivers/scsi/myrs.c b/drivers/scsi/myrs.c index 71ca8fa0d63d5f..691e40f22cda92 100644 --- a/drivers/scsi/myrs.c +++ b/drivers/scsi/myrs.c @@ -1286,14 +1286,23 @@ static ssize_t consistency_check_store(struct device *dev, } static DEVICE_ATTR_RW(consistency_check); -static struct device_attribute *myrs_sdev_attrs[] = { - &dev_attr_consistency_check, - &dev_attr_rebuild, - &dev_attr_raid_state, - &dev_attr_raid_level, +static struct attribute *myrs_sdev_attrs[] = { + &dev_attr_consistency_check.attr, + &dev_attr_rebuild.attr, + &dev_attr_raid_state.attr, + &dev_attr_raid_level.attr, NULL, }; +static const struct attribute_group myrs_sdev_attr_group = { + .attrs = myrs_sdev_attrs +}; + +static const struct attribute_group *myrs_sdev_attr_groups[] = { + &myrs_sdev_attr_group, + NULL +}; + static ssize_t serial_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -1933,7 +1942,7 @@ static struct scsi_host_template myrs_template = { .slave_destroy = myrs_slave_destroy, .cmd_size = sizeof(struct myrs_cmdblk), .shost_attr_groups = myrs_shost_attr_groups, - .sdev_attrs = myrs_sdev_attrs, + .sdev_attr_groups = myrs_sdev_attr_groups, .this_id = -1, }; diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index 2591e7ade4b121..439f931fb79879 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c @@ -1328,7 +1328,7 @@ static int scsi_target_add(struct scsi_target *starget) **/ int scsi_sysfs_add_sdev(struct scsi_device *sdev) { - int error, i; + int error; struct scsi_target *starget = sdev->sdev_target; error = scsi_target_add(starget); @@ -1381,23 +1381,6 @@ int scsi_sysfs_add_sdev(struct scsi_device *sdev) } } - /* add additional host specific attributes */ - if (sdev->host->hostt->sdev_attrs) { - for (i = 0; sdev->host->hostt->sdev_attrs[i]; i++) { - error = device_create_file(&sdev->sdev_gendev, - sdev->host->hostt->sdev_attrs[i]); - if (error) - return error; - } - } - - if (sdev->host->hostt->sdev_groups) { - error = sysfs_create_groups(&sdev->sdev_gendev.kobj, - sdev->host->hostt->sdev_groups); - if (error) - return error; - } - scsi_autopm_put_device(sdev); return error; } @@ -1437,10 +1420,6 @@ void __scsi_remove_device(struct scsi_device *sdev) if (res != 0) return; - if (sdev->host->hostt->sdev_groups) - sysfs_remove_groups(&sdev->sdev_gendev.kobj, - sdev->host->hostt->sdev_groups); - if (IS_ENABLED(CONFIG_BLK_DEV_BSG) && sdev->bsg_dev) bsg_unregister_queue(sdev->bsg_dev); device_unregister(&sdev->sdev_dev); @@ -1594,6 +1573,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev) { unsigned long flags; struct Scsi_Host *shost = sdev->host; + struct scsi_host_template *hostt = shost->hostt; struct scsi_target *starget = sdev->sdev_target; device_initialize(&sdev->sdev_gendev); @@ -1601,6 +1581,7 @@ void scsi_sysfs_device_initialize(struct scsi_device *sdev) sdev->sdev_gendev.type = &scsi_dev_type; dev_set_name(&sdev->sdev_gendev, "%d:%d:%d:%llu", sdev->host->host_no, sdev->channel, sdev->id, sdev->lun); + sdev->sdev_gendev.groups = hostt->sdev_attr_groups; device_initialize(&sdev->sdev_dev); sdev->sdev_dev.parent = get_device(&sdev->sdev_gendev); diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c index fdcf622dbdc0ef..c559198fd2473a 100644 --- a/drivers/scsi/smartpqi/smartpqi_init.c +++ b/drivers/scsi/smartpqi/smartpqi_init.c @@ -6924,14 +6924,14 @@ static DEVICE_ATTR(ssd_smart_path_enabled, 0444, pqi_ssd_smart_path_enabled_show static DEVICE_ATTR(raid_level, 0444, pqi_raid_level_show, NULL); static DEVICE_ATTR(raid_bypass_cnt, 0444, pqi_raid_bypass_cnt_show, NULL); -static struct device_attribute *pqi_sdev_attrs[] = { - &dev_attr_lunid, - &dev_attr_unique_id, - &dev_attr_path_info, - &dev_attr_sas_address, - &dev_attr_ssd_smart_path_enabled, - &dev_attr_raid_level, - &dev_attr_raid_bypass_cnt, +static struct attribute *pqi_sdev_attrs[] = { + &dev_attr_lunid.attr, + &dev_attr_unique_id.attr, + &dev_attr_path_info.attr, + &dev_attr_sas_address.attr, + &dev_attr_ssd_smart_path_enabled.attr, + &dev_attr_raid_level.attr, + &dev_attr_raid_bypass_cnt.attr, NULL }; @@ -6949,7 +6949,7 @@ static struct scsi_host_template pqi_driver_template = { .slave_configure = pqi_slave_configure, .slave_destroy = pqi_slave_destroy, .map_queues = pqi_map_queues, - .sdev_attrs = pqi_sdev_attrs, + .sdev_attr_groups = pqi_sdev_attr_groups, .shost_attr_groups = pqi_shost_attr_groups, }; diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index e5a971b83e3f56..bc7f53618f2568 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -588,11 +588,20 @@ static ssize_t max_sectors_store(struct device *dev, struct device_attribute *at } static DEVICE_ATTR_RW(max_sectors); -static struct device_attribute *sysfs_device_attr_list[] = { - &dev_attr_max_sectors, +static struct attribute *usb_sdev_attrs[] = { + &dev_attr_max_sectors.attr, NULL, }; +static const struct attribute_group usb_sdev_attr_group = { + .attrs = usb_sdev_attrs +}; + +static const struct attribute_group *usb_sdev_attr_groups[] = { + &usb_sdev_attr_group, + NULL +}; + /* * this defines our host template, with which we'll allocate hosts */ @@ -653,7 +662,7 @@ static const struct scsi_host_template usb_stor_host_template = { .skip_settle_delay = 1, /* sysfs device attributes */ - .sdev_attrs = sysfs_device_attr_list, + .sdev_attr_groups = usb_sdev_attr_groups, /* module management */ .module = THIS_MODULE diff --git a/include/linux/libata.h b/include/linux/libata.h index c0c64f03e10740..b750518ff23555 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h @@ -1388,7 +1388,7 @@ extern int ata_link_nr_enabled(struct ata_link *link); */ extern const struct ata_port_operations ata_base_port_ops; extern const struct ata_port_operations sata_port_ops; -extern struct device_attribute *ata_common_sdev_attrs[]; +extern const struct attribute_group *ata_common_sdev_attr_groups[]; /* * All sht initializers (BASE, PIO, BMDMA, NCQ) must be instantiated @@ -1418,14 +1418,14 @@ extern struct device_attribute *ata_common_sdev_attrs[]; #define ATA_BASE_SHT(drv_name) \ ATA_SUBBASE_SHT(drv_name), \ - .sdev_attrs = ata_common_sdev_attrs + .sdev_attr_groups = ata_common_sdev_attr_groups #ifdef CONFIG_SATA_HOST -extern struct device_attribute *ata_ncq_sdev_attrs[]; +extern const struct attribute_group *ata_ncq_sdev_attr_groups[]; #define ATA_NCQ_SHT(drv_name) \ ATA_SUBBASE_SHT(drv_name), \ - .sdev_attrs = ata_ncq_sdev_attrs, \ + .sdev_attr_groups = ata_ncq_sdev_attr_groups, \ .change_queue_depth = ata_scsi_change_queue_depth #endif diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index f7498d8a7e7099..30f3f8bf3eb5e9 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -479,9 +479,9 @@ struct scsi_host_template { const struct attribute_group **shost_attr_groups; /* - * Pointer to the SCSI device properties for this host, NULL terminated. + * Pointer to the SCSI device sysfs attribute groups, NULL terminated. */ - struct device_attribute **sdev_attrs; + const struct attribute_group **sdev_attr_groups; /* * Pointer to the SCSI device attribute groups for this host,