qemuDomainChangeDiskLive: Modify 'startupPolicy' before changing source

We don't support all startup policies with all source types so to
correctly allow switching from a 'file' based cdrom with 'optional'
startup policy to a 'block' based one which doesn't support optional we
must update the startup policy field first. Obviously we need to have
fallback if the update fails.

Reported-by: Vojtech Juranek <vjuranek@redhat.com>
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Peter Krempa 2021-09-10 15:33:17 +02:00
parent 526f2900bc
commit 7e23272e35

View File

@ -7038,6 +7038,7 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
{ {
virDomainDiskDef *disk = dev->data.disk; virDomainDiskDef *disk = dev->data.disk;
virDomainDiskDef *orig_disk = NULL; virDomainDiskDef *orig_disk = NULL;
virDomainStartupPolicy origStartupPolicy;
virDomainDeviceDef oldDev = { .type = dev->type }; virDomainDeviceDef oldDev = { .type = dev->type };
if (!(orig_disk = virDomainDiskByTarget(vm->def, disk->dst))) { if (!(orig_disk = virDomainDiskByTarget(vm->def, disk->dst))) {
@ -7047,6 +7048,7 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
} }
oldDev.data.disk = orig_disk; oldDev.data.disk = orig_disk;
origStartupPolicy = orig_disk->startupPolicy;
if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev, if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
VIR_DOMAIN_DEVICE_ACTION_UPDATE, VIR_DOMAIN_DEVICE_ACTION_UPDATE,
true) < 0) true) < 0)
@ -7065,13 +7067,20 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
return -1; return -1;
} }
/* update startup policy first before updating disk image */
orig_disk->startupPolicy = dev->data.disk->startupPolicy;
if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk, if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk,
dev->data.disk->src, force) < 0) dev->data.disk->src, force) < 0) {
/* revert startup policy before failing */
orig_disk->startupPolicy = origStartupPolicy;
return -1; return -1;
}
dev->data.disk->src = NULL; dev->data.disk->src = NULL;
} }
/* in case when we aren't updating disk source we update startup policy here */
orig_disk->startupPolicy = dev->data.disk->startupPolicy; orig_disk->startupPolicy = dev->data.disk->startupPolicy;
orig_disk->snapshot = dev->data.disk->snapshot; orig_disk->snapshot = dev->data.disk->snapshot;