mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-08 12:41:29 +00:00
Support IDE/SATA disk 'product' parameter
Since we supported 'product' parameter for SCSI, just expanded existing solution makes IDE/SATA parameter works too. QEMU requires parameter 'model' in case of IDE/SATA (instead of 'product'), so the process of making JSON object is slightly modified. Length of the 'product' parameter is different in SCSI (16 chars) and ATA/SATA (40 chars). Resolves: https://gitlab.com/libvirt/libvirt/-/issues/697 Signed-off-by: Adam Julis <ajulis@redhat.com> Reviewed-by: Peter Krempa <pkrempa@redhat.com>
This commit is contained in:
parent
443ae4adec
commit
fce24e433b
@ -3570,12 +3570,13 @@ paravirtualized driver is specified via the ``disk`` element.
|
|||||||
:since:`Since 0.10.1`
|
:since:`Since 0.10.1`
|
||||||
``vendor``
|
``vendor``
|
||||||
If present, this element specifies the vendor of a virtual hard disk or
|
If present, this element specifies the vendor of a virtual hard disk or
|
||||||
CD-ROM device. It must not be longer than 8 printable characters.
|
CD-ROM device. It must not be longer than 8 printable characters. Only for
|
||||||
:since:`Since 1.0.1`
|
'scsi' ``bus``.:since:`Since 1.0.1`
|
||||||
``product``
|
``product``
|
||||||
If present, this element specifies the product of a virtual hard disk or
|
If present, this element specifies the product of a virtual hard disk or
|
||||||
CD-ROM device. It must not be longer than 16 printable characters.
|
CD-ROM device. It must not be longer than 16 printable characters for 'scsi'
|
||||||
:since:`Since 1.0.1`
|
(:since:`Since 1.0.1`). For 'sata' or 'ide' not longer than 40 printable
|
||||||
|
characters (:since:`Since 11.1.0`). Other ``bus`` is not supported.
|
||||||
``address``
|
``address``
|
||||||
If present, the ``address`` element ties the disk to a given slot of a
|
If present, the ``address`` element ties the disk to a given slot of a
|
||||||
controller (the actual ``<controller>`` device can often be inferred by
|
controller (the actual ``<controller>`` device can often be inferred by
|
||||||
|
@ -603,8 +603,8 @@ virDomainDiskDefValidateSource(const virStorageSource *src)
|
|||||||
|
|
||||||
|
|
||||||
#define VENDOR_LEN 8
|
#define VENDOR_LEN 8
|
||||||
#define PRODUCT_LEN 16
|
#define PRODUCT_SCSI_LEN 16
|
||||||
|
#define PRODUCT_ATA_SATA_LEN 40
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virDomainDiskDefSourceLUNValidate:
|
* virDomainDiskDefSourceLUNValidate:
|
||||||
@ -874,16 +874,21 @@ virDomainDiskDefValidate(const virDomainDef *def,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (disk->product) {
|
if (disk->product) {
|
||||||
|
size_t len = PRODUCT_ATA_SATA_LEN;
|
||||||
|
|
||||||
|
if (disk->bus == VIR_DOMAIN_DISK_BUS_SCSI)
|
||||||
|
len = PRODUCT_SCSI_LEN;
|
||||||
|
|
||||||
if (!virStringIsPrintable(disk->product)) {
|
if (!virStringIsPrintable(disk->product)) {
|
||||||
virReportError(VIR_ERR_XML_ERROR, "%s",
|
virReportError(VIR_ERR_XML_ERROR, "%s",
|
||||||
_("disk product is not printable string"));
|
_("disk product is not printable string"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen(disk->product) > PRODUCT_LEN) {
|
if (strlen(disk->product) > len) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
|
||||||
_("disk product is more than %1$d characters"),
|
_("disk product is more than %1$zu characters"),
|
||||||
PRODUCT_LEN);
|
len);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1669,7 +1669,7 @@
|
|||||||
<element name="product">
|
<element name="product">
|
||||||
<data type="string">
|
<data type="string">
|
||||||
<!-- All printable characters -->
|
<!-- All printable characters -->
|
||||||
<param name="pattern">[ -~]{0,16}</param>
|
<param name="pattern">[ -~]{0,40}</param>
|
||||||
</data>
|
</data>
|
||||||
</element>
|
</element>
|
||||||
</optional>
|
</optional>
|
||||||
|
@ -1619,6 +1619,8 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
|
|||||||
const char *biosCHSTrans = NULL;
|
const char *biosCHSTrans = NULL;
|
||||||
const char *wpolicy = NULL;
|
const char *wpolicy = NULL;
|
||||||
const char *rpolicy = NULL;
|
const char *rpolicy = NULL;
|
||||||
|
const char *model = NULL;
|
||||||
|
const char *product = NULL;
|
||||||
|
|
||||||
switch (disk->bus) {
|
switch (disk->bus) {
|
||||||
case VIR_DOMAIN_DISK_BUS_IDE:
|
case VIR_DOMAIN_DISK_BUS_IDE:
|
||||||
@ -1628,6 +1630,8 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
|
|||||||
else
|
else
|
||||||
driver = "ide-hd";
|
driver = "ide-hd";
|
||||||
|
|
||||||
|
model = disk->product;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DISK_BUS_SCSI:
|
case VIR_DOMAIN_DISK_BUS_SCSI:
|
||||||
@ -1654,6 +1658,8 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
product = disk->product;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_DISK_BUS_VIRTIO: {
|
case VIR_DOMAIN_DISK_BUS_VIRTIO: {
|
||||||
@ -1803,7 +1809,8 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
|
|||||||
"A:wwn", &wwn,
|
"A:wwn", &wwn,
|
||||||
"p:rotation_rate", disk->rotation_rate,
|
"p:rotation_rate", disk->rotation_rate,
|
||||||
"S:vendor", disk->vendor,
|
"S:vendor", disk->vendor,
|
||||||
"S:product", disk->product,
|
"S:product", product,
|
||||||
|
"S:model", model,
|
||||||
"T:removable", removable,
|
"T:removable", removable,
|
||||||
"S:write-cache", qemuOnOffAuto(writeCache),
|
"S:write-cache", qemuOnOffAuto(writeCache),
|
||||||
"p:cyls", disk->geometry.cylinders,
|
"p:cyls", disk->geometry.cylinders,
|
||||||
|
@ -2962,10 +2962,20 @@ qemuValidateDomainDeviceDefDiskFrontend(const virDomainDiskDef *disk,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disk->vendor || disk->product) {
|
if (disk->vendor) {
|
||||||
if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI) {
|
if (disk->bus != VIR_DOMAIN_DISK_BUS_SCSI) {
|
||||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
_("Only scsi disk supports vendor and product"));
|
_("Only scsi disk supports 'vendor'"));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (disk->product) {
|
||||||
|
if ((disk->bus != VIR_DOMAIN_DISK_BUS_IDE) &&
|
||||||
|
(disk->bus != VIR_DOMAIN_DISK_BUS_SATA) &&
|
||||||
|
(disk->bus != VIR_DOMAIN_DISK_BUS_SCSI)) {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("Only ide, sata and scsi disk supports 'product'"));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
36
tests/qemuxmlconfdata/disk-sata-product.x86_64-latest.args
Normal file
36
tests/qemuxmlconfdata/disk-sata-product.x86_64-latest.args
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1 \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.local/share \
|
||||||
|
XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.cache \
|
||||||
|
XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
|
||||||
|
/usr/bin/qemu-system-x86_64 \
|
||||||
|
-name guest=QEMUGuest1,debug-threads=on \
|
||||||
|
-S \
|
||||||
|
-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-QEMUGuest1/master-key.aes"}' \
|
||||||
|
-machine pc,usb=off,dump-guest-core=off,memory-backend=pc.ram,acpi=off \
|
||||||
|
-accel tcg \
|
||||||
|
-cpu qemu64 \
|
||||||
|
-m size=219136k \
|
||||||
|
-object '{"qom-type":"memory-backend-ram","id":"pc.ram","size":224395264}' \
|
||||||
|
-overcommit mem-lock=off \
|
||||||
|
-smp 1,sockets=1,cores=1,threads=1 \
|
||||||
|
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||||
|
-display none \
|
||||||
|
-no-user-config \
|
||||||
|
-nodefaults \
|
||||||
|
-chardev socket,id=charmonitor,fd=1729,server=on,wait=off \
|
||||||
|
-mon chardev=charmonitor,id=monitor,mode=control \
|
||||||
|
-rtc base=utc \
|
||||||
|
-no-shutdown \
|
||||||
|
-boot strict=on \
|
||||||
|
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
|
||||||
|
-device '{"driver":"ahci","id":"sata0","bus":"pci.0","addr":"0x2"}' \
|
||||||
|
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUG uest1","node-name":"libvirt-1-storage","read-only":false}' \
|
||||||
|
-device '{"driver":"ide-hd","bus":"sata0.0","drive":"libvirt-1-storage","id":"sata0-0-0","bootindex":1,"model":"WD10EZEX-00BN5A0"}' \
|
||||||
|
-audiodev '{"id":"audio1","driver":"none"}' \
|
||||||
|
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x3"}' \
|
||||||
|
-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
|
||||||
|
-msg timestamp=on
|
41
tests/qemuxmlconfdata/disk-sata-product.x86_64-latest.xml
Normal file
41
tests/qemuxmlconfdata/disk-sata-product.x86_64-latest.xml
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>QEMUGuest1</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<cpu mode='custom' match='exact' check='none'>
|
||||||
|
<model fallback='forbid'>qemu64</model>
|
||||||
|
</cpu>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver name='qemu' type='raw'/>
|
||||||
|
<source dev='/dev/HostVG/QEMUG uest1'/>
|
||||||
|
<target dev='sda' bus='sata'/>
|
||||||
|
<product>WD10EZEX-00BN5A0</product>
|
||||||
|
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||||
|
</disk>
|
||||||
|
<controller type='usb' index='0' model='piix3-uhci'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='sata' index='0'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
|
||||||
|
</controller>
|
||||||
|
<controller type='pci' index='0' model='pci-root'/>
|
||||||
|
<input type='mouse' bus='ps2'/>
|
||||||
|
<input type='keyboard' bus='ps2'/>
|
||||||
|
<audio id='1' type='none'/>
|
||||||
|
<memballoon model='virtio'>
|
||||||
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||||
|
</memballoon>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
28
tests/qemuxmlconfdata/disk-sata-product.xml
Normal file
28
tests/qemuxmlconfdata/disk-sata-product.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>QEMUGuest1</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver cache='default'/>
|
||||||
|
<source dev='/dev/HostVG/QEMUG uest1'/>
|
||||||
|
<target dev='sda' bus='sata'/>
|
||||||
|
<product>WD10EZEX-00BN5A0</product>
|
||||||
|
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||||
|
</disk>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<controller type='sata' index='0'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -1 +1 @@
|
|||||||
unsupported configuration: Only scsi disk supports vendor and product
|
unsupported configuration: Only scsi disk supports 'vendor'
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
unsupported configuration: disk product is more than 16 characters
|
28
tests/qemuxmlconfdata/disk-scsi-product-length.xml
Normal file
28
tests/qemuxmlconfdata/disk-scsi-product-length.xml
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<domain type='qemu'>
|
||||||
|
<name>QEMUGuest1</name>
|
||||||
|
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||||
|
<memory unit='KiB'>219136</memory>
|
||||||
|
<currentMemory unit='KiB'>219136</currentMemory>
|
||||||
|
<vcpu placement='static'>1</vcpu>
|
||||||
|
<os>
|
||||||
|
<type arch='x86_64' machine='pc'>hvm</type>
|
||||||
|
<boot dev='hd'/>
|
||||||
|
</os>
|
||||||
|
<clock offset='utc'/>
|
||||||
|
<on_poweroff>destroy</on_poweroff>
|
||||||
|
<on_reboot>restart</on_reboot>
|
||||||
|
<on_crash>destroy</on_crash>
|
||||||
|
<devices>
|
||||||
|
<emulator>/usr/bin/qemu-system-x86_64</emulator>
|
||||||
|
<disk type='block' device='disk'>
|
||||||
|
<driver cache='default'/>
|
||||||
|
<source dev='/dev/HostVG/QEMUG uest1'/>
|
||||||
|
<target dev='sda' bus='scsi'/>
|
||||||
|
<product>WD10EZEX-00BN5A00</product>
|
||||||
|
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
|
||||||
|
</disk>
|
||||||
|
<controller type='usb' index='0'/>
|
||||||
|
<controller type='sata' index='0'/>
|
||||||
|
<memballoon model='virtio'/>
|
||||||
|
</devices>
|
||||||
|
</domain>
|
@ -1621,9 +1621,11 @@ mymain(void)
|
|||||||
DO_TEST_CAPS_LATEST("disk-scsi-disk-wwn");
|
DO_TEST_CAPS_LATEST("disk-scsi-disk-wwn");
|
||||||
DO_TEST_CAPS_LATEST("disk-scsi-disk-vpd");
|
DO_TEST_CAPS_LATEST("disk-scsi-disk-vpd");
|
||||||
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-scsi-disk-vpd-build-error");
|
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-scsi-disk-vpd-build-error");
|
||||||
|
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-scsi-product-length");
|
||||||
DO_TEST_CAPS_LATEST("controller-virtio-scsi");
|
DO_TEST_CAPS_LATEST("controller-virtio-scsi");
|
||||||
DO_TEST_CAPS_LATEST("controller-scsi-auto");
|
DO_TEST_CAPS_LATEST("controller-scsi-auto");
|
||||||
DO_TEST_CAPS_LATEST("disk-sata-device");
|
DO_TEST_CAPS_LATEST("disk-sata-device");
|
||||||
|
DO_TEST_CAPS_LATEST("disk-sata-product");
|
||||||
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-target-overflow");
|
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-target-overflow");
|
||||||
DO_TEST_CAPS_LATEST("disk-aio");
|
DO_TEST_CAPS_LATEST("disk-aio");
|
||||||
DO_TEST_CAPS_LATEST("disk-aio-io_uring");
|
DO_TEST_CAPS_LATEST("disk-aio-io_uring");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user