drivers/pcmcia/cs.c | 25 +++++++++++++++++++------ 1 files changed, 19 insertions(+), 6 deletions(-) diff -puN drivers/pcmcia/cs.c~pcmcia-event-20030623-2 drivers/pcmcia/cs.c --- 25/drivers/pcmcia/cs.c~pcmcia-event-20030623-2 2003-06-23 15:36:25.000000000 -0700 +++ 25-akpm/drivers/pcmcia/cs.c 2003-06-23 15:36:25.000000000 -0700 @@ -723,6 +723,9 @@ static int socket_insert(struct pcmcia_s { int ret; + if (!try_module_get(skt->owner)) + return CS_NO_CARD; + ret = socket_setup(skt, setup_delay); if (ret == CS_SUCCESS) { #ifdef CONFIG_CARDBUS @@ -733,8 +736,10 @@ static int socket_insert(struct pcmcia_s #endif send_event(skt, CS_EVENT_CARD_INSERTION, CS_EVENT_PRI_LOW); skt->socket.flags &= ~SS_DEBOUNCED; - } else + } else { socket_shutdown(skt); + module_put(skt->owner); + } return ret; } @@ -778,14 +783,24 @@ static int socket_resume(struct pcmcia_s send_event(skt, CS_EVENT_PM_RESUME, CS_EVENT_PRI_LOW); } skt->socket.flags &= ~SS_DEBOUNCED; - } else + } else { + unsigned int old_state = skt->state; socket_shutdown(skt); + if (old_state & SOCKET_PRESENT) + module_put(skt->owner); + } skt->state &= ~SOCKET_SUSPEND; return CS_SUCCESS; } +static void socket_remove(struct pcmcia_socket *skt) +{ + socket_shutdown(skt); + module_put(skt->owner); +} + static int pccardd(void *__skt) { struct pcmcia_socket *skt = __skt; @@ -815,7 +830,7 @@ static int pccardd(void *__skt) get_socket_status(skt, &status); if ((skt->state & SOCKET_PRESENT) && !(status & SS_DETECT)) - socket_shutdown(skt); + socket_remove(skt); if (!(skt->state & SOCKET_PRESENT) && (status & SS_DETECT)) socket_insert(skt); @@ -839,8 +854,6 @@ static int pccardd(void *__skt) } remove_wait_queue(&skt->thread_wait, &wait); - socket_shutdown(skt); - complete_and_exit(&skt->thread_done, 0); } @@ -2213,7 +2226,7 @@ int pcmcia_eject_card(client_handle_t ha if (ret != 0) break; - socket_shutdown(skt); + socket_remove(skt); ret = CS_SUCCESS; } while (0); up(&skt->skt_sem); _