That could let pci_create_sysfs_dev_files more simple. also fix possible fix memleak during removing path. Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> --- drivers/pci/pci-sysfs.c | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) Index: linux-2.6/drivers/pci/pci-sysfs.c =================================================================== --- linux-2.6.orig/drivers/pci/pci-sysfs.c +++ linux-2.6/drivers/pci/pci-sysfs.c @@ -1213,29 +1213,20 @@ int __must_check pci_create_sysfs_dev_fi pdev->rom_attr = attr; } - if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) { - retval = device_create_file(&pdev->dev, &vga_attr); - if (retval) - goto err_rom_file; - } - /* add platform-specific attributes */ retval = pcibios_add_platform_entries(pdev); if (retval) - goto err_vga_file; + goto err_rom_file; /* add sysfs entries for various capabilities */ retval = pci_create_capabilities_sysfs(pdev); if (retval) - goto err_vga_file; + goto err_rom_file; pci_create_firmware_label_files(pdev); return 0; -err_vga_file: - if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) - device_remove_file(&pdev->dev, &vga_attr); err_rom_file: if (rom_size) { sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_attr); @@ -1322,6 +1313,28 @@ static int __init pci_sysfs_init(void) late_initcall(pci_sysfs_init); +static struct attribute *pci_dev_vga_attrs[] = { + &vga_attr.attr, + NULL, +}; + +static mode_t pci_dev_vga_attrs_are_visible(struct kobject *kobj, + struct attribute *a, int n) +{ + struct device *dev = container_of(kobj, struct device, kobj); + struct pci_dev *pdev = to_pci_dev(dev); + + if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA) + return 0; + + return a->mode; +} + +static struct attribute_group pci_dev_vga_attr_group = { + .attrs = pci_dev_vga_attrs, + .is_visible = pci_dev_vga_attrs_are_visible, +}; + static struct attribute *pci_dev_bridge_attrs[] = { #ifdef CONFIG_HOTPLUG &pci_dev_bridge_rescan_attr.attr, @@ -1348,6 +1361,7 @@ static struct attribute_group pci_dev_br static const struct attribute_group *pci_dev_attr_groups[] = { &pci_dev_bridge_attr_group, + &pci_dev_vga_attr_group, NULL, }; -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html