The libvirt internal bits can be changed for disks that don't otherwise
support changing media. Remove the switch statement and allow changes of
non-source data for all disks.
---
 src/qemu/qemu_driver.c | 55 +++++++++++++++++++++-----------------------------
 1 file changed, 23 insertions(+), 32 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 6f5712d..592be84 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -7671,45 +7671,36 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
         return -1;
     }

-    switch ((virDomainDiskDevice) disk->device) {
-    case VIR_DOMAIN_DISK_DEVICE_CDROM:
-    case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
-        if (!qemuDomainDiskChangeSupported(disk, orig_disk))
-            return -1;
-
-        if (qemuDomainDiskSourceDiffers(disk, orig_disk)) {
-            /* Add the new disk src into shared disk hash table */
-            if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
-                return -1;
-
-            if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk,
-                                               dev->data.disk->src,
-                                               force) < 0) {
-                ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk,
-                                                  vm->def->name));
-                return -1;
-            }
+    if (!qemuDomainDiskChangeSupported(disk, orig_disk))
+        return -1;

-            dev->data.disk->src = NULL;
+    if (qemuDomainDiskSourceDiffers(disk, orig_disk)) {
+        /* Disk source can be changed only for removable devices */
+        if (disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM &&
+            disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("disk source can be changed only in removable "
+                             "drives"));
+            return -1;
         }

-        orig_disk->startupPolicy = dev->data.disk->startupPolicy;
-        orig_disk->snapshot = dev->data.disk->snapshot;
-        break;
+        /* Add the new disk src into shared disk hash table */
+        if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
+            return -1;

-    case VIR_DOMAIN_DISK_DEVICE_DISK:
-    case VIR_DOMAIN_DISK_DEVICE_LUN:
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
-                       _("disk bus '%s' cannot be updated."),
-                       virDomainDiskBusTypeToString(disk->bus));
-        return -1;
-        break;
+        if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk,
+                                           dev->data.disk->src, force) < 0) {
+            ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk,
+                                              vm->def->name));
+            return -1;
+        }

-    case VIR_DOMAIN_DISK_DEVICE_LAST:
-        /* nada */
-        break;
+        dev->data.disk->src = NULL;
     }

+    orig_disk->startupPolicy = dev->data.disk->startupPolicy;
+    orig_disk->snapshot = dev->data.disk->snapshot;
+
     return 0;
 }

-- 
2.8.2

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to