Apparently we shouldn't be statically allocating the root device object, so dynamically allocate it instead.
Also add a release() function to avoid this warning: Device 'virtio-pci' does not have a release() function, it is broken and must be fixed Signed-off-by: Mark McLoughlin <[EMAIL PROTECTED]> Cc: Anthony Liguori <[EMAIL PROTECTED]> --- drivers/virtio/virtio_pci.c | 48 +++++++++++++++++++++++++++++++++++------- 1 files changed, 40 insertions(+), 8 deletions(-) diff --git a/drivers/virtio/virtio_pci.c b/drivers/virtio/virtio_pci.c index 265fdf2..939e0b4 100644 --- a/drivers/virtio/virtio_pci.c +++ b/drivers/virtio/virtio_pci.c @@ -73,10 +73,42 @@ MODULE_DEVICE_TABLE(pci, virtio_pci_id_table); /* A PCI device has it's own struct device and so does a virtio device so * we create a place for the virtio devices to show up in sysfs. I think it * would make more sense for virtio to not insist on having it's own device. */ -static struct device virtio_pci_root = { - .parent = NULL, - .init_name = "virtio-pci", -}; +static struct device *virtio_pci_root; + +static void virtio_pci_release_root(struct device *root) +{ + kfree(root); +} + +static int virtio_pci_init_root(void) +{ + struct device *root; + int err = -ENOMEM; + + root = kzalloc(sizeof(struct device), GFP_KERNEL); + if (root == NULL) + goto out; + + err = dev_set_name(root, "virtio-pci"); + if (err) + goto free_root; + + err = device_register(root); + if (err) + goto free_root; + + root->parent = NULL; + root->release = virtio_pci_release_root; + + virtio_pci_root = root; + + return 0; + +free_root: + kfree(root); +out: + return err; +} /* Convert a generic virtio device to our structure */ static struct virtio_pci_device *to_vp_device(struct virtio_device *vdev) @@ -343,7 +375,7 @@ static int __devinit virtio_pci_probe(struct pci_dev *pci_dev, if (vp_dev == NULL) return -ENOMEM; - vp_dev->vdev.dev.parent = &virtio_pci_root; + vp_dev->vdev.dev.parent = virtio_pci_root; vp_dev->vdev.dev.release = virtio_pci_release_dev; vp_dev->vdev.config = &virtio_pci_config_ops; vp_dev->pci_dev = pci_dev; @@ -437,13 +469,13 @@ static int __init virtio_pci_init(void) { int err; - err = device_register(&virtio_pci_root); + err = virtio_pci_init_root(); if (err) return err; err = pci_register_driver(&virtio_pci_driver); if (err) - device_unregister(&virtio_pci_root); + device_unregister(virtio_pci_root); return err; } @@ -452,8 +484,8 @@ module_init(virtio_pci_init); static void __exit virtio_pci_exit(void) { - device_unregister(&virtio_pci_root); pci_unregister_driver(&virtio_pci_driver); + device_unregister(virtio_pci_root); } module_exit(virtio_pci_exit); -- 1.5.4.3 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html