Signed-off-by: Chunyan Liu <cyliu@xxxxxxxx> --- src/qemu/qemu_hostdev.c | 27 +++++++++++++++++++-------- 1 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c index 6be58ef..4a36417 100644 --- a/src/qemu/qemu_hostdev.c +++ b/src/qemu/qemu_hostdev.c @@ -473,10 +473,17 @@ cleanup: return ret; } - +/* @oldStateDir: + * For upgrade purpose: + * To an existing VM on QEMU, the hostdev netconfig file is originally stored + * in cfg->stateDir (/var/run/libvirt/qemu). Switch to new version, it uses new + * location (hostdev_mgr->stateDir) but certainly will not find it. In this + * case, try to find in the old state dir. + */ static int qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, - char *stateDir) + char *stateDir, + char *oldStateDir) { char *linkdev = NULL; virNetDevVPortProfilePtr virtPort; @@ -511,8 +518,11 @@ qemuDomainHostdevNetConfigRestore(virDomainHostdevDefPtr hostdev, ret = qemuDomainHostdevNetConfigVirtPortProfile(linkdev, vf, virtPort, &hostdev->parent.data.net->mac, NULL, port_profile_associate); - else + else { ret = virNetDevRestoreNetConfig(linkdev, vf, stateDir); + if (ret < 0 && oldStateDir != NULL) + ret = virNetDevRestoreNetConfig(linkdev, vf, oldStateDir); + } VIR_FREE(linkdev); @@ -666,7 +676,6 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, int last_processed_hostdev_vf = -1; size_t i; int ret = -1; - virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virHostdevManagerPtr hostdev_mgr; if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps)) @@ -755,7 +764,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver, if (hostdev->parent.type == VIR_DOMAIN_DEVICE_NET && hostdev->parent.data.net) { if (qemuDomainHostdevNetConfigReplace(hostdev, uuid, - cfg->stateDir) < 0) { + hostdev_mgr->stateDir) < 0) { goto resetvfnetconfig; } } @@ -839,7 +848,8 @@ inactivedevs: resetvfnetconfig: for (i = 0; last_processed_hostdev_vf != -1 && i < last_processed_hostdev_vf; i++) - qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir); + qemuDomainHostdevNetConfigRestore(hostdevs[i], hostdev_mgr->stateDir, + NULL); reattachdevs: for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { @@ -857,7 +867,6 @@ cleanup: virObjectUnlock(hostdev_mgr->inactivePciHostdevs); virObjectUnref(pcidevs); out: - virObjectUnref(cfg); return ret; } @@ -1282,6 +1291,7 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, virPCIDeviceListPtr pcidevs; size_t i; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); + char *oldStateDir = cfg->stateDir; virHostdevManagerPtr hostdev_mgr; hostdev_mgr = virHostdevManagerGetDefault(); @@ -1336,7 +1346,8 @@ qemuDomainReAttachHostdevDevices(virQEMUDriverPtr driver, * reset and reattach device */ for (i = 0; i < nhostdevs; i++) - qemuDomainHostdevNetConfigRestore(hostdevs[i], cfg->stateDir); + qemuDomainHostdevNetConfigRestore(hostdevs[i], hostdev_mgr->stateDir, + oldStateDir); for (i = 0; i < virPCIDeviceListCount(pcidevs); i++) { virPCIDevicePtr dev = virPCIDeviceListGet(pcidevs, i); -- 1.6.0.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list