virtio_pci: don't kfree device on register failure
As mentioned at drivers/base/core.c: /* * NOTE: _Never_ directly free @dev after calling this function, even * if it returned an error! Always use put_device() to give up the * reference initialized in this function instead. */ so we don't free vp_dev until vp_dev->vdev.dev.release be called. Signed-off-by: weiping zhang <zhangweiping@didichuxing.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
f2b44cde7e
commit
33635bd976
|
@ -513,7 +513,7 @@ static void virtio_pci_release_dev(struct device *_d)
|
|||
static int virtio_pci_probe(struct pci_dev *pci_dev,
|
||||
const struct pci_device_id *id)
|
||||
{
|
||||
struct virtio_pci_device *vp_dev;
|
||||
struct virtio_pci_device *vp_dev, *reg_dev = NULL;
|
||||
int rc;
|
||||
|
||||
/* allocate our structure and fill it out */
|
||||
|
@ -551,6 +551,7 @@ static int virtio_pci_probe(struct pci_dev *pci_dev,
|
|||
pci_set_master(pci_dev);
|
||||
|
||||
rc = register_virtio_device(&vp_dev->vdev);
|
||||
reg_dev = vp_dev;
|
||||
if (rc)
|
||||
goto err_register;
|
||||
|
||||
|
@ -564,7 +565,10 @@ err_register:
|
|||
err_probe:
|
||||
pci_disable_device(pci_dev);
|
||||
err_enable_device:
|
||||
kfree(vp_dev);
|
||||
if (reg_dev)
|
||||
put_device(&vp_dev->vdev.dev);
|
||||
else
|
||||
kfree(vp_dev);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue