qemu: Support removable for scsi disk

Allow //disk/target@removable for scsi disk devices, since QEMU has support
the removable attribute for scsi-hd device from v0.14.0[1].

[1]: 419e691f8e: scsi-disk: Allow overriding SCSI INQUIRY removable bit

Signed-off-by: Han Han <hhan@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
Han Han 2023-06-05 13:07:29 +08:00 committed by Michal Privoznik
parent 5f7f6ceb47
commit 1ed695bcff
6 changed files with 24 additions and 11 deletions

View File

@ -3094,7 +3094,7 @@ paravirtualized driver is specified via the ``disk`` element.
CDROM or Floppy disk), the value can be either "open" or "closed", defaults
to "closed". NB, the value of ``tray`` could be updated while the domain is
running. The optional attribute ``removable`` sets the removable flag for USB
disks, and its value can be either "on" or "off", defaulting to "off".
or SCSI disks, and its value can be either "on" or "off", defaulting to "off".
The optional attribute ``rotation_rate`` sets the rotation rate of the
storage for disks on a SCSI, IDE, or SATA bus. Values in the range 1025 to
65534 are used to indicate rotational media speed in revolutions per minute.

View File

@ -881,9 +881,11 @@ virDomainDiskDefValidate(const virDomainDef *def,
}
if (disk->removable != VIR_TRISTATE_SWITCH_ABSENT &&
disk->bus != VIR_DOMAIN_DISK_BUS_USB) {
disk->bus != VIR_DOMAIN_DISK_BUS_USB &&
!(disk->bus == VIR_DOMAIN_DISK_BUS_SCSI &&
disk->device == VIR_DOMAIN_DISK_DEVICE_DISK)) {
virReportError(VIR_ERR_XML_ERROR, "%s",
_("removable is only valid for usb disks"));
_("removable is only valid for usb or scsi disks"));
return -1;
}

View File

@ -1782,10 +1782,12 @@ qemuBuildDiskDeviceProps(const virDomainDef *def,
if (disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
driver = "scsi-block";
} else {
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM)
if (disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) {
driver = "scsi-cd";
else
} else {
driver = "scsi-hd";
removable = disk->removable;
}
/* qemu historically used the name of -drive as one of the device
* ids in the Vital Product Data Device Identification page if

View File

@ -27,13 +27,17 @@ XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-QEMUGuest1/.config \
-no-shutdown \
-boot strict=on \
-device '{"driver":"piix3-usb-uhci","id":"usb","bus":"pci.0","addr":"0x1.0x2"}' \
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
-device '{"driver":"virtio-scsi-pci","id":"scsi0","bus":"pci.0","addr":"0x2"}' \
-blockdev '{"driver":"host_device","filename":"/dev/HostVG/QEMUGuest1","node-name":"libvirt-3-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-3-format","read-only":false,"driver":"raw","file":"libvirt-3-storage"}' \
-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-3-format","id":"ide0-0-0","bootindex":1}' \
-blockdev '{"driver":"file","filename":"/tmp/usbdisk.img","node-name":"libvirt-2-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-2-format","read-only":false,"driver":"raw","file":"libvirt-2-storage"}' \
-device '{"driver":"ide-hd","bus":"ide.0","unit":0,"drive":"libvirt-2-format","id":"ide0-0-0","bootindex":1}' \
-blockdev '{"driver":"file","filename":"/tmp/usbdisk.img","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
-device '{"driver":"usb-storage","bus":"usb.0","port":"1","drive":"libvirt-2-format","id":"usb-disk0","removable":true}' \
-blockdev '{"driver":"file","filename":"/tmp/scsidisk.img","node-name":"libvirt-1-storage","auto-read-only":true,"discard":"unmap"}' \
-blockdev '{"node-name":"libvirt-1-format","read-only":false,"driver":"raw","file":"libvirt-1-storage"}' \
-device '{"driver":"usb-storage","bus":"usb.0","port":"1","drive":"libvirt-1-format","id":"usb-disk0","removable":true}' \
-device '{"driver":"scsi-hd","bus":"scsi0.0","channel":0,"scsi-id":0,"lun":1,"device_id":"drive-scsi0-0-0-1","drive":"libvirt-1-format","id":"scsi0-0-0-1","removable":true}' \
-audiodev '{"id":"audio1","driver":"none"}' \
-device '{"driver":"virtio-balloon-pci","id":"balloon0","bus":"pci.0","addr":"0x2"}' \
-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

View File

@ -22,6 +22,11 @@
<source file='/tmp/usbdisk.img'/>
<target dev='sda' bus='usb' removable='on'/>
</disk>
<disk type='file' device='disk'>
<source file='/tmp/scsidisk.img'/>
<target dev='sdb' bus='scsi' removable='on'/>
</disk>
<controller type='scsi' index='0' model='virtio-scsi'/>
<memballoon model='virtio'/>
</devices>
</domain>

View File

@ -1227,7 +1227,7 @@ mymain(void)
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-device-lun-type-invalid");
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-attaching-partition-nosupport");
DO_TEST_CAPS_LATEST("disk-usb-device");
DO_TEST_CAPS_LATEST("disk-usb-device-removable");
DO_TEST_CAPS_LATEST("disk-device-removable");
DO_TEST_CAPS_LATEST_PARSE_ERROR("disk-usb-pci");
DO_TEST_CAPS_LATEST("disk-scsi");
DO_TEST_CAPS_LATEST("disk-scsi-device-auto");