Merge tag 'batadv-net-for-davem-20190328' of git://git.open-mesh.org/linux-merge
Simon Wunderlich says: ==================== Here are some batman-adv bugfixes: - Fix refcount underflows in bridge loop avoidance code, by Sven Eckelmann (3 patches) - Fix warning when CFG80211 isn't enabled, by Anders Roxell - Fix genl notification for throughput override, by Sven Eckelmann ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -104,8 +104,10 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh)
|
||||
|
||||
ret = cfg80211_get_station(real_netdev, neigh->addr, &sinfo);
|
||||
|
||||
/* free the TID stats immediately */
|
||||
cfg80211_sinfo_release_content(&sinfo);
|
||||
if (!ret) {
|
||||
/* free the TID stats immediately */
|
||||
cfg80211_sinfo_release_content(&sinfo);
|
||||
}
|
||||
|
||||
dev_put(real_netdev);
|
||||
if (ret == -ENOENT) {
|
||||
|
@@ -803,6 +803,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
|
||||
const u8 *mac, const unsigned short vid)
|
||||
{
|
||||
struct batadv_bla_claim search_claim, *claim;
|
||||
struct batadv_bla_claim *claim_removed_entry;
|
||||
struct hlist_node *claim_removed_node;
|
||||
|
||||
ether_addr_copy(search_claim.addr, mac);
|
||||
search_claim.vid = vid;
|
||||
@@ -813,10 +815,18 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
|
||||
batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__,
|
||||
mac, batadv_print_vid(vid));
|
||||
|
||||
batadv_hash_remove(bat_priv->bla.claim_hash, batadv_compare_claim,
|
||||
batadv_choose_claim, claim);
|
||||
batadv_claim_put(claim); /* reference from the hash is gone */
|
||||
claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash,
|
||||
batadv_compare_claim,
|
||||
batadv_choose_claim, claim);
|
||||
if (!claim_removed_node)
|
||||
goto free_claim;
|
||||
|
||||
/* reference from the hash is gone */
|
||||
claim_removed_entry = hlist_entry(claim_removed_node,
|
||||
struct batadv_bla_claim, hash_entry);
|
||||
batadv_claim_put(claim_removed_entry);
|
||||
|
||||
free_claim:
|
||||
/* don't need the reference from hash_find() anymore */
|
||||
batadv_claim_put(claim);
|
||||
}
|
||||
|
@@ -1116,9 +1116,9 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
|
||||
struct attribute *attr,
|
||||
char *buff, size_t count)
|
||||
{
|
||||
struct batadv_priv *bat_priv = batadv_kobj_to_batpriv(kobj);
|
||||
struct net_device *net_dev = batadv_kobj_to_netdev(kobj);
|
||||
struct batadv_hard_iface *hard_iface;
|
||||
struct batadv_priv *bat_priv;
|
||||
u32 tp_override;
|
||||
u32 old_tp_override;
|
||||
bool ret;
|
||||
@@ -1147,7 +1147,10 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
|
||||
|
||||
atomic_set(&hard_iface->bat_v.throughput_override, tp_override);
|
||||
|
||||
batadv_netlink_notify_hardif(bat_priv, hard_iface);
|
||||
if (hard_iface->soft_iface) {
|
||||
bat_priv = netdev_priv(hard_iface->soft_iface);
|
||||
batadv_netlink_notify_hardif(bat_priv, hard_iface);
|
||||
}
|
||||
|
||||
out:
|
||||
batadv_hardif_put(hard_iface);
|
||||
|
@@ -616,14 +616,26 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
|
||||
struct batadv_tt_global_entry *tt_global,
|
||||
const char *message)
|
||||
{
|
||||
struct batadv_tt_global_entry *tt_removed_entry;
|
||||
struct hlist_node *tt_removed_node;
|
||||
|
||||
batadv_dbg(BATADV_DBG_TT, bat_priv,
|
||||
"Deleting global tt entry %pM (vid: %d): %s\n",
|
||||
tt_global->common.addr,
|
||||
batadv_print_vid(tt_global->common.vid), message);
|
||||
|
||||
batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt,
|
||||
batadv_choose_tt, &tt_global->common);
|
||||
batadv_tt_global_entry_put(tt_global);
|
||||
tt_removed_node = batadv_hash_remove(bat_priv->tt.global_hash,
|
||||
batadv_compare_tt,
|
||||
batadv_choose_tt,
|
||||
&tt_global->common);
|
||||
if (!tt_removed_node)
|
||||
return;
|
||||
|
||||
/* drop reference of remove hash entry */
|
||||
tt_removed_entry = hlist_entry(tt_removed_node,
|
||||
struct batadv_tt_global_entry,
|
||||
common.hash_entry);
|
||||
batadv_tt_global_entry_put(tt_removed_entry);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1337,9 +1349,10 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
|
||||
unsigned short vid, const char *message,
|
||||
bool roaming)
|
||||
{
|
||||
struct batadv_tt_local_entry *tt_removed_entry;
|
||||
struct batadv_tt_local_entry *tt_local_entry;
|
||||
u16 flags, curr_flags = BATADV_NO_FLAGS;
|
||||
void *tt_entry_exists;
|
||||
struct hlist_node *tt_removed_node;
|
||||
|
||||
tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
|
||||
if (!tt_local_entry)
|
||||
@@ -1368,15 +1381,18 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
|
||||
*/
|
||||
batadv_tt_local_event(bat_priv, tt_local_entry, BATADV_TT_CLIENT_DEL);
|
||||
|
||||
tt_entry_exists = batadv_hash_remove(bat_priv->tt.local_hash,
|
||||
tt_removed_node = batadv_hash_remove(bat_priv->tt.local_hash,
|
||||
batadv_compare_tt,
|
||||
batadv_choose_tt,
|
||||
&tt_local_entry->common);
|
||||
if (!tt_entry_exists)
|
||||
if (!tt_removed_node)
|
||||
goto out;
|
||||
|
||||
/* extra call to free the local tt entry */
|
||||
batadv_tt_local_entry_put(tt_local_entry);
|
||||
/* drop reference of remove hash entry */
|
||||
tt_removed_entry = hlist_entry(tt_removed_node,
|
||||
struct batadv_tt_local_entry,
|
||||
common.hash_entry);
|
||||
batadv_tt_local_entry_put(tt_removed_entry);
|
||||
|
||||
out:
|
||||
if (tt_local_entry)
|
||||
|
Reference in New Issue
Block a user