From: Christian Borntraeger Date: Fri, 22 Feb 2013 13:37:10 +0000 (+0100) Subject: virtio-blk: fix unplug + virsh reboot X-Git-Tag: qemu-xen-4.4.0-rc1~6^2~963^2~7 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=69b302b2044a9a0f6d157d25b39a91ff7124c61f;p=qemu-xen.git virtio-blk: fix unplug + virsh reboot virtio-blk registers a vmstate change handler. Unfortunately this handler is not unregistered on unplug, leading to some random crashes if the system is restarted, e.g. via virsh reboot. Lets unregister the vmstate change handler if the device is removed. Signed-off-by: Christian Borntraeger Signed-off-by: Stefan Hajnoczi --- diff --git a/hw/virtio-blk.c b/hw/virtio-blk.c index 34913ee40e..f5e6ee90b6 100644 --- a/hw/virtio-blk.c +++ b/hw/virtio-blk.c @@ -36,6 +36,7 @@ typedef struct VirtIOBlock VirtIOBlkConf *blk; unsigned short sector_mask; DeviceState *qdev; + VMChangeStateEntry *change; #ifdef CONFIG_VIRTIO_BLK_DATA_PLANE VirtIOBlockDataPlane *dataplane; #endif @@ -681,7 +682,7 @@ VirtIODevice *virtio_blk_init(DeviceState *dev, VirtIOBlkConf *blk) } #endif - qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s); + s->change = qemu_add_vm_change_state_handler(virtio_blk_dma_restart_cb, s); s->qdev = dev; register_savevm(dev, "virtio-blk", virtio_blk_id++, 2, virtio_blk_save, virtio_blk_load, s); @@ -702,6 +703,7 @@ void virtio_blk_exit(VirtIODevice *vdev) virtio_blk_data_plane_destroy(s->dataplane); s->dataplane = NULL; #endif + qemu_del_vm_change_state_handler(s->change); unregister_savevm(s->qdev, "virtio-blk", s); blockdev_mark_auto_del(s->bs); virtio_cleanup(vdev);