[libvirt] [PATCH v2 7/7] qemuDomainChangeDiskLive: Allow startupPolicy change

John Ferlan jferlan at redhat.com
Fri Sep 18 20:47:54 UTC 2015



On 09/16/2015 05:15 AM, Michal Privoznik wrote:
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
>  src/qemu/qemu_domain.c |  1 -
>  src/qemu/qemu_driver.c | 29 ++++++++++++++++++++---------
>  2 files changed, 20 insertions(+), 10 deletions(-)
> 
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index ed92d8a..fb8ab30 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -3157,7 +3157,6 @@ 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);

Perhaps leave a comment indicating that startupPolicy is special so that
someone doesn't come along one day and say - oh look startupPolicy is
missing, I'm going to add it here... Assuming one reads comments ;-)

It's really too bad there isn't some "simple mechanism" to ensure new
fields are listed here too.

>      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 1a189cc..d74255b 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -7922,6 +7922,7 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
>  {
>      virDomainDiskDefPtr disk = dev->data.disk;
>      virDomainDiskDefPtr orig_disk = NULL;
> +    int startupPolicy;
>      int ret = -1;
>  
>      if (virStorageTranslateDiskSourcePool(conn, disk) < 0)
> @@ -7939,23 +7940,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;
> +
> +            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;
>          }
> -
> -        disk->src = NULL;
>          break;
>  
>      case VIR_DOMAIN_DISK_DEVICE_DISK:
> @@ -7974,6 +7981,10 @@ qemuDomainChangeDiskLive(virConnectPtr conn,
>      ret = 0;
>   cleanup:
>      return ret;
> +
> + rollback:
> +    orig_disk->startupPolicy = startupPolicy;
> +    goto cleanup;
>  }
>  
>  static int
> 




More information about the libvir-list mailing list