On Fri, 2013-03-29 at 09:00 -0700, greearb@xxxxxxxxxxxxxxx wrote: > --- a/net/mac80211/cfg.c > +++ b/net/mac80211/cfg.c > @@ -1287,6 +1287,7 @@ static int ieee80211_change_station(struct wiphy *wiphy, > if (params->vlan && params->vlan != sta->sdata->dev) { > bool prev_4addr = false; > bool new_4addr = false; > + struct sta_info *some_sta; > > vlansdata = IEEE80211_DEV_TO_SUB_IF(params->vlan); > > @@ -1312,7 +1313,12 @@ static int ieee80211_change_station(struct wiphy *wiphy, > prev_4addr = true; > } > > + some_sta = rcu_dereference_protected(sta->sdata->some_sta, > + lockdep_is_held(&local->sta_mtx)); > + if (some_sta == sta) > + rcu_assign_pointer(sta->sdata->some_sta, NULL); > sta->sdata = vlansdata; > + rcu_assign_pointer(sta->sdata->some_sta, sta); > > if (sta->sta_state == IEEE80211_STA_AUTHORIZED && > prev_4addr != new_4addr) { I think you can drop all this code since you don't allow this for non-station interfaces, and stations here can only be reassigned between AP/AP_VLAN, no? > @@ -278,6 +297,8 @@ static void sta_info_hash_add(struct ieee80211_local *local, > lockdep_assert_held(&local->sta_mtx); > sta->hnext = local->sta_hash[STA_HASH(sta->sta.addr)]; > rcu_assign_pointer(local->sta_hash[STA_HASH(sta->sta.addr)], sta); > + > + rcu_assign_pointer(sta->sdata->some_sta, sta); Maybe also assign it only for station to start with? johannes -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html