]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemuDomainChangeDiskLive: Allow startupPolicy change
authorMichal Privoznik <mprivozn@redhat.com>
Tue, 15 Sep 2015 15:13:01 +0000 (17:13 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 21 Sep 2015 05:57:55 +0000 (07:57 +0200)
https://bugzilla.redhat.com/show_bug.cgi?id=1159219

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c

index e600b949b5811f055cb41e1662ab606a18a46662..e4a88cd02fb79da4d6f53fff4eb4afd047077c81 100644 (file)
@@ -3157,7 +3157,7 @@ qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,
     CHECK_EQ(event_idx, "event_idx", true);
     CHECK_EQ(copy_on_read, "copy_on_read", true);
     CHECK_EQ(snapshot, "snapshot", true);
-    CHECK_EQ(startupPolicy, "startupPolicy", true);
+    /* startupPolicy is allowed to be updated. Therefore not checked here. */
     CHECK_EQ(transient, "transient", true);
     CHECK_EQ(info.bootIndex, "boot order", true);
     CHECK_EQ(rawio, "rawio", true);
index d60745db0a27f03b5a72510531bdfb30b0c0e237..fc3b60d01c012576e538eb420338cb9fd9469405 100644 (file)
@@ -7904,6 +7904,7 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
 {
     virDomainDiskDefPtr disk = dev->data.disk;
     virDomainDiskDefPtr orig_disk = NULL;
+    int startupPolicy;
     int ret = -1;
 
     if (virStorageTranslateDiskSourcePool(conn, disk) < 0)
@@ -7921,23 +7922,29 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
         goto cleanup;
     }
 
+    startupPolicy = orig_disk->startupPolicy;
+
     switch ((virDomainDiskDevice) disk->device) {
     case VIR_DOMAIN_DISK_DEVICE_CDROM:
     case VIR_DOMAIN_DISK_DEVICE_FLOPPY:
         if (!qemuDomainDiskChangeSupported(disk, orig_disk))
             goto cleanup;
 
-        /* Add the new disk src into shared disk hash table */
-        if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
-            goto cleanup;
+        orig_disk->startupPolicy = dev->data.disk->startupPolicy;
 
-        if (qemuDomainChangeEjectableMedia(driver, conn, vm,
-                                           orig_disk, disk->src, force) < 0) {
-            ignore_value(qemuRemoveSharedDisk(driver, disk, vm->def->name));
-            goto cleanup;
-        }
+        if (qemuDomainDiskSourceDiffers(conn, disk, orig_disk)) {
+            /* Add the new disk src into shared disk hash table */
+            if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0)
+                goto cleanup;
 
-        disk->src = NULL;
+            if (qemuDomainChangeEjectableMedia(driver, conn, vm,
+                                               orig_disk, dev->data.disk->src, force) < 0) {
+                ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk, vm->def->name));
+                goto rollback;
+            }
+
+            dev->data.disk->src = NULL;
+        }
         break;
 
     case VIR_DOMAIN_DISK_DEVICE_DISK:
@@ -7956,6 +7963,10 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
     ret = 0;
  cleanup:
     return ret;
+
+ rollback:
+    orig_disk->startupPolicy = startupPolicy;
+    goto cleanup;
 }
 
 static int