提交 fbe4a458 编写于 作者: J John Ferlan

lxc: Rearrange order in lxcDomainUpdateDeviceFlags

Although commit e3497f3f noted that the LIVE option doesn't
matter and removed the call to virDomainDefCompatibleDevice,
it didn't go quite far enough and change the order of the checks
and rework the code to just handle the config change causing
a failure after virDomainObjUpdateModificationImpact updates
the @flags. Since we only support config a lot of previously
conditional code is now just inlined.
Signed-off-by: NJohn Ferlan <jferlan@redhat.com>
ACKed-by: NMichal Prívozník <mprivozn@redhat.com>
上级 6ab0632b
...@@ -4827,7 +4827,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom, ...@@ -4827,7 +4827,7 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
virCapsPtr caps = NULL; virCapsPtr caps = NULL;
virDomainObjPtr vm = NULL; virDomainObjPtr vm = NULL;
virDomainDefPtr vmdef = NULL; virDomainDefPtr vmdef = NULL;
virDomainDeviceDefPtr dev = NULL, dev_copy = NULL; virDomainDeviceDefPtr dev = NULL;
int ret = -1; int ret = -1;
virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver); virLXCDriverConfigPtr cfg = virLXCDriverGetConfig(driver);
...@@ -4846,61 +4846,40 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom, ...@@ -4846,61 +4846,40 @@ static int lxcDomainUpdateDeviceFlags(virDomainPtr dom,
if (virDomainObjUpdateModificationImpact(vm, &flags) < 0) if (virDomainObjUpdateModificationImpact(vm, &flags) < 0)
goto endjob; goto endjob;
if (!(caps = virLXCDriverGetCapabilities(driver, false))) if (flags & VIR_DOMAIN_AFFECT_LIVE) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("Unable to modify live devices"));
goto endjob; goto endjob;
}
dev = dev_copy = virDomainDeviceDefParse(xml, vm->def, if (!(caps = virLXCDriverGetCapabilities(driver, false)))
caps, driver->xmlopt,
VIR_DOMAIN_DEF_PARSE_INACTIVE);
if (dev == NULL)
goto endjob; goto endjob;
if (flags & VIR_DOMAIN_AFFECT_CONFIG && if (!(dev = virDomainDeviceDefParse(xml, vm->def, caps, driver->xmlopt,
flags & VIR_DOMAIN_AFFECT_LIVE) { VIR_DOMAIN_DEF_PARSE_INACTIVE)))
/* If we are affecting both CONFIG and LIVE goto endjob;
* create a deep copy of device as adding
* to CONFIG takes one instance.
*/
dev_copy = virDomainDeviceDefCopy(dev, vm->def,
caps, driver->xmlopt);
if (!dev_copy)
goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
/* Make a copy for updated domain. */
vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt);
if (!vmdef)
goto endjob;
/* virDomainDefCompatibleDevice call is delayed until we know the /* Make a copy for updated domain. */
* device we're going to update. */ if (!(vmdef = virDomainObjCopyPersistentDef(vm, caps, driver->xmlopt)))
if ((ret = lxcDomainUpdateDeviceConfig(vmdef, dev)) < 0) goto endjob;
goto endjob;
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) { /* virDomainDefCompatibleDevice call is delayed until we know the
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", * device we're going to update. */
_("Unable to modify live devices")); if (lxcDomainUpdateDeviceConfig(vmdef, dev) < 0)
goto endjob;
if (virDomainSaveConfig(cfg->configDir, driver->caps, vmdef) < 0)
goto endjob; goto endjob;
}
/* Finally, if no error until here, we can save config. */ virDomainObjAssignDef(vm, vmdef, false, NULL);
if (flags & VIR_DOMAIN_AFFECT_CONFIG) { vmdef = NULL;
ret = virDomainSaveConfig(cfg->configDir, driver->caps, vmdef); ret = 0;
if (!ret) {
virDomainObjAssignDef(vm, vmdef, false, NULL);
vmdef = NULL;
}
}
endjob: endjob:
virLXCDomainObjEndJob(driver, vm); virLXCDomainObjEndJob(driver, vm);
cleanup: cleanup:
virDomainDefFree(vmdef); virDomainDefFree(vmdef);
if (dev != dev_copy)
virDomainDeviceDefFree(dev_copy);
virDomainDeviceDefFree(dev); virDomainDeviceDefFree(dev);
virDomainObjEndAPI(&vm); virDomainObjEndAPI(&vm);
virObjectUnref(caps); virObjectUnref(caps);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册