• L
    fix: unrealize virtio device if we fail to hotplug it · 7abea552
    linzhecheng 提交于
    If we fail to hotplug virtio-blk device and then suspend
    or shutdown VM, qemu is likely to crash.
    
    Re-production steps:
    1. Run VM named vm001
    2. Create a virtio-blk.xml which contains wrong configurations:
    <disk device="lun" rawio="yes" type="block">
      <driver cache="none" io="native" name="qemu" type="raw" />
      <source dev="/dev/mapper/11-dm" />
      <target bus="virtio" dev="vdx" />
    </disk>
    3. Run command : virsh attach-device vm001 virtio-blk.xml
    error: Failed to attach device from blk-scsi.xml
    error: internal error: unable to execute QEMU command 'device_add': Please set scsi=off for virtio-blk devices in order to use virtio 1.0
    it means hotplug virtio-blk device failed.
    4. Suspend or shutdown VM will leads to qemu crash
    
    Problem happens in virtio_vmstate_change which is called by
    vm_state_notify:
    vdev’s parent_bus is NULL, so qdev_get_parent_bus(DEVICE(vdev)) will crash.
    virtio_vmstate_change is added to the list vm_change_state_head at virtio_blk_device_realize(virtio_init),
    but after hotplug virtio-blk failed, virtio_vmstate_change will not be removed from vm_change_state_head.
    Adding unrealize function of virtio-blk device can solve this problem.
    Signed-off-by: Nlinzhecheng <linzhecheng@huawei.com>
    Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
    Reviewed-by: NMichael S. Tsirkin <mst@redhat.com>
    Signed-off-by: NMichael S. Tsirkin <mst@redhat.com>
    7abea552
virtio.c 73.6 KB