mirror of https://gitee.com/openkylin/libvirt.git
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:
parent
526f2900bc
commit
7e23272e35
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue