Hide Forgot
+++ This bug was initially created as a clone of Bug #1043374 +++ Description of problem: Libvirt should check unnecessary pci-address for usb type disk before starting domain Version-Release number of selected component (if applicable): libvirt-0.10.2-29.el6.x86_64 qemu-kvm-0.12.1.2-2.398.el6.x86_64 kernel-2.6.32-412.el6.x86_64 How reproducible: 100% Steps to Reproduce: 1. Edit domain and add a unavailable pci address to usb disk <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/usb-img/usb.img'/> <target dev='sdd' bus='usb'/> <alias name='usb-disk3'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> 2. Dump domain xml [root@test777 ~]# virsh dumpxml r6 ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/usb-img/usb.img'/> <target dev='sdd' bus='usb'/> <alias name='usb-disk3'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> ... 3. Start domain [root@test777 ~]# virsh start r6 Domain r6 started [root@test777 ~]# virsh dumpxml r6 ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/usb-img/usb.img'/> <target dev='sdd' bus='usb'/> <alias name='usb-disk3'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> </disk> ... Actual results: See above steps. Expected results: Libvirt should fail to start domain when we configure some wrong elements for usb disk. The expected results should be same as below: Need give error info like bus='ide' or bus='scsi': # virsh start rhel6u2 error: Failed to start domain rhel6u2 error: internal error unexpected address type for ide disk # virsh start rhel6u2 error: Failed to start domain rhel6u2 error: internal error unexpected address type for scsi disk Additional info: On rhel7 host, I can not reproduce it. Version: libvirt-1.1.1-13.el7.x86_64 qemu-kvm-1.5.3-19.el7.x86_64 kernel-3.10.0-54.el7.x86_64 [root@ibm-x3850x5-07 216365]# virsh dumpxml r7 ... <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/var/lib/libvirt/images/usb-img/usb-a-a.img'/> <target dev='sdd' bus='usb'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0e' function='0x0'/> </disk> ... [root@ibm-x3850x5-07 216365]# virsh start r7 error: Failed to start domain r7 error: internal error: early end of file from monitor: possible problem: qemu-kvm: -device usb-storage,bus=pci.0,addr=0xe,drive=drive-usb-disk3,id=usb-disk3: Device 'usb-storage' can't go on a PCI bus While the domain failed to start on RHEL7, libvirt still doesn't do a good job and tries to actually start the domain with a USB disk attached to a PCI bus.
Patch sent upstream for review: https://www.redhat.com/archives/libvir-list/2015-April/msg01549.html
Pushed upstream as v1.2.15-rc1-32-g6280294: commit 6280294574473760b585ed2298e9512499ad7816 Author: Jiri Denemark <jdenemar> Date: Thu Apr 30 14:16:40 2015 +0200 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 <jdenemar>
I can reproduce it on libvirt-0.10.2-29.el6.x86_64 . verify version: libvirt-1.2.15-2.el7.x86_64 qemu-kvm-rhev-2.3.0-1.el7.x86_64 kernel-3.10.0-234.el7.x86_64 steps: 1.start a guest with a usb disk without address , guest xml like following : <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/qcow2.img'/> <target dev='sde' bus='usb'/> </disk> Domain r7.2-new started 2.destroy guest and edit guest xml set usb disk with a PCI address #virsh edit r7.2-new <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/qcow2.img'/> <target dev='sde' bus='usb'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> </disk> then start guest #virsh start r7.2-new error: Failed to start domain r7.2-new error: internal error: unexpected address type for usb disk 3.destroy guest and edit guest xml set usb disk with address which type is drive #virsh edit r7.2-new <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/qcow2.img'/> <target dev='sde' bus='usb'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> #virsh start r7.2-new error: Failed to start domain r7.2-new error: internal error: unexpected address type for usb disk 4.destroy guest and edit guest xml set a usb disk with USB address #virsh start r7.2-new Domain r7.2-new started #virsh dumpxml r7.2-new | grep disk -A 9 <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/qcow2.img'/> <backingStore/> <target dev='sde' bus='usb'/> <alias name='usb-disk4'/> <address type='usb' bus='0' port='2'/> </disk> Now , libvirt refuse to start a domain with a USB disk configured with non USB addresses .
Hi , Jiri . I also tested this scenario with host device . and I have found two issues during my testing . I wonder these can be modified in this patch or should open new bug to trace them . Thanks in advance ! issue 1 : test with host USB device problem : Start a guest with a host USB device which address is PCI , guest fail to start , but If it's better that libvirt forbid configure guest xml like this and no need to try to actually to start it . 1.start guest with host USB device with address type is pci # virsh dumpxml r7.2-new | grep hostdev -A 9 <hostdev mode='subsystem' type='usb' managed='no'> <source> <vendor id='0x0781'/> <product id='0x5567'/> </source> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> <==== type is PCI </hostdev> #virsh start testvm error: Failed to start domain testvm error: internal error: process exited while connecting to monitor: 2015-05-22T05:23:29.677447Z qemu-kvm: -device usb-host,hostbus=2,hostaddr=6,id=hostdev0,bus=pci.0,addr=0xa: Device 'usb-host' can't go on a PCI bus issue 2 : test with host scsi device problem : For host scsi device , libvirt should also check if address configuration is valid. Start guest with host scsi device with address type is PCI , guest start successfully . Start guest with host scsi device with address type is usb , output unfriendly error message . 1.start guest with host scsi device with address type is pci # virsh dumpxml testvm | grep hostdev -A 9 <hostdev mode='subsystem' type='scsi' managed='no'> <source protocol='iscsi' name='iqn.2008-09.5.165.3ffe.104:server.target2/1'> <host name='$IP' port='3260'/> </source> <alias name='hostdev1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> <=== type is PCI </hostdev> 2.start guest , guest start successfully . #virsh start r7.2-new Domain r7.2-new started # virsh dumpxml testvm | grep hostdev -A 9 <hostdev mode='subsystem' type='scsi' managed='no'> <source protocol='iscsi' name='iqn.2008-09.5.165.3ffe.104:server.target2/1'> <host name='$IP' port='3260'/> </source> <alias name='hostdev1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/> <=== type is PCI </hostdev> 3.start host scsi device with usb address # virsh dumpxml r7.2-new |grep hostdev -A 9 <hostdev mode='subsystem' type='scsi' managed='no'> <source protocol='iscsi' name='iqn.2008-09.5.165.3ffe.104:server.target2/1'> <host name='10.66.5.165' port='3260'/> </source> <address type='usb' bus='0' port='1'/> <==== type is usb </hostdev> #virsh start r7.2-new error: Failed to start domain r7.2-new error: internal error: process exited while connecting to monitor: 2015-05-22T08:28:46.464675Z qemu-kvm: -device scsi-generic,bus=scsi0.0,channel=0,scsi-id=-1878988912,lun=32700,drive=usb-hostdev0,id=hostdev0: Parameter 'scsi-id' expects uint32_t 4.start a guest with host sscsi device and without address element , it will generated a address which type is 'drive' <hostdev mode='subsystem' type='scsi' managed='no'> <source protocol='iscsi' name='iqn.2008-09.5.165.3ffe.104:server.target2/1'> <host name='10.66.5.165' port='3260'/> </source> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </hostdev> 5.start scsi disk with pci address <disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/var/lib/libvirt/images/qcow2.img'/> <target dev='sde' bus='scsi'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/> </disk> #virsh start r7.2-new error: Failed to start domain testvm error: internal error: unexpected address type for scsi disk
As talked with my colleague , fill a bug to track issue in comment 7 https://bugzilla.redhat.com/show_bug.cgi?id=1225339 and according to comment 6 , move this bug to verified .
Since the problem described in this bug report should be resolved in a recent advisory, it has been closed with a resolution of ERRATA. For information on the advisory, and where to find the updated files, follow the link below. If the solution does not work for you, open a new bug report. https://rhn.redhat.com/errata/RHBA-2015-2202.html