|
@@ -418,20 +418,24 @@ int ieee80211_add_virtual_monitor(struct ieee80211_local *local)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+ mutex_lock(&local->iflist_mtx);
|
|
|
+ rcu_assign_pointer(local->monitor_sdata, sdata);
|
|
|
+ mutex_unlock(&local->iflist_mtx);
|
|
|
+
|
|
|
mutex_lock(&local->mtx);
|
|
|
ret = ieee80211_vif_use_channel(sdata, &local->monitor_chandef,
|
|
|
IEEE80211_CHANCTX_EXCLUSIVE);
|
|
|
mutex_unlock(&local->mtx);
|
|
|
if (ret) {
|
|
|
+ mutex_lock(&local->iflist_mtx);
|
|
|
+ rcu_assign_pointer(local->monitor_sdata, NULL);
|
|
|
+ mutex_unlock(&local->iflist_mtx);
|
|
|
+ synchronize_net();
|
|
|
drv_remove_interface(local, sdata);
|
|
|
kfree(sdata);
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
- mutex_lock(&local->iflist_mtx);
|
|
|
- rcu_assign_pointer(local->monitor_sdata, sdata);
|
|
|
- mutex_unlock(&local->iflist_mtx);
|
|
|
-
|
|
|
return 0;
|
|
|
}
|
|
|
|