[PATCH v4 09/11] qemu: validate: Allow <transient/> disks

Masayoshi Mizuma msys.mizuma at gmail.com
Fri Sep 25 14:11:30 UTC 2020


On Thu, Sep 24, 2020 at 01:43:56PM +0200, Peter Krempa wrote:
> From: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
> 
> Extract the validation of transient disk option. We support transient
> disks in qemu under the following conditions:
> 
>  - -blockdev is used
>  - the disk source is a local file
>  - the disk type is 'disk'
>  - the disk is not readonly
> 
> Signed-off-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>  docs/formatdomain.rst    |  5 ++--
>  src/qemu/qemu_validate.c | 56 +++++++++++++++++++++++++++++++++++-----
>  2 files changed, 53 insertions(+), 8 deletions(-)
> 
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index 888db5ea29..cc1467c0e6 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -2974,8 +2974,9 @@ paravirtualized driver is specified via the ``disk`` element.
>  ``transient``
>     If present, this indicates that changes to the device contents should be
>     reverted automatically when the guest exits. With some hypervisors, marking a
> -   disk transient prevents the domain from participating in migration or
> -   snapshots. Only suppported in vmx hypervisor. :since:`Since 0.9.5`
> +   disk transient prevents the domain from participating in migration,
> +   snapshots, or blockjobs. Only suppported in vmx hypervisor
> +   (:since:`Since 0.9.5`) and ``qemu`` hypervisor (:since:`Since 6.9.0`).
>  ``serial``
>     If present, this specify serial number of virtual hard drive. For example, it
>     may look like ``<serial>WD-WMAP9A966149</serial>``. Not supported for
> diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
> index 3ed4039cdf..3196814aca 100644
> --- a/src/qemu/qemu_validate.c
> +++ b/src/qemu/qemu_validate.c
> @@ -2186,12 +2186,6 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
>          }
>      }
> 
> -    if (disk->transient) {
> -        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> -                       _("transient disks not supported yet"));
> -        return -1;
> -    }
> -
>      if (disk->iomode == VIR_DOMAIN_DISK_IO_NATIVE &&
>          disk->cachemode != VIR_DOMAIN_DISK_CACHE_DIRECTSYNC &&
>          disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) {
> @@ -2340,6 +2334,53 @@ qemuValidateDomainDeviceDefDiskBlkdeviotune(const virDomainDiskDef *disk,
>  }
> 
> 
> +static int
> +qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
> +                                         virQEMUCapsPtr qemuCaps)
> +
> +{
> +    virStorageType actualType = virStorageSourceGetActualType(disk->src);
> +
> +    if (!disk->transient)
> +        return 0;
> +
> +    if (virStorageSourceIsEmpty(disk->src)) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("transient disk '%s' must not be empty"), disk->dst);
> +        return -1;
> +    }
> +
> +    if (disk->src->readonly) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("transient disk '%s' must not be read-only"), disk->dst);
> +        return -1;
> +    }
> +
> +    if (actualType != VIR_STORAGE_TYPE_FILE) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("transient disk supported only with 'file' type (%s)"),
> +                       disk->dst);
> +        return -1;
> +    }
> +
> +    if (disk->device != VIR_DOMAIN_DISK_DEVICE_DISK) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("transient disk supported only with 'disk' device (%s)"),
> +                       disk->dst);
> +        return -1;
> +    }
> +
> +    if (qemuCaps && !virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV)) {
> +        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                       _("transient disk not supported by this qemu binary (%s)"),
> +                       disk->dst);
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +
>  int
>  qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
>                                  const virDomainDef *def,
> @@ -2357,6 +2398,9 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
>      if (qemuValidateDomainDeviceDefDiskBlkdeviotune(disk, def, qemuCaps) < 0)
>          return -1;
> 
> +    if (qemuValidateDomainDeviceDefDiskTransient(disk, qemuCaps) < 0)
> +        return -1;
> +
>      if (disk->src->shared && !disk->src->readonly &&
>          !qemuBlockStorageSourceSupportsConcurrentAccess(disk->src)) {
>          virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> -- 

Tested-by: Masayoshi Mizuma <m.mizuma at jp.fujitsu.com>

Thanks a lot!
Masa




More information about the libvir-list mailing list