don't free vp_dev until vp_dev->vdev.dev.release be called.

Signed-off-by: weiping zhang <zhangweip...@didichuxing.com>
---
 drivers/virtio/virtio_pci_common.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/virtio/virtio_pci_common.c 
b/drivers/virtio/virtio_pci_common.c
index 1c4797e..91d20f7 100644
--- a/drivers/virtio/virtio_pci_common.c
+++ b/drivers/virtio/virtio_pci_common.c
@@ -551,16 +551,17 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
        pci_set_master(pci_dev);
 
        rc = register_virtio_device(&vp_dev->vdev);
-       if (rc)
-               goto err_register;
+       if (rc) {
+               if (vp_dev->ioaddr)
+                    virtio_pci_legacy_remove(vp_dev);
+               else
+                    virtio_pci_modern_remove(vp_dev);
+               pci_disable_device(pci_dev);
+               put_device(&vp_dev->vdev.dev);
+       }
 
-       return 0;
+       return rc;
 
-err_register:
-       if (vp_dev->ioaddr)
-            virtio_pci_legacy_remove(vp_dev);
-       else
-            virtio_pci_modern_remove(vp_dev);
 err_probe:
        pci_disable_device(pci_dev);
 err_enable_device:
-- 
2.9.4

_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to