Previously, qemuDomainAttachDeviceFlags was doing two things: handling the job and attaching devices. Now the second part is in a new function. This change is required to make it possible to test more complex device attachment situations, like attaching a device to both config and live at once. --- src/qemu/qemu_driver.c | 95 +++++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 656f26c..5be521f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -8065,49 +8065,34 @@ qemuDomainUpdateDeviceConfig(virDomainDefPtr vmdef, return 0; } - static int -qemuDomainAttachDeviceFlags(virDomainPtr dom, - const char *xml, - unsigned int flags) +qemuDomainAttachDeviceLiveAndConfig(virConnectPtr conn, + virDomainObjPtr vm, + virQEMUDriverPtr driver, + const char *xml, + unsigned int flags) { - virQEMUDriverPtr driver = dom->conn->privateData; - virDomainObjPtr vm = NULL; virDomainDefPtr vmdef = NULL; + virQEMUDriverConfigPtr cfg = NULL; virDomainDeviceDefPtr dev = NULL, dev_copy = NULL; int ret = -1; + virCapsPtr caps = NULL; unsigned int parse_flags = VIR_DOMAIN_DEF_PARSE_INACTIVE | VIR_DOMAIN_DEF_PARSE_ABI_UPDATE; - virQEMUDriverConfigPtr cfg = NULL; - virCapsPtr caps = NULL; virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1); - virNWFilterReadLockFilterUpdates(); - cfg = virQEMUDriverGetConfig(driver); if (!(caps = virQEMUDriverGetCapabilities(driver, false))) goto cleanup; - if (!(vm = qemuDomObjFromDomain(dom))) - goto cleanup; - - if (virDomainAttachDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0) - goto cleanup; - - if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) - goto cleanup; - - if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) - goto endjob; - dev = dev_copy = virDomainDeviceDefParse(xml, vm->def, caps, driver->xmlopt, parse_flags); if (dev == NULL) - goto endjob; + goto cleanup; if (flags & VIR_DOMAIN_AFFECT_CONFIG && flags & VIR_DOMAIN_AFFECT_LIVE) { @@ -8117,33 +8102,32 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, */ dev_copy = virDomainDeviceDefCopy(dev, vm->def, caps, driver->xmlopt); if (!dev_copy) - goto endjob; + goto cleanup; } if (flags & VIR_DOMAIN_AFFECT_CONFIG) { /* Make a copy for updated domain. */ vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt); if (!vmdef) - goto endjob; + goto cleanup; if (virDomainDefCompatibleDevice(vmdef, dev, VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0) - goto endjob; - - if ((ret = qemuDomainAttachDeviceConfig(vmdef, dev, dom->conn, caps, + goto cleanup; + if ((ret = qemuDomainAttachDeviceConfig(vmdef, dev, conn, caps, parse_flags, driver->xmlopt)) < 0) - goto endjob; + goto cleanup; } if (flags & VIR_DOMAIN_AFFECT_LIVE) { if (virDomainDefCompatibleDevice(vm->def, dev_copy, VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0) - goto endjob; + goto cleanup; - if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, dom->conn, - dom->conn->privateData)) < 0) - goto endjob; + if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, conn, + driver)) < 0) + goto cleanup; /* * update domain status forcibly because the domain status may be * changed even if we failed to attach the device. For example, @@ -8151,7 +8135,7 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, */ if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) { ret = -1; - goto endjob; + goto cleanup; } } @@ -8164,17 +8148,50 @@ qemuDomainAttachDeviceFlags(virDomainPtr dom, } } - endjob: - qemuDomainObjEndJob(driver, vm); - cleanup: virDomainDefFree(vmdef); if (dev != dev_copy) virDomainDeviceDefFree(dev_copy); virDomainDeviceDefFree(dev); - virDomainObjEndAPI(&vm); - virObjectUnref(caps); virObjectUnref(cfg); + virObjectUnref(caps); + + return ret; +} + +static int +qemuDomainAttachDeviceFlags(virDomainPtr dom, + const char *xml, + unsigned int flags) +{ + virQEMUDriverPtr driver = dom->conn->privateData; + virDomainObjPtr vm = NULL; + int ret = -1; + + virNWFilterReadLockFilterUpdates(); + + if (!(vm = qemuDomObjFromDomain(dom))) + goto cleanup; + + if (virDomainAttachDeviceFlagsEnsureACL(dom->conn, vm->def, flags) < 0) + goto cleanup; + + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_MODIFY) < 0) + goto cleanup; + + if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) + goto endjob; + + if (qemuDomainAttachDeviceLiveAndConfig(dom->conn, vm, driver, xml, flags) < 0) + goto endjob; + + ret = 0; + + endjob: + qemuDomainObjEndJob(driver, vm); + + cleanup: + virDomainObjEndAPI(&vm); virNWFilterUnlockFilterUpdates(); return ret; } -- 1.9.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list