]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Fix a regression of attaching device
authorOsier Yang <jyang@redhat.com>
Sat, 16 Jul 2011 03:24:49 +0000 (11:24 +0800)
committerOsier Yang <jyang@redhat.com>
Sat, 16 Jul 2011 03:27:34 +0000 (11:27 +0800)
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.

src/qemu/qemu_driver.c

index 8d146aa8f9f1dd47b1bc23580927549708d60aa6..8d54e58a9b6914cfd811f5f9a7ee2cfd705b0040 100644 (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);