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
<disk type='oops' device='disk'>
  <driver name='qemu' type='raw'/>
  <source file='/var/lib/libvirt/images/test.img'/>
  <target dev='vda' bus='virtio'/>
</disk>

% virsh attach-device $domain test.xml
Device attached successfully

The device attachment failed actually with error "unknown disk type 'oops'",
however, it reports success.
This commit is contained in:
Osier Yang 2011-07-16 11:24:49 +08:00
parent 703d4ed594
commit fab4f0c699

View File

@ -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);