[libvirt] [PATCH 1/2] Caps: Disable floppy disk for PowerPC VM

Ján Tomko jtomko at redhat.com
Tue Jul 28 11:49:20 UTC 2015


On Fri, Jul 24, 2015 at 03:30:14PM -0400, Kothapally Madhu Pavan wrote:
> PowerPC pseries based VMs do not support a floppy disk controller.
> This prohibits libvirt from adding floppy disk for a PowerPC pseries VM.
> 
> Signed-off-by: Kothapally Madhu Pavan <kmp at linux.vnet.ibm.com>
> ---
>  src/conf/domain_conf.c       |   19 +++++++++++++++----
>  src/qemu/qemu_capabilities.c |   15 +++++++++++----
>  2 files changed, 26 insertions(+), 8 deletions(-)
> 
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 73ac537..b9f35b4 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -6540,7 +6540,9 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
>                           virHashTablePtr bootHash,
>                           virSecurityLabelDefPtr* vmSeclabels,
>                           int nvmSeclabels,
> -                         unsigned int flags)
> +                         unsigned int flags,
> +                         virArch arch,
> +                         const char *machine)
>  {
>      virDomainDiskDefPtr def;
>      xmlNodePtr sourceNode = NULL;
> @@ -7165,6 +7167,12 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
>          }
>      } else {
>          if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY) {
> +            /* PowerPC pseries based VMs do not support floppy device */
> +            if (ARCH_IS_PPC64(arch) && STRPREFIX(machine, "pseries")) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                              _("PowerPC pseries machines do not support floppy device"));
> +                goto error;
> +            }
>              def->bus = VIR_DOMAIN_DISK_BUS_FDC;
>          } else if (!(flags & VIR_DOMAIN_DEF_PARSE_DISK_SOURCE)) {
>              if (STRPREFIX(target, "hd"))
> @@ -12375,7 +12383,8 @@ virDomainDeviceDefParse(const char *xmlStr,
>          if (!(dev->data.disk = virDomainDiskDefParseXML(xmlopt, node, ctxt,
>                                                          NULL, def->seclabels,
>                                                          def->nseclabels,
> -                                                        flags)))
> +                                                        flags, def->os.arch,
> +                                                        def->os.machine)))

The architecture and machine type do not affect parsing of the disk.
If we really want to forbid even parsing a domain with a floppy,
this would better be done somewhere in the virDomainDefPostParse
functions.

But I think we should happily parse this domain and only report an error
on startup, so all the domain_conf.c changes can be dropped.

>              goto error;
>          break;
>      case VIR_DOMAIN_DEVICE_LEASE:
> @@ -12519,7 +12528,8 @@ virDomainDiskDefSourceParse(const char *xmlStr,
>      if (!(disk = virDomainDiskDefParseXML(xmlopt, node, ctxt,
>                                            NULL, def->seclabels,
>                                            def->nseclabels,
> -                                          flags)))
> +                                          flags, def->os.arch,
> +                                          def->os.machine)))
>          goto cleanup;
>  
>      ret = disk->src;
> @@ -15539,7 +15549,8 @@ virDomainDefParseXML(xmlDocPtr xml,
>                                                              bootHash,
>                                                              def->seclabels,
>                                                              def->nseclabels,
> -                                                            flags);
> +                                                            flags, def->os.arch,
> +                                                            def->os.machine);
>          if (!disk)
>              goto error;
>  

The rest looks good.

Jan

> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index d8cb32d..e304473 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -3919,25 +3919,32 @@ virQEMUCapsFillDomainOSCaps(virQEMUCapsPtr qemuCaps,
>  
>  static int
>  virQEMUCapsFillDomainDeviceDiskCaps(virQEMUCapsPtr qemuCaps,
> +                                    const char *machine,
>                                      virDomainCapsDeviceDiskPtr disk)
>  {
>      disk->device.supported = true;
>      /* QEMU supports all of these */
>      VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice,
>                               VIR_DOMAIN_DISK_DEVICE_DISK,
> -                             VIR_DOMAIN_DISK_DEVICE_CDROM,
> -                             VIR_DOMAIN_DISK_DEVICE_FLOPPY);
> +                             VIR_DOMAIN_DISK_DEVICE_CDROM);
> +
> +    /* PowerPC pseries based VMs do not support floppy device */
> +    if (!(ARCH_IS_PPC64(qemuCaps->arch) && STRPREFIX(machine, "pseries")))
> +        VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice, VIR_DOMAIN_DISK_DEVICE_FLOPPY);
>  
>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_SG_IO))
>          VIR_DOMAIN_CAPS_ENUM_SET(disk->diskDevice, VIR_DOMAIN_DISK_DEVICE_LUN);
>  
>      VIR_DOMAIN_CAPS_ENUM_SET(disk->bus,
>                               VIR_DOMAIN_DISK_BUS_IDE,
> -                             VIR_DOMAIN_DISK_BUS_FDC,
>                               VIR_DOMAIN_DISK_BUS_SCSI,
>                               VIR_DOMAIN_DISK_BUS_VIRTIO,
>                               /* VIR_DOMAIN_DISK_BUS_SD */);
>  
> +    /* PowerPC pseries based VMs do not support floppy device */
> +    if (!(ARCH_IS_PPC64(qemuCaps->arch) && STRPREFIX(machine, "pseries")))
> +        VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_FDC);
> +
>      if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_STORAGE))
>          VIR_DOMAIN_CAPS_ENUM_SET(disk->bus, VIR_DOMAIN_DISK_BUS_USB);
>      return 0;
> @@ -4008,7 +4015,7 @@ virQEMUCapsFillDomainCaps(virDomainCapsPtr domCaps,
>  
>      if (virQEMUCapsFillDomainOSCaps(qemuCaps, os,
>                                      loader, nloader) < 0 ||
> -        virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, disk) < 0 ||
> +        virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk) < 0 ||
>          virQEMUCapsFillDomainDeviceHostdevCaps(qemuCaps, hostdev) < 0)
>          return -1;
>      return 0;
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20150728/2b603adc/attachment-0001.sig>


More information about the libvir-list mailing list