Obtain a reference to struct pcmcia_bus_socket for each pcmcia_device. This means that pcmcia_device always holds an indirect reference to struct pcmcia_socket as well. drivers/pcmcia/ds.c | 11 ++++++++++- 1 files changed, 10 insertions(+), 1 deletion(-) diff -ruN linux-original/drivers/pcmcia/ds.c linux/drivers/pcmcia/ds.c --- linux-original/drivers/pcmcia/ds.c 2004-11-13 14:11:11.000000000 +0100 +++ linux/drivers/pcmcia/ds.c 2004-11-13 14:14:02.510987608 +0100 @@ -477,6 +477,7 @@ static void pcmcia_release_dev(struct device *dev) { struct pcmcia_device *p_dev = to_pcmcia_dev(dev); + pcmcia_put_bus_socket(p_dev->socket->pcmcia); kfree(p_dev); } @@ -690,7 +691,14 @@ goto err_free_client; } memset(p_dev, 0, sizeof(struct pcmcia_device)); - + + s = pcmcia_get_bus_socket(s); + if (!s) { + ret = -ENODEV; + kfree(p_dev); + goto err_free_client; + } + p_dev->socket = s->parent; p_dev->func = bind_info->function; @@ -703,6 +711,7 @@ ret = device_register(&p_dev->dev); if (ret) { kfree(p_dev); + pcmcia_put_bus_socket(s); goto err_free_client; }