]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: get defaults from iotune group we move disk into
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Wed, 8 Jan 2020 06:49:30 +0000 (09:49 +0300)
committerMichal Privoznik <mprivozn@redhat.com>
Wed, 29 Jan 2020 10:46:58 +0000 (11:46 +0100)
For example if disk is not in the group and we want to move it
there then it makes sense to specify only the group name in API call.
Currently the destination group iotune settings will be overwritten
with the disk settings which I would say is not what one would expect.
Thus let's get defaults from the group we are moving to.

And if we are moving the brand new group then is makes sense to
copy the current disk iotune settings to the group.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_driver.c

index eb4b85a20dfcc766ca325e69b88aca2adb9f15e5..9bf4d99fff6744092cfc23b8ad27ea5de3533573 100644 (file)
@@ -19137,6 +19137,28 @@ qemuDomainSetGroupBlockIoTune(virDomainDefPtr def,
 }
 
 
+static virDomainBlockIoTuneInfoPtr
+qemuDomainFindGroupBlockIoTune(virDomainDefPtr def,
+                               virDomainDiskDefPtr disk,
+                               virDomainBlockIoTuneInfoPtr newiotune)
+{
+    size_t i;
+
+    if (!newiotune->group_name ||
+        STREQ_NULLABLE(disk->blkdeviotune.group_name, newiotune->group_name))
+        return &disk->blkdeviotune;
+
+    for (i = 0; i < def->ndisks; i++) {
+        virDomainDiskDefPtr d = def->disks[i];
+
+        if (STREQ_NULLABLE(newiotune->group_name, d->blkdeviotune.group_name))
+            return &d->blkdeviotune;
+    }
+
+    return &disk->blkdeviotune;
+}
+
+
 static int
 qemuDomainSetBlockIoTune(virDomainPtr dom,
                          const char *path,
@@ -19166,6 +19188,9 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
     virTypedParameterPtr eventParams = NULL;
     int eventNparams = 0;
     int eventMaxparams = 0;
+    virDomainBlockIoTuneInfoPtr cur_info;
+    virDomainBlockIoTuneInfoPtr conf_cur_info;
+
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
                   VIR_DOMAIN_AFFECT_CONFIG, -1);
@@ -19386,7 +19411,9 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
                 goto endjob;
         }
 
-        if (qemuDomainSetBlockIoTuneDefaults(&info, &disk->blkdeviotune,
+        cur_info = qemuDomainFindGroupBlockIoTune(def, disk, &info);
+
+        if (qemuDomainSetBlockIoTuneDefaults(&info, cur_info,
                                              set_fields) < 0)
             goto endjob;
 
@@ -19463,7 +19490,9 @@ qemuDomainSetBlockIoTune(virDomainPtr dom,
             goto endjob;
         }
 
-        if (qemuDomainSetBlockIoTuneDefaults(&conf_info, &conf_disk->blkdeviotune,
+        conf_cur_info = qemuDomainFindGroupBlockIoTune(persistentDef, conf_disk, &info);
+
+        if (qemuDomainSetBlockIoTuneDefaults(&conf_info, conf_cur_info,
                                              set_fields) < 0)
             goto endjob;