Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf4de6f2 authored by Daniel Ritz's avatar Daniel Ritz Committed by Linus Torvalds
Browse files

[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: default avatarDaniel Ritz <daniel.ritz@gmx.ch>
Cc: Dominik Brodowski <linux@brodo.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent b3743fa4
Loading
Loading
Loading
Loading
+5 −4
Original line number Diff line number Diff line
@@ -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);