diff options
Diffstat (limited to 'net/mac80211/mesh.c')
-rw-r--r-- | net/mac80211/mesh.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index 9e47725cc592..a0141f5ff184 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c | |||
@@ -449,6 +449,15 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) | |||
449 | { | 449 | { |
450 | del_timer_sync(&sdata->u.mesh.housekeeping_timer); | 450 | del_timer_sync(&sdata->u.mesh.housekeeping_timer); |
451 | /* | 451 | /* |
452 | * If the timer fired while we waited for it, it will have | ||
453 | * requeued the work. Now the work will be running again | ||
454 | * but will not rearm the timer again because it checks | ||
455 | * whether the interface is running, which, at this point, | ||
456 | * it no longer is. | ||
457 | */ | ||
458 | cancel_work_sync(&sdata->u.mesh.work); | ||
459 | |||
460 | /* | ||
452 | * When we get here, the interface is marked down. | 461 | * When we get here, the interface is marked down. |
453 | * Call synchronize_rcu() to wait for the RX path | 462 | * Call synchronize_rcu() to wait for the RX path |
454 | * should it be using the interface and enqueuing | 463 | * should it be using the interface and enqueuing |