Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes
[pandora-kernel.git] / drivers / pci / slot.c
index 659eaa0..e0189cf 100644 (file)
@@ -97,6 +97,50 @@ static ssize_t cur_speed_read_file(struct pci_slot *slot, char *buf)
        return bus_speed_read(slot->bus->cur_bus_speed, buf);
 }
 
+static void remove_sysfs_files(struct pci_slot *slot)
+{
+       char func[10];
+       struct list_head *tmp;
+
+       list_for_each(tmp, &slot->bus->devices) {
+               struct pci_dev *dev = pci_dev_b(tmp);
+               if (PCI_SLOT(dev->devfn) != slot->number)
+                       continue;
+               sysfs_remove_link(&dev->dev.kobj, "slot");
+
+               snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn));
+               sysfs_remove_link(&slot->kobj, func);
+       }
+}
+
+static int create_sysfs_files(struct pci_slot *slot)
+{
+       int result;
+       char func[10];
+       struct list_head *tmp;
+
+       list_for_each(tmp, &slot->bus->devices) {
+               struct pci_dev *dev = pci_dev_b(tmp);
+               if (PCI_SLOT(dev->devfn) != slot->number)
+                       continue;
+
+               result = sysfs_create_link(&dev->dev.kobj, &slot->kobj, "slot");
+               if (result)
+                       goto fail;
+
+               snprintf(func, 10, "function%d", PCI_FUNC(dev->devfn));
+               result = sysfs_create_link(&slot->kobj, &dev->dev.kobj, func);
+               if (result)
+                       goto fail;
+       }
+
+       return 0;
+
+fail:
+       remove_sysfs_files(slot);
+       return result;
+}
+
 static void pci_slot_release(struct kobject *kobj)
 {
        struct pci_dev *dev;
@@ -109,6 +153,8 @@ static void pci_slot_release(struct kobject *kobj)
                if (PCI_SLOT(dev->devfn) == slot->number)
                        dev->slot = NULL;
 
+       remove_sysfs_files(slot);
+
        list_del(&slot->list);
 
        kfree(slot);
@@ -300,6 +346,8 @@ placeholder:
        INIT_LIST_HEAD(&slot->list);
        list_add(&slot->list, &parent->slots);
 
+       create_sysfs_files(slot);
+
        list_for_each_entry(dev, &parent->devices, bus_list)
                if (PCI_SLOT(dev->devfn) == slot_nr)
                        dev->slot = slot;