commit caba00f00fb18d8ffc388f4fc8b82527ef98d3b0 Author: Jim Fehlig Date: Wed Jul 6 14:06:37 2016 -0600 virpci: simplify virPCIDeviceBindToStub Early in virPCIDeviceBindToStub, there is a check to see if the stub is already bound to the device, returning success with no further actions if that is the case. The same condition is unnecessarily checked later in the function. Remove the unneeded checks to simplify the logic a bit. Signed-off-by: Jim Fehlig Index: libvirt-2.0.0/src/util/virpci.c =================================================================== --- libvirt-2.0.0.orig/src/util/virpci.c +++ libvirt-2.0.0/src/util/virpci.c @@ -1196,7 +1196,6 @@ static int virPCIDeviceBindToStub(virPCIDevicePtr dev) { int result = -1; - bool reprobe = false; char *stubDriverPath = NULL; char *driverLink = NULL; char *path = NULL; /* reused for different purposes */ @@ -1225,10 +1224,16 @@ virPCIDeviceBindToStub(virPCIDevicePtr d /* The device is already bound to the correct driver */ VIR_DEBUG("Device %s is already bound to %s", dev->name, stubDriverName); + dev->unbind_from_stub = true; + dev->remove_slot = true; result = 0; goto cleanup; } - reprobe = true; + /* + * If the device is bound to a driver that is not the stub, we'll + * need to reprobe later + */ + dev->reprobe = true; } /* Add the PCI device ID to the stub's dynamic ID table; @@ -1249,51 +1254,34 @@ virPCIDeviceBindToStub(virPCIDevicePtr d goto cleanup; } - /* check whether the device is bound to pci-stub when we write dev->id to - * ${stubDriver}/new_id. - */ - if (virFileLinkPointsTo(driverLink, stubDriverPath)) { - dev->unbind_from_stub = true; - dev->remove_slot = true; - result = 0; + if (virPCIDeviceUnbind(dev) < 0) goto remove_id; - } - if (virPCIDeviceUnbind(dev) < 0) + /* Xen's pciback.ko wants you to use new_slot first */ + VIR_FREE(path); + if (!(path = virPCIDriverFile(stubDriverName, "new_slot"))) goto remove_id; - /* If the device was bound to a driver we'll need to reprobe later */ - dev->reprobe = reprobe; + if (virFileExists(path) && virFileWriteStr(path, dev->name, 0) < 0) { + virReportSystemError(errno, + _("Failed to add slot for " + "PCI device '%s' to %s"), + dev->name, stubDriverName); + goto remove_id; + } + dev->remove_slot = true; - /* If the device isn't already bound to pci-stub, try binding it now. - */ - if (!virFileLinkPointsTo(driverLink, stubDriverPath)) { - /* Xen's pciback.ko wants you to use new_slot first */ - VIR_FREE(path); - if (!(path = virPCIDriverFile(stubDriverName, "new_slot"))) - goto remove_id; - - if (virFileExists(path) && virFileWriteStr(path, dev->name, 0) < 0) { - virReportSystemError(errno, - _("Failed to add slot for " - "PCI device '%s' to %s"), - dev->name, stubDriverName); - goto remove_id; - } - dev->remove_slot = true; + VIR_FREE(path); + if (!(path = virPCIDriverFile(stubDriverName, "bind"))) + goto remove_id; - VIR_FREE(path); - if (!(path = virPCIDriverFile(stubDriverName, "bind"))) - goto remove_id; - - if (virFileWriteStr(path, dev->name, 0) < 0) { - virReportSystemError(errno, - _("Failed to bind PCI device '%s' to %s"), - dev->name, stubDriverName); - goto remove_id; - } - dev->unbind_from_stub = true; + if (virFileWriteStr(path, dev->name, 0) < 0) { + virReportSystemError(errno, + _("Failed to bind PCI device '%s' to %s"), + dev->name, stubDriverName); + goto remove_id; } + dev->unbind_from_stub = true; result = 0;