[libvirt] [PATCH 0/3] qemu: Allow update of certain disk options during runtime

Until this series it was possible to update floppies and cdroms only. With this you can update startup policy and snapshot behavior for regular disks too. Peter Krempa (3): qemu: driver: Move around code to avoid need to rollback qemu: driver: Remove unnecessary cleanup label from qemuDomainChangeDiskLive qemu: driver: Allow disk update of startupPolicy/snapshot for all disks src/qemu/qemu_driver.c | 74 ++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) -- 2.8.2

qemuDomainChangeDiskLive rolled back few changes to the disk definition if changing of the media failed. This can be avoided by moving some code around. --- src/qemu/qemu_driver.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 249393a..895e926 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7655,8 +7655,6 @@ qemuDomainChangeDiskLive(virConnectPtr conn, { virDomainDiskDefPtr disk = dev->data.disk; virDomainDiskDefPtr orig_disk = NULL; - int startupPolicy; - int snapshot; int ret = -1; if (virStorageTranslateDiskSourcePool(conn, disk) < 0) @@ -7674,18 +7672,12 @@ qemuDomainChangeDiskLive(virConnectPtr conn, goto cleanup; } - startupPolicy = orig_disk->startupPolicy; - snapshot = orig_disk->snapshot; - switch ((virDomainDiskDevice) disk->device) { case VIR_DOMAIN_DISK_DEVICE_CDROM: case VIR_DOMAIN_DISK_DEVICE_FLOPPY: if (!qemuDomainDiskChangeSupported(disk, orig_disk)) goto cleanup; - orig_disk->startupPolicy = dev->data.disk->startupPolicy; - orig_disk->snapshot = dev->data.disk->snapshot; - if (qemuDomainDiskSourceDiffers(disk, orig_disk)) { /* Add the new disk src into shared disk hash table */ if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0) @@ -7696,11 +7688,14 @@ qemuDomainChangeDiskLive(virConnectPtr conn, force) < 0) { ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk, vm->def->name)); - goto rollback; + goto cleanup; } dev->data.disk->src = NULL; } + + orig_disk->startupPolicy = dev->data.disk->startupPolicy; + orig_disk->snapshot = dev->data.disk->snapshot; break; case VIR_DOMAIN_DISK_DEVICE_DISK: @@ -7719,11 +7714,6 @@ qemuDomainChangeDiskLive(virConnectPtr conn, ret = 0; cleanup: return ret; - - rollback: - orig_disk->snapshot = snapshot; - orig_disk->startupPolicy = startupPolicy; - goto cleanup; } static int -- 2.8.2

--- src/qemu/qemu_driver.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 895e926..6f5712d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7655,13 +7655,12 @@ qemuDomainChangeDiskLive(virConnectPtr conn, { virDomainDiskDefPtr disk = dev->data.disk; virDomainDiskDefPtr orig_disk = NULL; - int ret = -1; if (virStorageTranslateDiskSourcePool(conn, disk) < 0) - goto cleanup; + return -1; if (qemuDomainDetermineDiskChain(driver, vm, disk, false, true) < 0) - goto cleanup; + return -1; if (!(orig_disk = virDomainDiskFindByBusAndDst(vm->def, disk->bus, disk->dst))) { @@ -7669,26 +7668,26 @@ qemuDomainChangeDiskLive(virConnectPtr conn, _("No device with bus '%s' and target '%s'"), virDomainDiskBusTypeToString(disk->bus), disk->dst); - goto cleanup; + return -1; } switch ((virDomainDiskDevice) disk->device) { case VIR_DOMAIN_DISK_DEVICE_CDROM: case VIR_DOMAIN_DISK_DEVICE_FLOPPY: if (!qemuDomainDiskChangeSupported(disk, orig_disk)) - goto cleanup; + return -1; if (qemuDomainDiskSourceDiffers(disk, orig_disk)) { /* Add the new disk src into shared disk hash table */ if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0) - goto cleanup; + return -1; if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk, dev->data.disk->src, force) < 0) { ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk, vm->def->name)); - goto cleanup; + return -1; } dev->data.disk->src = NULL; @@ -7703,7 +7702,7 @@ qemuDomainChangeDiskLive(virConnectPtr conn, virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("disk bus '%s' cannot be updated."), virDomainDiskBusTypeToString(disk->bus)); - goto cleanup; + return -1; break; case VIR_DOMAIN_DISK_DEVICE_LAST: @@ -7711,9 +7710,7 @@ qemuDomainChangeDiskLive(virConnectPtr conn, break; } - ret = 0; - cleanup: - return ret; + return 0; } static int -- 2.8.2

