Signed-off-by: Chunyan Liu <cyliu(a)suse.com>
---
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