diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index e600b949b5811f055cb41e1662ab606a18a46662..e4a88cd02fb79da4d6f53fff4eb4afd047077c81 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -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); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d60745db0a27f03b5a72510531bdfb30b0c0e237..fc3b60d01c012576e538eb420338cb9fd9469405 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -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