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(a)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;