]> Git Repo - qemu.git/commitdiff
virtio-9p-device: add minimal unrealize handler
authorGreg Kurz <[email protected]>
Tue, 8 Dec 2015 15:54:57 +0000 (16:54 +0100)
committerPeter Maydell <[email protected]>
Thu, 10 Dec 2015 10:46:22 +0000 (10:46 +0000)
Since commit 4652f1640e029e1f2433fa77ba6af285 "virtio-9p: add savevm
handlers", if the user hot-unplugs a quiescent 9p device and live
migrates, the source QEMU crashes before migration completetion...
This happens because virtio-9p devices have a realize handler which
calls virtio_init() and register_savevm().  Both calls store pointers
to the device internals, that get dereferenced during migration even
if the device got unplugged.

This patch simply adds an unrealize handler to perform minimal
cleanup and avoid the crash.  Hot unplug of non-quiescent 9p devices
is still not supported in QEMU, and not supported by linux guests
either.

Signed-off-by: Greg Kurz <[email protected]>
Reviewed-by: Michael S. Tsirkin <[email protected]>
Message-id: 20151208155457[email protected]
[PMM: rewrapped long lines in commit message]
Signed-off-by: Peter Maydell <[email protected]>
hw/9pfs/virtio-9p-device.c

index 944b5f5e9fcc765422015cf0068d890e309ef0f7..b42d3b30a027f11cb1886ad25fec68f76f47afd1 100644 (file)
@@ -145,6 +145,17 @@ out:
     v9fs_path_free(&path);
 }
 
+static void virtio_9p_device_unrealize(DeviceState *dev, Error **errp)
+{
+    VirtIODevice *vdev = VIRTIO_DEVICE(dev);
+    V9fsState *s = VIRTIO_9P(dev);
+
+    virtio_cleanup(vdev);
+    unregister_savevm(dev, "virtio-9p", s);
+    g_free(s->ctx.fs_root);
+    g_free(s->tag);
+}
+
 /* virtio-9p device */
 
 static Property virtio_9p_properties[] = {
@@ -161,6 +172,7 @@ static void virtio_9p_class_init(ObjectClass *klass, void *data)
     dc->props = virtio_9p_properties;
     set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
     vdc->realize = virtio_9p_device_realize;
+    vdc->unrealize = virtio_9p_device_unrealize;
     vdc->get_features = virtio_9p_get_features;
     vdc->get_config = virtio_9p_get_config;
 }
This page took 0.025619 seconds and 4 git commands to generate.