/* PCI-to-PCI bridge device */
        struct pci_dev *pci_dev;
+
+       bool is_going_away;
 };
 
 
 /* slot flags */
 
 #define SLOT_ENABLED           (0x00000001)
+#define SLOT_IS_GOING_AWAY     (0x00000002)
 
 /* function flags */
 
 typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data);
 
 int acpiphp_enable_slot(struct acpiphp_slot *slot);
-int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot);
+int acpiphp_disable_slot(struct acpiphp_slot *slot);
 u8 acpiphp_get_power_status(struct acpiphp_slot *slot);
 u8 acpiphp_get_attention_status(struct acpiphp_slot *slot);
 u8 acpiphp_get_latch_status(struct acpiphp_slot *slot);
 
                                        pr_err("failed to remove notify handler\n");
                        }
                }
+               slot->flags |= SLOT_IS_GOING_AWAY;
                if (slot->slot)
                        acpiphp_unregister_hotplug_slot(slot);
        }
        mutex_lock(&bridge_mutex);
        list_del(&bridge->list);
        mutex_unlock(&bridge_mutex);
+
+       bridge->is_going_away = true;
 }
 
 /**
 {
        struct acpiphp_slot *slot;
 
+       /* Bail out if the bridge is going away. */
+       if (bridge->is_going_away)
+               return;
+
        list_for_each_entry(slot, &bridge->slots, node) {
                struct pci_bus *bus = slot->bus;
                struct pci_dev *dev, *tmp;
        }
 }
 
+static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot);
+
 static void hotplug_event(acpi_handle handle, u32 type, void *data)
 {
        struct acpiphp_context *context = data;
                } else {
                        struct acpiphp_slot *slot = func->slot;
 
+                       if (slot->flags & SLOT_IS_GOING_AWAY)
+                               break;
+
                        mutex_lock(&slot->crit_sect);
                        enable_slot(slot);
                        mutex_unlock(&slot->crit_sect);
                        struct acpiphp_slot *slot = func->slot;
                        int ret;
 
+                       if (slot->flags & SLOT_IS_GOING_AWAY)
+                               break;
+
                        /*
                         * Check if anything has changed in the slot and rescan
                         * from the parent if that's the case.
        acpi_handle handle = context->handle;
 
        acpi_scan_lock_acquire();
+       pci_lock_rescan_remove();
 
        hotplug_event(handle, type, context);
 
+       pci_unlock_rescan_remove();
        acpi_scan_lock_release();
        acpi_evaluate_hotplug_ost(handle, type, ACPI_OST_SC_SUCCESS, NULL);
        put_bridge(context->func.parent);
  */
 int acpiphp_enable_slot(struct acpiphp_slot *slot)
 {
+       pci_lock_rescan_remove();
+
+       if (slot->flags & SLOT_IS_GOING_AWAY)
+               return -ENODEV;
+
        mutex_lock(&slot->crit_sect);
        /* configure all functions */
        if (!(slot->flags & SLOT_ENABLED))
                enable_slot(slot);
 
        mutex_unlock(&slot->crit_sect);
+
+       pci_unlock_rescan_remove();
        return 0;
 }
 
  * acpiphp_disable_and_eject_slot - power off and eject slot
  * @slot: ACPI PHP slot
  */
-int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot)
+static int acpiphp_disable_and_eject_slot(struct acpiphp_slot *slot)
 {
        struct acpiphp_func *func;
-       int retval = 0;
+
+       if (slot->flags & SLOT_IS_GOING_AWAY)
+               return -ENODEV;
 
        mutex_lock(&slot->crit_sect);
 
                }
 
        mutex_unlock(&slot->crit_sect);
-       return retval;
+       return 0;
 }
 
+int acpiphp_disable_slot(struct acpiphp_slot *slot)
+{
+       int ret;
+
+       pci_lock_rescan_remove();
+       ret = acpiphp_disable_and_eject_slot(slot);
+       pci_unlock_rescan_remove();
+       return ret;
+}
 
 /*
  * slot enabled:  1
        return (slot->flags & SLOT_ENABLED);
 }
 
-
 /*
  * latch   open:  1
  * latch closed:  0
        return !(get_slot_status(slot) & ACPI_STA_DEVICE_UI);
 }
 
-
 /*
  * adapter presence : 1
  *          absence : 0