mirror of
https://github.com/torvalds/linux.git
synced 2024-11-15 16:41:58 +00:00
[PATCH] softmac: Fix deadlock of wx_set_essid with assoc work
The essid wireless extension does deadlock against the assoc mutex, as we don't unlock the assoc mutex when flushing the workqueue, which also holds the lock. Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
69dad6e563
commit
fdc8f43b5e
@ -74,8 +74,8 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev,
|
|||||||
struct ieee80211softmac_auth_queue_item *authptr;
|
struct ieee80211softmac_auth_queue_item *authptr;
|
||||||
int length = 0;
|
int length = 0;
|
||||||
|
|
||||||
|
check_assoc_again:
|
||||||
mutex_lock(&sm->associnfo.mutex);
|
mutex_lock(&sm->associnfo.mutex);
|
||||||
|
|
||||||
/* Check if we're already associating to this or another network
|
/* Check if we're already associating to this or another network
|
||||||
* If it's another network, cancel and start over with our new network
|
* If it's another network, cancel and start over with our new network
|
||||||
* If it's our network, ignore the change, we're already doing it!
|
* If it's our network, ignore the change, we're already doing it!
|
||||||
@ -98,13 +98,18 @@ ieee80211softmac_wx_set_essid(struct net_device *net_dev,
|
|||||||
cancel_delayed_work(&authptr->work);
|
cancel_delayed_work(&authptr->work);
|
||||||
sm->associnfo.bssvalid = 0;
|
sm->associnfo.bssvalid = 0;
|
||||||
sm->associnfo.bssfixed = 0;
|
sm->associnfo.bssfixed = 0;
|
||||||
flush_scheduled_work();
|
|
||||||
sm->associnfo.associating = 0;
|
sm->associnfo.associating = 0;
|
||||||
sm->associnfo.associated = 0;
|
sm->associnfo.associated = 0;
|
||||||
|
/* We must unlock to avoid deadlocks with the assoc workqueue
|
||||||
|
* on the associnfo.mutex */
|
||||||
|
mutex_unlock(&sm->associnfo.mutex);
|
||||||
|
flush_scheduled_work();
|
||||||
|
/* Avoid race! Check assoc status again. Maybe someone started an
|
||||||
|
* association while we flushed. */
|
||||||
|
goto check_assoc_again;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
sm->associnfo.static_essid = 0;
|
sm->associnfo.static_essid = 0;
|
||||||
sm->associnfo.assoc_wait = 0;
|
sm->associnfo.assoc_wait = 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user