[libvirt] [PATCH] qemu: format serial, geometry and error policy on frontend disk device

Peter Krempa pkrempa at redhat.com
Mon Jun 25 10:29:48 UTC 2018


On Mon, Jun 25, 2018 at 10:50:32 +0100, Daniel Berrange wrote:
> Currently we format the serial, geometry and error policy on the -drive
> backend argument.
> 
> QEMU added the ability to set serial and geometry on the frontend in
> the 1.2 release, and ability to set error policy in the 2.7 release.
> usb-storage is an oddity, however, as it lacks error policy support
> right now.
> 
> Setting any of these on -drive has been deprecated and support for this
> will be removed very soon.
> 
> Note that some disk buses (sd) still don't support -device. Although
> QEMU allowed these properties to be set on -drive for if=sd, they
> have been ignored so we don't loose anything by removing this.
> 
> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
> ---
>  src/qemu/qemu_capabilities.c                  |  2 ++
>  src/qemu/qemu_capabilities.h                  |  1 +
>  src/qemu/qemu_command.c                       | 31 ++++++++++++++++---
>  .../caps_2.10.0.aarch64.xml                   |  1 +
>  .../caps_2.10.0.ppc64.xml                     |  1 +
>  .../caps_2.10.0.s390x.xml                     |  1 +
>  .../caps_2.10.0.x86_64.xml                    |  1 +
>  .../caps_2.11.0.s390x.xml                     |  1 +
>  .../caps_2.12.0.aarch64.xml                   |  1 +
>  .../caps_2.12.0.ppc64.xml                     |  1 +
>  .../caps_2.12.0.s390x.xml                     |  1 +
>  .../caps_2.12.0.x86_64.xml                    |  1 +
>  .../qemucapabilitiesdata/caps_2.7.0.s390x.xml |  1 +
>  .../caps_2.7.0.x86_64.xml                     |  1 +
>  .../qemucapabilitiesdata/caps_2.8.0.s390x.xml |  1 +
>  .../caps_2.8.0.x86_64.xml                     |  1 +
>  .../qemucapabilitiesdata/caps_2.9.0.ppc64.xml |  1 +
>  .../qemucapabilitiesdata/caps_2.9.0.s390x.xml |  1 +
>  .../caps_2.9.0.x86_64.xml                     |  1 +
>  .../disk-drive-network-tlsx509.args           | 12 +++----
>  .../disk-drive-network-vxhs.args              |  4 +--
>  tests/qemuxml2argvdata/disk-drive-shared.args |  5 +--
>  tests/qemuxml2argvdata/disk-geometry.args     |  6 ++--
>  tests/qemuxml2argvdata/disk-ide-wwn.args      |  5 ++-
>  .../qemuxml2argvdata/disk-scsi-disk-wwn.args  |  4 +--
>  tests/qemuxml2argvdata/disk-serial.args       | 10 +++---
>  tests/qemuxml2argvdata/disk-serial.xml        |  1 -
>  tests/qemuxml2argvtest.c                      |  1 +
>  tests/qemuxml2xmloutdata/disk-serial.xml      |  1 -
>  29 files changed, 69 insertions(+), 30 deletions(-)



> 
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 419208ad5c..b9a6c2d612 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -500,6 +500,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
>  
>                /* 310 */
>                "sev-guest",
> +              "disk-error",
>      );
>  
>  
> @@ -1162,6 +1163,7 @@ static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioBlk[] = {
>      { "iommu_platform", QEMU_CAPS_VIRTIO_PCI_IOMMU_PLATFORM },
>      { "ats", QEMU_CAPS_VIRTIO_PCI_ATS },
>      { "write-cache", QEMU_CAPS_DISK_WRITE_CACHE },
> +    { "werror", QEMU_CAPS_DISK_ERROR },
>  };

Please split-off capability changes into a separate commit as it's
usual.

>  
>  static struct virQEMUCapsStringFlags virQEMUCapsDevicePropsVirtioNet[] = {
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index 3519a194e9..1245fb46cf 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -484,6 +484,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
>  
>      /* 310 */
>      QEMU_CAPS_SEV_GUEST, /* -object sev-guest,... */
> +    QEMU_CAPS_DISK_ERROR, /* -device $DISK,werror=,rerror=X */
>  
>      QEMU_CAPS_LAST /* this must always be the last item */
>  } virQEMUCapsFlags;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 446df3e1d8..e97158fe64 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1621,8 +1621,6 @@ qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
>          virBufferAddLit(buf, ",serial=");
>          virBufferEscape(buf, '\\', " ", "%s", disk->serial);
>      }
> -
> -    qemuBuildDiskFrontendAttributeErrorPolicy(disk, buf);
>  }
>  
>  
> @@ -1662,11 +1660,29 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
>          virBufferAsprintf(&opt, "if=%s",
>                            virDomainDiskQEMUBusTypeToString(disk->bus));
>          virBufferAsprintf(&opt, ",index=%d", idx);
> +
> +        if (disk->serial) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Serial property not supported for drive bus '%s'"),
> +                           virDomainDiskBusTypeToString(disk->bus));
> +            goto error;
> +        }
> +        if (disk->geometry.cylinders > 0 &&
> +            disk->geometry.heads > 0 &&
> +            disk->geometry.sectors > 0) {
> +            virReportError(VIR_ERR_INTERNAL_ERROR,
> +                           _("Geometry not supported for drive bus '%s'"),
> +                           virDomainDiskBusTypeToString(disk->bus));
> +            goto error;
> +        }
>      }
>  
> -    /* Format attributes for the drive itself (not the storage backing it) which
> -     * we've formatted historically with -drive */
> -    qemuBuildDiskFrontendAttributes(disk, &opt);
> +    /* werror/rerror are really frontend attributes, but older
> +     * qemu requires them on -drive instead of -device */
> +    if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISK_ERROR) ||
> +        disk->bus == VIR_DOMAIN_DISK_BUS_USB)
> +        qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt);
> +
>  
>      /* While this is a frontend attribute, it only makes sense to be used when
>       * legacy -drive is used. In modern qemu the 'ide-cd' or 'scsi-cd' are used.
> @@ -2125,6 +2141,11 @@ qemuBuildDriveDevStr(const virDomainDef *def,
>      if (qemuBuildDriveDevCacheStr(disk, &opt, qemuCaps) < 0)
>          goto error;
>  
> +    qemuBuildDiskFrontendAttributes(disk, &opt);
> +    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISK_ERROR) &&
> +        disk->bus != VIR_DOMAIN_DISK_BUS_USB)

Why is USB special here? Switching to -blockdev will require doing this
also for the USB disk, so I'd rather have a single case here.

> +        qemuBuildDiskFrontendAttributeErrorPolicy(disk, &opt);
> +
>      if (virBufferCheckError(&opt) < 0)
>          goto error;

The rest looks good.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180625/07feb442/attachment-0001.sig>


More information about the libvir-list mailing list