diff options
author | Daniel Ritz <daniel.ritz@gmx.ch> | 2005-09-10 00:03:23 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-10 00:57:47 +0400 |
commit | bf4de6f2db79f3c396bd884f546cd2ea91a686f2 (patch) | |
tree | 6d2dc0b8ba8b91ea75d57c018d3958142c25eaef /drivers/pcmcia/cs.c | |
parent | b3743fa4442fc172e950ff0eaf6aa96e7d5ce9be (diff) | |
download | linux-bf4de6f2db79f3c396bd884f546cd2ea91a686f2.tar.xz |
[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 <daniel.ritz@gmx.ch>
Cc: Dominik Brodowski <linux@brodo.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers/pcmcia/cs.c')
-rw-r--r-- | drivers/pcmcia/cs.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index e39178fc59d0..fabd3529cebc 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); |