From: Daniel Ritz Date: Fri, 9 Sep 2005 20:03:23 +0000 (-0700) Subject: [PATCH] pcmcia/cs: fix possible missed wakeup X-Git-Tag: v2.6.14-rc1~382 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=bf4de6f2db79f3c396bd884f546cd2ea91a686f2;p=linux-2.6-omap-h63xx.git [PATCH] pcmcia/cs: fix possible missed wakeup - thread_done should only be completed when the wait_queue is installed. - all wake up conditions should be checked before schedule() this fixes a hang of rmmod in the sequence modprobe yenta_socket; rmmod yenta_socket as reported by Andreas Steinmetz. w/o this rmmod yenta_socket can hang on wait_for_completion() in pcmcia_unregister_socket() Signed-off-by: Daniel Ritz Cc: Dominik Brodowski Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index e39178fc59d..fabd3529ceb 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -654,9 +654,10 @@ static int pccardd(void *__skt) skt->thread = NULL; complete_and_exit(&skt->thread_done, 0); } - complete(&skt->thread_done); add_wait_queue(&skt->thread_wait, &wait); + complete(&skt->thread_done); + for (;;) { unsigned long flags; unsigned int events; @@ -682,11 +683,11 @@ static int pccardd(void *__skt) continue; } - schedule(); - try_to_freeze(); - if (!skt->thread) break; + + schedule(); + try_to_freeze(); } remove_wait_queue(&skt->thread_wait, &wait);