On Mon, Jul 02, 2018 at 02:31:31PM +0200, Peter Krempa wrote:
On Mon, Jul 02, 2018 at 10:17:07 +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 deprecating use of -drive, with support being deleted
> from -drive in 3.0.
>
> We keep formatting error policy on -drive for now, because we don't
> ahve support for that with -device for usb-storage just yet.
>
> 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 now report an error in this case.
>
> Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
> ---
>
> Changed in v3:
>
> - Report error for setting CHS on USB
> - Report error for setting CHS translation mode for bus != IDE
> - Use 'bios-chs-trans' property not 'trans'
>
> src/qemu/qemu_command.c | 46 ++++++++++++++++---
> .../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/qemuxml2xmloutdata/disk-serial.xml | 1 -
> 10 files changed, 62 insertions(+), 32 deletions(-)
>
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 4fc3176ad3..46726b055e 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -1599,7 +1599,7 @@ qemuBuildDiskFrontendAttributeErrorPolicy(virDomainDiskDefPtr
disk,
> }
>
>
> -static void
> +static int
> qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
> virBufferPtr buf)
> {
> @@ -1607,14 +1607,27 @@ qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
> if (disk->geometry.cylinders > 0 &&
> disk->geometry.heads > 0 &&
> disk->geometry.sectors > 0) {
> + if (disk->bus == VIR_DOMAIN_DISK_BUS_USB) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> + _("CHS geometry can not be set for 'usb'
bus"));
> + return -1;
> + }
I'm not a fan of validation in the command line generator. I'd prefer if
you could move this to qemuDomainDeviceDefValidateDisk so that it gets
rejected at define time.
Won't that cause us to fail to load the VM definition when upgrading existing
libvirt.
> +
> virBufferAsprintf(buf, ",cyls=%u,heads=%u,secs=%u",
> disk->geometry.cylinders,
> disk->geometry.heads,
> disk->geometry.sectors);
>
> - if (disk->geometry.trans != VIR_DOMAIN_DISK_TRANS_DEFAULT)
> - virBufferAsprintf(buf, ",trans=%s",
> + if (disk->geometry.trans != VIR_DOMAIN_DISK_TRANS_DEFAULT) {
> + if (disk->bus != VIR_DOMAIN_DISK_BUS_IDE) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> + _("CHS translation mode can only be set for
'ide' bus not '%s'"),
> + virDomainDiskBusTypeToString(disk->bus));
> + return -1;
This would be a good candidate too.
> + }
> + virBufferAsprintf(buf, ",bios-chs-trans=%s",
>
virDomainDiskGeometryTransTypeToString(disk->geometry.trans));
> + }
> }
>
> if (disk->serial) {
> @@ -1622,7 +1635,7 @@ qemuBuildDiskFrontendAttributes(virDomainDiskDefPtr disk,
> virBufferEscape(buf, '\\', " ", "%s",
disk->serial);
> }
>
> - qemuBuildDiskFrontendAttributeErrorPolicy(disk, buf);
> + return 0;
> }
>
>
> @@ -1662,11 +1675,27 @@ 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;
> + }
I don't care that much about the -drive part though since that will
become almost unused.
> }
>
> - /* 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 */
> + 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 +2154,9 @@ qemuBuildDriveDevStr(const virDomainDef *def,
> if (qemuBuildDriveDevCacheStr(disk, &opt, qemuCaps) < 0)
> goto error;
>
> + if (qemuBuildDiskFrontendAttributes(disk, &opt) < 0)
> + goto error;
> +
> if (virBufferCheckError(&opt) < 0)
> goto error;
ACK
Regards,
Daniel
--
|:
https://berrange.com -o-
https://www.flickr.com/photos/dberrange :|
|:
https://libvirt.org -o-
https://fstop138.berrange.com :|
|:
https://entangle-photo.org -o-
https://www.instagram.com/dberrange :|