diff options
author | Johannes Berg <johannes.berg@intel.com> | 2015-04-23 14:02:30 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2015-04-23 16:40:40 +0200 |
commit | 60f4b626d5b5c5724b010200a8c2ff3169f6f4db (patch) | |
tree | fb4ac7171196117f229e235db3c0b20de099cb86 /net/mac80211/sta_info.c | |
parent | mac80211: don't warn when stopping VLAN with stations (diff) | |
download | linux-60f4b626d5b5c5724b010200a8c2ff3169f6f4db.tar.xz linux-60f4b626d5b5c5724b010200a8c2ff3169f6f4db.zip |
mac80211: fix rhashtable conversion
My conversion of the mac80211 station hash table to rhashtable
completely broke the lookup in sta_info_get() as it no longer
took into account the virtual interface. Fix that.
Fixes: 7bedd0cfad4e1 ("mac80211: use rhashtable for station table")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/sta_info.c')
-rw-r--r-- | net/mac80211/sta_info.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 12971b71d0fa..39893178a1a9 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -157,8 +157,24 @@ struct sta_info *sta_info_get(struct ieee80211_sub_if_data *sdata, const u8 *addr) { struct ieee80211_local *local = sdata->local; + struct sta_info *sta; + struct rhash_head *tmp; + const struct bucket_table *tbl; + + rcu_read_lock(); + tbl = rht_dereference_rcu(local->sta_hash.tbl, &local->sta_hash); - return rhashtable_lookup_fast(&local->sta_hash, addr, sta_rht_params); + for_each_sta_info(local, tbl, addr, sta, tmp) { + if (sta->sdata == sdata) { + rcu_read_unlock(); + /* this is safe as the caller must already hold + * another rcu read section or the mutex + */ + return sta; + } + } + rcu_read_unlock(); + return NULL; } /* |