[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCHv6 4/7] Implement virDomain{Set, Get}BlockIoTune for the qemu driver



On 11/23/2011 02:44 PM, Eric Blake wrote:
> From: Lei Li <lilei linux vnet ibm com>
> 
> Implement the block I/O throttle setting and getting support to qemu
> driver.
> 
> Signed-off-by: Lei Li <lilei linux vnet ibm com>
> Signed-off-by: Zhi Yong Wu <wuzhy linux vnet ibm com>
> Signed-off-by: Eric Blake <eblake redhat com>

> +qemuDomainSetBlockIoTune(virDomainPtr dom,
> +                         const char *disk,
> +                         virTypedParameterPtr params,
> +                         int nparams,
> +                         unsigned int flags)
> +{

> +
> +    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> +        if (!vm->persistent) {
> +            qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                            _("cannot change persistent config of a transient domain"));
> +            goto endjob;
> +        }
> +        if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm)))
> +            goto endjob;
> +    }
> +

> +
> +    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
> +        sa_assert(persistentDef);
> +        int idx = virDomainDiskIndexByName(vm->def, disk, true);

Oops - this should be on persistentDef, not vm->def.

> +        if (i < 0)
> +            goto endjob;
> +        persistentDef->disks[idx]->blkdeviotune = info;

And this assignment should be delayed...

> +    }
> +
> +    if (flags & VIR_DOMAIN_AFFECT_LIVE) {
> +        priv = vm->privateData;
> +        qemuDomainObjEnterMonitorWithDriver(driver, vm);
> +        ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, &info);
> +        qemuDomainObjExitMonitorWithDriver(driver, vm);
> +    }
> +
> +    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {

to here, after we know the live change (if any) took place.  Not to
mention that we must not get here if the live change failed.  Here's
what I'm squashing in:

diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c
index 698a961..ce4cba1 100644
--- i/src/qemu/qemu_driver.c
+++ w/src/qemu/qemu_driver.c
@@ -11080,6 +11080,7 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
     int ret = -1;
     int i;
     bool isActive;
+    int idx = -1;

     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -11126,6 +11127,9 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
         }
         if (!(persistentDef =
virDomainObjGetPersistentDef(driver->caps, vm)))
             goto endjob;
+        idx = virDomainDiskIndexByName(persistentDef, disk, true);
+        if (i < 0)
+            goto endjob;
     }

     for (i = 0; i < nparams; i++) {
@@ -11177,22 +11181,18 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
         goto endjob;
     }

-    if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
-        sa_assert(persistentDef);
-        int idx = virDomainDiskIndexByName(vm->def, disk, true);
-        if (i < 0)
-            goto endjob;
-        persistentDef->disks[idx]->blkdeviotune = info;
-    }
-
     if (flags & VIR_DOMAIN_AFFECT_LIVE) {
         priv = vm->privateData;
         qemuDomainObjEnterMonitorWithDriver(driver, vm);
         ret = qemuMonitorSetBlockIoThrottle(priv->mon, device, &info);
         qemuDomainObjExitMonitorWithDriver(driver, vm);
     }
+    if (ret < 0)
+        goto endjob;

     if (flags & VIR_DOMAIN_AFFECT_CONFIG) {
+        sa_assert(persistentDef && idx >= 0);
+        persistentDef->disks[idx]->blkdeviotune = info;
         ret = virDomainSaveConfig(driver->configDir, persistentDef);
         if (ret < 0) {
             qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]