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 *orig_disk = NULL;
|
||||
virDomainStartupPolicy origStartupPolicy;
|
||||
virDomainDeviceDef oldDev = { .type = dev->type };
|
||||
|
||||
if (!(orig_disk = virDomainDiskByTarget(vm->def, disk->dst))) {
|
||||
|
@ -7047,6 +7048,7 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
|
|||
}
|
||||
|
||||
oldDev.data.disk = orig_disk;
|
||||
origStartupPolicy = orig_disk->startupPolicy;
|
||||
if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
|
||||
VIR_DOMAIN_DEVICE_ACTION_UPDATE,
|
||||
true) < 0)
|
||||
|
@ -7065,13 +7067,20 @@ qemuDomainChangeDiskLive(virDomainObj *vm,
|
|||
return -1;
|
||||
}
|
||||
|
||||
/* update startup policy first before updating disk image */
|
||||
orig_disk->startupPolicy = dev->data.disk->startupPolicy;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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->snapshot = dev->data.disk->snapshot;
|
||||
|
||||
|
|
Loading…
Reference in New Issue