aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pcmcia/cs.c
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2006-06-30 04:31:13 -0400
committerDominik Brodowski <linux@dominikbrodowski.net>2006-06-30 16:09:13 -0400
commit4b7a89a3c1cf545b03470416aa821fc2ff826b91 (patch)
treeba2d19e733eeb891dafd91b1dbe39e9bbf26f16e /drivers/pcmcia/cs.c
parent6bb1c39a43d23e4cecc7e815491b6964c6758a29 (diff)
[PATCH] pcmcia: fix deadlock in pcmcia_parse_events
The PCMCIA layer calls pcmcia_parse_events both from user context and IRQ context; the lock thus needs to be irqsave to avoid deadlocks Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Diffstat (limited to 'drivers/pcmcia/cs.c')
-rw-r--r--drivers/pcmcia/cs.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c
index 06e2cda4e07b..f9cd831a3f31 100644
--- a/drivers/pcmcia/cs.c
+++ b/drivers/pcmcia/cs.c
@@ -699,11 +699,12 @@ static int pccardd(void *__skt)
699 */ 699 */
700void pcmcia_parse_events(struct pcmcia_socket *s, u_int events) 700void pcmcia_parse_events(struct pcmcia_socket *s, u_int events)
701{ 701{
702 unsigned long flags;
702 cs_dbg(s, 4, "parse_events: events %08x\n", events); 703 cs_dbg(s, 4, "parse_events: events %08x\n", events);
703 if (s->thread) { 704 if (s->thread) {
704 spin_lock(&s->thread_lock); 705 spin_lock_irqsave(&s->thread_lock, flags);
705 s->thread_events |= events; 706 s->thread_events |= events;
706 spin_unlock(&s->thread_lock); 707 spin_unlock_irqrestore(&s->thread_lock, flags);
707 708
708 wake_up(&s->thread_wait); 709 wake_up(&s->thread_wait);
709 } 710 }