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@xxxxxxxxxx> --- 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; + } + 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; + } + 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; + } } - /* 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; diff --git a/tests/qemuxml2argvdata/disk-drive-network-tlsx509.args b/tests/qemuxml2argvdata/disk-drive-network-tlsx509.args index e25f45742c..b5e73064c0 100644 --- a/tests/qemuxml2argvdata/disk-drive-network-tlsx509.args +++ b/tests/qemuxml2argvdata/disk-drive-network-tlsx509.args @@ -28,22 +28,22 @@ server,nowait \ -drive file.driver=vxhs,file.tls-creds=objvirtio-disk0_tls0,\ file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.host=192.168.0.1,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk0,serial=eb90327c-8302-4725-9e1b-4e85ed4dc251,cache=none \ +id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ -id=virtio-disk0 \ +id=virtio-disk0,serial=eb90327c-8302-4725-9e1b-4e85ed4dc251 \ -object tls-creds-x509,id=objvirtio-disk1_tls0,dir=/etc/pki/libvirt-vxhs/dummy,\ ,path,endpoint=client,verify-peer=yes \ -drive file.driver=vxhs,file.tls-creds=objvirtio-disk1_tls0,\ file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc252,\ file.server.host=192.168.0.2,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk1,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252,cache=none \ +id=drive-virtio-disk1,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x5,drive=drive-virtio-disk1,\ -id=virtio-disk1 \ +id=virtio-disk1,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ -drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc253,\ file.server.host=192.168.0.3,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk2,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252,cache=none \ +id=drive-virtio-disk2,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x6,drive=drive-virtio-disk2,\ -id=virtio-disk2 \ +id=virtio-disk2,serial=eb90327c-8302-4725-9e1b-4e85ed4dc252 \ -object tls-creds-x509,id=objvirtio-disk3_tls0,dir=/etc/pki/libvirt-nbd/dummy,,\ path,endpoint=client,verify-peer=yes \ -drive file.driver=nbd,file.server.type=inet,file.server.host=example.com,\ diff --git a/tests/qemuxml2argvdata/disk-drive-network-vxhs.args b/tests/qemuxml2argvdata/disk-drive-network-vxhs.args index c2a1d4681f..fad4dfd942 100644 --- a/tests/qemuxml2argvdata/disk-drive-network-vxhs.args +++ b/tests/qemuxml2argvdata/disk-drive-network-vxhs.args @@ -25,6 +25,6 @@ server,nowait \ -usb \ -drive file.driver=vxhs,file.vdisk-id=eb90327c-8302-4725-9e1b-4e85ed4dc251,\ file.server.host=192.168.0.1,file.server.port=9999,format=raw,if=none,\ -id=drive-virtio-disk0,serial=eb90327c-8302-4725-9e1b-4e85ed4dc251,cache=none \ +id=drive-virtio-disk0,cache=none \ -device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\ -id=virtio-disk0 +id=virtio-disk0,serial=eb90327c-8302-4725-9e1b-4e85ed4dc251 diff --git a/tests/qemuxml2argvdata/disk-drive-shared.args b/tests/qemuxml2argvdata/disk-drive-shared.args index 5306fdf750..032e86e291 100644 --- a/tests/qemuxml2argvdata/disk-drive-shared.args +++ b/tests/qemuxml2argvdata/disk-drive-shared.args @@ -23,8 +23,9 @@ server,nowait \ -boot c \ -usb \ -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0,\ -serial=XYZXYZXYZYXXYZYZYXYZY,cache=none \ --device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +cache=none \ +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,\ +serial=XYZXYZXYZYXXYZYZYXYZY \ -drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-ide0-1-0,\ media=cdrom,readonly=on \ -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ diff --git a/tests/qemuxml2argvdata/disk-geometry.args b/tests/qemuxml2argvdata/disk-geometry.args index b173ab6407..f3e35b5f9e 100644 --- a/tests/qemuxml2argvdata/disk-geometry.args +++ b/tests/qemuxml2argvdata/disk-geometry.args @@ -22,7 +22,7 @@ server,nowait \ -no-acpi \ -boot c \ -usb \ --drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0,\ -cyls=16383,heads=16,secs=63,trans=lba \ --device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-0 \ +-device ide-drive,bus=ide.0,unit=0,drive=drive-ide0-0-0,id=ide0-0-0,cyls=16383,\ +heads=16,secs=63,bios-chs-trans=lba \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/disk-ide-wwn.args b/tests/qemuxml2argvdata/disk-ide-wwn.args index e6d2758ec3..a0e3f06b68 100644 --- a/tests/qemuxml2argvdata/disk-ide-wwn.args +++ b/tests/qemuxml2argvdata/disk-ide-wwn.args @@ -22,8 +22,7 @@ server,nowait \ -no-acpi \ -boot c \ -usb \ --drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-1,\ -serial=WD-WMAP9A966149 \ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-1 \ -device ide-hd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ -wwn=0x5000c50015ea71ad \ +wwn=0x5000c50015ea71ad,serial=WD-WMAP9A966149 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/disk-scsi-disk-wwn.args b/tests/qemuxml2argvdata/disk-scsi-disk-wwn.args index 29607e8927..6407fd002d 100644 --- a/tests/qemuxml2argvdata/disk-scsi-disk-wwn.args +++ b/tests/qemuxml2argvdata/disk-scsi-disk-wwn.args @@ -25,9 +25,9 @@ server,nowait \ -device lsi,id=scsi1,bus=pci.0,addr=0x4 \ -usb \ -drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-scsi0-0-1-0,\ -serial=WD-WMAP9A966149,readonly=on \ +readonly=on \ -device scsi-cd,bus=scsi0.0,channel=0,scsi-id=1,lun=0,drive=drive-scsi0-0-1-0,\ -id=scsi0-0-1-0,wwn=0x5000c50015ea71ac \ +id=scsi0-0-1-0,wwn=0x5000c50015ea71ac,serial=WD-WMAP9A966149 \ -drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,id=drive-scsi0-0-0-0 \ -device scsi-hd,bus=scsi0.0,channel=0,scsi-id=0,lun=0,drive=drive-scsi0-0-0-0,\ id=scsi0-0-0-0,wwn=0x5000c50015ea71ad \ diff --git a/tests/qemuxml2argvdata/disk-serial.args b/tests/qemuxml2argvdata/disk-serial.args index 88310b009f..5892f64c29 100644 --- a/tests/qemuxml2argvdata/disk-serial.args +++ b/tests/qemuxml2argvdata/disk-serial.args @@ -22,11 +22,11 @@ server,nowait \ -no-acpi \ -boot c \ -usb \ --drive 'file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-1,\ +-drive file=/dev/HostVG/QEMUGuest1,format=raw,if=none,id=drive-ide0-0-1 \ +-device 'ide-drive,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1,\ serial=\ \ WD-WMAP9A966149' \ --device ide-drive,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 \ --drive 'file=/dev/HostVG/AllSerialChars,format=raw,if=none,id=drive-ide0-0-2,\ +-drive file=/dev/HostVG/AllSerialChars,format=raw,if=none,id=drive-ide0-0-2 \ +-device 'ide-drive,bus=ide.0,unit=2,drive=drive-ide0-0-2,id=ide0-0-2,\ serial=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_\ .+' \ --device ide-drive,bus=ide.0,unit=2,drive=drive-ide0-0-2,id=ide0-0-2 \ --drive file=/some/file,format=raw,if=sd,index=0,serial=sdserial \ +-drive file=/some/file,format=raw,if=sd,index=0 \ -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/disk-serial.xml b/tests/qemuxml2argvdata/disk-serial.xml index ea71f2c339..18e72bb4ba 100644 --- a/tests/qemuxml2argvdata/disk-serial.xml +++ b/tests/qemuxml2argvdata/disk-serial.xml @@ -29,7 +29,6 @@ <disk type='file' device='disk'> <source file='/some/file'/> <target dev='sda' bus='sd'/> - <serial>sdserial</serial> </disk> <controller type='usb' index='0'/> <controller type='ide' index='0'/> diff --git a/tests/qemuxml2xmloutdata/disk-serial.xml b/tests/qemuxml2xmloutdata/disk-serial.xml index 9313c699b6..a803cd959c 100644 --- a/tests/qemuxml2xmloutdata/disk-serial.xml +++ b/tests/qemuxml2xmloutdata/disk-serial.xml @@ -32,7 +32,6 @@ <driver name='qemu' type='raw'/> <source file='/some/file'/> <target dev='sda' bus='sd'/> - <serial>sdserial</serial> </disk> <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> -- 2.17.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list