edev->mode |= EEH_DEV_DISCONNECTED;
        (*removed)++;
 
+       pci_lock_rescan_remove();
        pci_stop_and_remove_bus_device(dev);
+       pci_unlock_rescan_remove();
 
        return NULL;
 }
         * into pcibios_add_pci_devices().
         */
        eeh_pe_state_mark(pe, EEH_PE_KEEP);
-       if (bus)
+       if (bus) {
+               pci_lock_rescan_remove();
                pcibios_remove_pci_devices(bus);
-       else if (frozen_bus)
+               pci_unlock_rescan_remove();
+       } else if (frozen_bus) {
                eeh_pe_dev_traverse(pe, eeh_rmv_device, &removed);
+       }
 
        /* Reset the pci controller. (Asserts RST#; resets config space).
         * Reconfigure bridges and devices. Don't try to bring the system
        if (rc)
                return rc;
 
+       pci_lock_rescan_remove();
+
        /* Restore PE */
        eeh_ops->configure_bridge(pe);
        eeh_pe_restore_bars(pe);
        pe->tstamp = tstamp;
        pe->freeze_count = cnt;
 
+       pci_unlock_rescan_remove();
        return 0;
 }
 
        eeh_pe_dev_traverse(pe, eeh_report_failure, NULL);
 
        /* Shut down the device drivers for good. */
-       if (frozen_bus)
+       if (frozen_bus) {
+               pci_lock_rescan_remove();
                pcibios_remove_pci_devices(frozen_bus);
+               pci_unlock_rescan_remove();
+       }
 }
 
 static void eeh_handle_special_event(void)
        if (rc == 2 || rc == 1)
                eeh_handle_normal_event(pe);
        else {
+               pci_lock_rescan_remove();
                list_for_each_entry_safe(hose, tmp,
                        &hose_list, list_node) {
                        phb_pe = eeh_phb_pe_get(hose);
                        eeh_pe_dev_traverse(pe, eeh_report_failure, NULL);
                        pcibios_remove_pci_devices(bus);
                }
+               pci_unlock_rescan_remove();
        }
 }