From 536862d41ed96ec17bbcbaddbaad1bac88ed0d60 Mon Sep 17 00:00:00 2001 Message-Id: <536862d41ed96ec17bbcbaddbaad1bac88ed0d60.1390394206.git.jdenemar@redhat.com> From: Jiri Denemark Date: Mon, 20 Jan 2014 14:41:11 +0100 Subject: [PATCH] pci: Make reattach work for unbound devices 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 (cherry picked from commit c982e5e84f47d3e71d794bb034ef2489091f41c6) --- src/util/virpci.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/util/virpci.c b/src/util/virpci.c index 39bbac8..b48e433 100644 --- a/src/util/virpci.c +++ b/src/util/virpci.c @@ -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"), @@ -991,6 +996,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; @@ -1047,11 +1057,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'"), -- 1.8.5.3