]> xenbits.xensource.com Git - libvirt.git/commitdiff
pci: Make reattach work for unbound devices
authorJiri Denemark <jdenemar@redhat.com>
Wed, 15 Jan 2014 10:44:53 +0000 (11:44 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Mon, 20 Jan 2014 12:58:04 +0000 (13:58 +0100)
https://bugzilla.redhat.com/show_bug.cgi?id=1046919

When a PCI device is not bound to any driver, reattach should just
trigger driver probe rather than failing with

    Invalid device 0000:00:19.0 driver file
    /sys/bus/pci/devices/0000:00:19.0/driver is not a symlink

While virPCIDeviceGetDriverPathAndName was documented to return success
and NULL driver and path when a device is not attached to any driver but
didn't do so. Thus callers could not distinguish unbound devices from
failures.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/util/virpci.c

index 51dbee668b8173f65e726cbd6ccb332a62e20975..8577fd4dc98ef02c06670223abb7904aab51cbd1 100644 (file)
@@ -236,6 +236,11 @@ virPCIDeviceGetDriverPathAndName(virPCIDevicePtr dev, char **path, char **name)
     if (virPCIFile(&drvlink, dev->name, "driver") < 0)
         goto cleanup;
 
+    if (!virFileExists(drvlink)) {
+        ret = 0;
+        goto cleanup;
+    }
+
     if (virFileIsLink(drvlink) != 1) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("Invalid device %s driver file %s is not a symlink"),
@@ -1023,6 +1028,11 @@ virPCIDeviceUnbindFromStub(virPCIDevicePtr dev)
     if (virPCIDeviceGetDriverPathAndName(dev, &drvdir, &driver) < 0)
         goto cleanup;
 
+    if (!driver) {
+        /* The device is not bound to any driver and we are almost done. */
+        goto reprobe;
+    }
+
     if (!dev->unbind_from_stub)
         goto remove_slot;
 
@@ -1079,11 +1089,10 @@ reprobe:
      * available, then re-probing would just cause the device to be
      * re-bound to the stub.
      */
-    if (virPCIDriverFile(&path, driver, "remove_id") < 0) {
+    if (driver && virPCIDriverFile(&path, driver, "remove_id") < 0)
         goto cleanup;
-    }
 
-    if (!virFileExists(drvdir) || virFileExists(path)) {
+    if (!driver || !virFileExists(drvdir) || virFileExists(path)) {
         if (virFileWriteStr(PCI_SYSFS "drivers_probe", dev->name, 0) < 0) {
             virReportSystemError(errno,
                                  _("Failed to trigger a re-probe for PCI device '%s'"),