|
@@ -2090,6 +2090,7 @@ static int virtcons_probe(struct virtio_device *vdev)
|
|
|
|
|
|
spin_lock_init(&portdev->ports_lock);
|
|
|
INIT_LIST_HEAD(&portdev->ports);
|
|
|
+ INIT_LIST_HEAD(&portdev->list);
|
|
|
|
|
|
virtio_device_ready(portdev->vdev);
|
|
|
|
|
@@ -2107,8 +2108,15 @@ static int virtcons_probe(struct virtio_device *vdev)
|
|
|
if (!nr_added_bufs) {
|
|
|
dev_err(&vdev->dev,
|
|
|
"Error allocating buffers for control queue\n");
|
|
|
- err = -ENOMEM;
|
|
|
- goto free_vqs;
|
|
|
+ /*
|
|
|
+ * The host might want to notify mgmt sw about device
|
|
|
+ * add failure.
|
|
|
+ */
|
|
|
+ __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
|
|
|
+ VIRTIO_CONSOLE_DEVICE_READY, 0);
|
|
|
+ /* Device was functional: we need full cleanup. */
|
|
|
+ virtcons_remove(vdev);
|
|
|
+ return -ENOMEM;
|
|
|
}
|
|
|
} else {
|
|
|
/*
|
|
@@ -2139,11 +2147,6 @@ static int virtcons_probe(struct virtio_device *vdev)
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
-free_vqs:
|
|
|
- /* The host might want to notify mgmt sw about device add failure */
|
|
|
- __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
|
|
|
- VIRTIO_CONSOLE_DEVICE_READY, 0);
|
|
|
- remove_vqs(portdev);
|
|
|
free_chrdev:
|
|
|
unregister_chrdev(portdev->chr_major, "virtio-portsdev");
|
|
|
free:
|