From 6280294574473760b585ed2298e9512499ad7816 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Thu, 30 Apr 2015 14:16:40 +0200 Subject: [PATCH] qemu: Check address type for USB disks Only USB addresses are allowed for USB disks. Report an error if another address is configured. https://bugzilla.redhat.com/show_bug.cgi?id=1043436 Signed-off-by: Jiri Denemark --- src/qemu/qemu_command.c | 12 +++++++ .../qemuxml2argv-disk-usb-pci.xml | 34 +++++++++++++++++++ tests/qemuxml2argvtest.c | 3 ++ 3 files changed, 49 insertions(+) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-usb-pci.xml diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e62833fb59..0dc8628b98 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -4057,6 +4057,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, disk->info.addr.drive.bus, disk->info.addr.drive.unit); break; + case VIR_DOMAIN_DISK_BUS_SCSI: if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) { if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SCSI_BLOCK)) { @@ -4155,6 +4156,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, disk->info.addr.drive.unit); } break; + case VIR_DOMAIN_DISK_BUS_SATA: if (disk->info.addr.drive.bus != 0) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", @@ -4194,6 +4196,7 @@ qemuBuildDriveDevStr(virDomainDefPtr def, disk->info.addr.drive.unit); } break; + case VIR_DOMAIN_DISK_BUS_VIRTIO: if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW) { virBufferAddLit(&opt, "virtio-blk-ccw"); @@ -4227,7 +4230,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def, if (qemuBuildDeviceAddressStr(&opt, def, &disk->info, qemuCaps) < 0) goto error; break; + case VIR_DOMAIN_DISK_BUS_USB: + if (disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE && + disk->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("unexpected address type for usb disk")); + goto error; + } if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_USB_STORAGE)) { virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", _("This QEMU doesn't support '-device " @@ -4240,11 +4250,13 @@ qemuBuildDriveDevStr(virDomainDefPtr def, if (qemuBuildDeviceAddressStr(&opt, def, &disk->info, qemuCaps) < 0) goto error; break; + default: virReportError(VIR_ERR_INTERNAL_ERROR, _("unsupported disk bus '%s' with device setup"), bus); goto error; } + virBufferAsprintf(&opt, ",drive=%s%s", QEMU_DRIVE_HOST_PREFIX, disk->info.alias); virBufferAsprintf(&opt, ",id=%s", disk->info.alias); if (bootindex && virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-usb-pci.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb-pci.xml new file mode 100644 index 0000000000..ad9655953c --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-usb-pci.xml @@ -0,0 +1,34 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219136 + 219136 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu + + + + +
+ + + + + +
+ + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 670465e309..4acaa11b88 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -812,6 +812,9 @@ mymain(void) DO_TEST("disk-usb-device-removable", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_DEVICE_USB_STORAGE, QEMU_CAPS_USB_STORAGE_REMOVABLE, QEMU_CAPS_NODEFCONFIG); + DO_TEST_FAILURE("disk-usb-pci", + QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, + QEMU_CAPS_DEVICE_USB_STORAGE, QEMU_CAPS_NODEFCONFIG); DO_TEST("disk-scsi-device", QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG, QEMU_CAPS_SCSI_LSI);