Subject: [PATCH 3/7] PCI: Destroy pci dev only once From: Yinghai Lu Mutliple removing via /sys will call pci_destroy_dev two times. Add is_removed to record if pci_destroy_dev is called already. During second calling, still have extra dev ref hold via device_schedule_call, so we are safe to check dev->is_removed. Signed-off-by: Yinghai Lu --- drivers/pci/remove.c | 5 ++++- include/linux/pci.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) Index: linux-2.6/drivers/pci/remove.c =================================================================== --- linux-2.6.orig/drivers/pci/remove.c +++ linux-2.6/drivers/pci/remove.c @@ -22,7 +22,10 @@ static void pci_stop_dev(struct pci_dev static void pci_destroy_dev(struct pci_dev *dev) { - put_device(&dev->dev); + if (!dev->is_removed) { + dev->is_removed = 1; + put_device(&dev->dev); + } } void pci_remove_bus(struct pci_bus *bus) Index: linux-2.6/include/linux/pci.h =================================================================== --- linux-2.6.orig/include/linux/pci.h +++ linux-2.6/include/linux/pci.h @@ -308,6 +308,7 @@ struct pci_dev { unsigned int multifunction:1;/* Part of multi-function device */ /* keep track of device state */ unsigned int is_added:1; + unsigned int is_removed:1; /* pci_destroy_dev is called */ unsigned int is_busmaster:1; /* device is busmaster */ unsigned int no_msi:1; /* device may not use msi */ unsigned int block_cfg_access:1; /* config space access is blocked */