From fab4f0c699d3f0b330060aa3fb2743c6696271de Mon Sep 17 00:00:00 2001 From: Osier Yang Date: Sat, 16 Jul 2011 11:24:49 +0800 Subject: [PATCH] qemu: Fix a regression of attaching device The regression is introduced by Commit da1eba6b, the new codes with this commit doesn't reset "ret" to "-1" when it fails on parsing the device XML (live device attachment) This patch changes the codes to reset the "ret" and "-1", and also changes the codes so that it don't modify "ret" for condition checking. How to reproduce: % cat test.xml % virsh attach-device $domain test.xml Device attached successfully The device attachment failed actually with error "unknown disk type 'oops'", however, it reports success. --- src/qemu/qemu_driver.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 8d146aa8f9..8d54e58a9b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4911,16 +4911,20 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, _("unknown domain modify action %d"), action); break; } - } else - ret = 0; - if (!ret && (flags & VIR_DOMAIN_AFFECT_LIVE)) { + if (ret == -1) + goto endjob; + } + + if (flags & VIR_DOMAIN_AFFECT_LIVE) { /* If dev exists it was created to modify the domain config. Free it. */ virDomainDeviceDefFree(dev); dev = virDomainDeviceDefParse(driver->caps, vm->def, xml, VIR_DOMAIN_XML_INACTIVE); - if (dev == NULL) + if (dev == NULL) { + ret = -1; goto endjob; + } switch (action) { case QEMU_DEVICE_ATTACH: @@ -4935,18 +4939,25 @@ qemuDomainModifyDeviceFlags(virDomainPtr dom, const char *xml, default: qemuReportError(VIR_ERR_INTERNAL_ERROR, _("unknown domain modify action %d"), action); + ret = -1; break; } + + if (ret == -1) + goto endjob; /* * update domain status forcibly because the domain status may be - * changed even if we attach the device failed. For example, a - * For example, a new controller may be created. + * changed even if we failed to attach the device. For example, + * a new controller may be created. */ - if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) + if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) { ret = -1; + goto endjob; + } } + /* Finally, if no error until here, we can save config. */ - if (!ret && (flags & VIR_DOMAIN_AFFECT_CONFIG)) { + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { ret = virDomainSaveConfig(driver->configDir, vmdef); if (!ret) { virDomainObjAssignDef(vm, vmdef, false); -- GitLab