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@xxxxxxxxxxxxxxxxxx> > --- > 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; >
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list