From 70b36a7b7e4835c0fa6de5879fd17102c5ee4f7e Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 16 Sep 2016 16:29:41 +0200 Subject: [PATCH] qemuDomainDefPostParse: Fetch qemuCaps from domain object We can't rely on def->emulator path. It may be provided by user as we give them opportunity to provide their own XML for migration. Therefore the path may point to just whatever binary (or even to a non-existent file). Moreover, this path is meant for destination, but the capabilities lookup is done on source. What we can do is to assume same capabilities for post parse callbacks as the running domain has. They will be used just to add some default models/controllers/devices/... anyway. Signed-off-by: Michal Privoznik --- src/qemu/qemu_domain.c | 16 ++++++++++------ src/qemu/qemu_migration.c | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 6ffec55267..e46bad24cc 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -2327,11 +2327,11 @@ qemuDomainDefPostParse(virDomainDefPtr def, virCapsPtr caps, unsigned int parseFlags, void *opaque, - void *parseOpaque ATTRIBUTE_UNUSED) + void *parseOpaque) { virQEMUDriverPtr driver = opaque; virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); - virQEMUCapsPtr qemuCaps = NULL; + virQEMUCapsPtr qemuCaps = parseOpaque; int ret = -1; if (def->os.bootloader || def->os.bootloaderArgs) { @@ -2360,10 +2360,14 @@ qemuDomainDefPostParse(virDomainDefPtr def, !(def->emulator = virDomainDefGetDefaultEmulator(def, caps))) goto cleanup; - if (!(qemuCaps = virQEMUCapsCacheLookup(caps, - driver->qemuCapsCache, - def->emulator))) - goto cleanup; + if (qemuCaps) { + virObjectRef(qemuCaps); + } else { + if (!(qemuCaps = virQEMUCapsCacheLookup(caps, + driver->qemuCapsCache, + def->emulator))) + goto cleanup; + } if (qemuDomainDefAddDefaultDevices(def, qemuCaps) < 0) goto cleanup; diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index df48eab4a6..e2ca3303ef 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -3242,7 +3242,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver, } if (xmlin) { - if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, NULL, + if (!(def = virDomainDefParseString(xmlin, caps, driver->xmlopt, priv->qemuCaps, VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE))) goto cleanup;