s390/pci: use pci_rescan_remove_lock
authorSebastian Ott <sebott@linux.vnet.ibm.com>
Tue, 28 Jul 2015 17:14:51 +0000 (19:14 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 29 Jul 2015 07:11:56 +0000 (09:11 +0200)
Make sure that we use the pci_rescan_remove_lock when we remove
or add functions from/to the bus.

Reviewed-by: Gerald Schaefer <gerald.schaefer@de.ibm.com>
Signed-off-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/pci/pci_event.c
arch/s390/pci/pci_sysfs.c

index eef76f0..369a3e0 100644 (file)
@@ -87,7 +87,9 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                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)
@@ -95,7 +97,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                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)
@@ -112,7 +114,7 @@ static void __zpci_event_availability(struct zpci_ccdf_avail *ccdf)
                        /* 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;
index dad920f..f37a580 100644 (file)
@@ -44,17 +44,24 @@ static ssize_t recover_store(struct device *dev, struct device_attribute *attr,
        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);