mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 16:24:13 +08:00
hostap_cs: fix sleeping function called from invalid context
pcmcia_request_irq() and pcmcia_enable_device() are intended to be called from process context (first function allocate memory with GFP_KERNEL, second take a mutex). We can not take spin lock and call them. It's safe to move spin lock after pcmcia_enable_device() as we still hold off IRQ until dev->base_addr is 0 and driver will not proceed with interrupts when is not ready. Patch resolves: https://bugzilla.redhat.com/show_bug.cgi?id=643758 Reported-and-tested-by: rbugz@biobind.com Cc: stable@kernel.org # 2.6.34+ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
3c4a8cc46e
commit
4e5518ca53
@ -518,22 +518,21 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
hw_priv->link = link;
|
||||
|
||||
/*
|
||||
* Make sure the IRQ handler cannot proceed until at least
|
||||
* dev->base_addr is initialized.
|
||||
* We enable IRQ here, but IRQ handler will not proceed
|
||||
* until dev->base_addr is set below. This protect us from
|
||||
* receive interrupts when driver is not initialized.
|
||||
*/
|
||||
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||
|
||||
ret = pcmcia_request_irq(link, prism2_interrupt);
|
||||
if (ret)
|
||||
goto failed_unlock;
|
||||
goto failed;
|
||||
|
||||
ret = pcmcia_enable_device(link);
|
||||
if (ret)
|
||||
goto failed_unlock;
|
||||
goto failed;
|
||||
|
||||
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||
dev->irq = link->irq;
|
||||
dev->base_addr = link->resource[0]->start;
|
||||
|
||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||
|
||||
local->shutdown = 0;
|
||||
@ -546,8 +545,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||
|
||||
return ret;
|
||||
|
||||
failed_unlock:
|
||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||
failed:
|
||||
kfree(hw_priv);
|
||||
prism2_release((u_long)link);
|
||||
|
Loading…
Reference in New Issue
Block a user