ret = zpci_enable_device(zdev);
                if (ret)
                        break;
+               pci_lock_rescan_remove();
                pci_rescan_bus(zdev->bus);
+               pci_unlock_rescan_remove();
                break;
        case 0x0302: /* Reserved -> Standby */
                if (!zdev)
                break;
        case 0x0303: /* Deconfiguration requested */
                if (pdev)
-                       pci_stop_and_remove_bus_device(pdev);
+                       pci_stop_and_remove_bus_device_locked(pdev);
 
                ret = zpci_disable_device(zdev);
                if (ret)
                        /* Give the driver a hint that the function is
                         * already unusable. */
                        pdev->error_state = pci_channel_io_perm_failure;
-                       pci_stop_and_remove_bus_device(pdev);
+                       pci_stop_and_remove_bus_device_locked(pdev);
                }
 
                zdev->fh = ccdf->fh;
 
        if (!device_remove_file_self(dev, attr))
                return count;
 
+       pci_lock_rescan_remove();
        pci_stop_and_remove_bus_device(pdev);
        ret = zpci_disable_device(zdev);
        if (ret)
-               return ret;
+               goto error;
 
        ret = zpci_enable_device(zdev);
        if (ret)
-               return ret;
+               goto error;
 
        pci_rescan_bus(zdev->bus);
+       pci_unlock_rescan_remove();
+
        return count;
+
+error:
+       pci_unlock_rescan_remove();
+       return ret;
 }
 static DEVICE_ATTR_WO(recover);