On 25.05.2016 07:48, Peter Krempa wrote:
--- src/qemu/qemu_driver.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 895e926..6f5712d 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7655,13 +7655,12 @@ qemuDomainChangeDiskLive(virConnectPtr conn, { virDomainDiskDefPtr disk = dev->data.disk; virDomainDiskDefPtr orig_disk = NULL; - int ret = -1;
if (virStorageTranslateDiskSourcePool(conn, disk) < 0) - goto cleanup; + return -1;
There's nothing technically wrong with this patch. But the thing is, I like it this way. I think it's more future-proof. For instance, if we ever alloc something here, or we want to return a different value or something. Michal

The libvirt internal bits can be changed for disks that don't otherwise support changing media. Remove the switch statement and allow changes of non-source data for all disks. --- src/qemu/qemu_driver.c | 55 +++++++++++++++++++++----------------------------- 1 file changed, 23 insertions(+), 32 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6f5712d..592be84 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7671,45 +7671,36 @@ qemuDomainChangeDiskLive(virConnectPtr conn, return -1; } - switch ((virDomainDiskDevice) disk->device) { - case VIR_DOMAIN_DISK_DEVICE_CDROM: - case VIR_DOMAIN_DISK_DEVICE_FLOPPY: - if (!qemuDomainDiskChangeSupported(disk, orig_disk)) - return -1; - - if (qemuDomainDiskSourceDiffers(disk, orig_disk)) { - /* Add the new disk src into shared disk hash table */ - if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0) - return -1; - - if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk, - dev->data.disk->src, - force) < 0) { - ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk, - vm->def->name)); - return -1; - } + if (!qemuDomainDiskChangeSupported(disk, orig_disk)) + return -1; - dev->data.disk->src = NULL; + if (qemuDomainDiskSourceDiffers(disk, orig_disk)) { + /* Disk source can be changed only for removable devices */ + if (disk->device != VIR_DOMAIN_DISK_DEVICE_CDROM && + disk->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("disk source can be changed only in removable " + "drives")); + return -1; } - orig_disk->startupPolicy = dev->data.disk->startupPolicy; - orig_disk->snapshot = dev->data.disk->snapshot; - break; + /* Add the new disk src into shared disk hash table */ + if (qemuAddSharedDevice(driver, dev, vm->def->name) < 0) + return -1; - case VIR_DOMAIN_DISK_DEVICE_DISK: - case VIR_DOMAIN_DISK_DEVICE_LUN: - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, - _("disk bus '%s' cannot be updated."), - virDomainDiskBusTypeToString(disk->bus)); - return -1; - break; + if (qemuDomainChangeEjectableMedia(driver, vm, orig_disk, + dev->data.disk->src, force) < 0) { + ignore_value(qemuRemoveSharedDisk(driver, dev->data.disk, + vm->def->name)); + return -1; + } - case VIR_DOMAIN_DISK_DEVICE_LAST: - /* nada */ - break; + dev->data.disk->src = NULL; } + orig_disk->startupPolicy = dev->data.disk->startupPolicy; + orig_disk->snapshot = dev->data.disk->snapshot; + return 0; } -- 2.8.2

On 25.05.2016 07:48, Peter Krempa wrote:
Until this series it was possible to update floppies and cdroms only. With this you can update startup policy and snapshot behavior for regular disks too.
Peter Krempa (3): qemu: driver: Move around code to avoid need to rollback qemu: driver: Remove unnecessary cleanup label from qemuDomainChangeDiskLive qemu: driver: Allow disk update of startupPolicy/snapshot for all disks
src/qemu/qemu_driver.c | 74 ++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-)
ACK to 1 and 3. Michal
participants (2)
-
Michal Privoznik
-
Peter Krempa