Commit d3332184 authored by David S. Miller's avatar David S. Miller

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: default avatarDavid S. Miller <davem@davemloft.net>
parents 1017e098 438b3d3f
...@@ -104,8 +104,10 @@ static u32 batadv_v_elp_get_throughput(struct batadv_hardif_neigh_node *neigh) ...@@ -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); ret = cfg80211_get_station(real_netdev, neigh->addr, &sinfo);
if (!ret) {
/* free the TID stats immediately */ /* free the TID stats immediately */
cfg80211_sinfo_release_content(&sinfo); cfg80211_sinfo_release_content(&sinfo);
}
dev_put(real_netdev); dev_put(real_netdev);
if (ret == -ENOENT) { if (ret == -ENOENT) {
......
...@@ -803,6 +803,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, ...@@ -803,6 +803,8 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv,
const u8 *mac, const unsigned short vid) const u8 *mac, const unsigned short vid)
{ {
struct batadv_bla_claim search_claim, *claim; 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); ether_addr_copy(search_claim.addr, mac);
search_claim.vid = vid; search_claim.vid = vid;
...@@ -813,10 +815,18 @@ static void batadv_bla_del_claim(struct batadv_priv *bat_priv, ...@@ -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__, batadv_dbg(BATADV_DBG_BLA, bat_priv, "%s(): %pM, vid %d\n", __func__,
mac, batadv_print_vid(vid)); mac, batadv_print_vid(vid));
batadv_hash_remove(bat_priv->bla.claim_hash, batadv_compare_claim, claim_removed_node = batadv_hash_remove(bat_priv->bla.claim_hash,
batadv_compare_claim,
batadv_choose_claim, claim); batadv_choose_claim, claim);
batadv_claim_put(claim); /* reference from the hash is gone */ 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 */ /* don't need the reference from hash_find() anymore */
batadv_claim_put(claim); batadv_claim_put(claim);
} }
......
...@@ -1116,9 +1116,9 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj, ...@@ -1116,9 +1116,9 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
struct attribute *attr, struct attribute *attr,
char *buff, size_t count) 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 net_device *net_dev = batadv_kobj_to_netdev(kobj);
struct batadv_hard_iface *hard_iface; struct batadv_hard_iface *hard_iface;
struct batadv_priv *bat_priv;
u32 tp_override; u32 tp_override;
u32 old_tp_override; u32 old_tp_override;
bool ret; bool ret;
...@@ -1147,7 +1147,10 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj, ...@@ -1147,7 +1147,10 @@ static ssize_t batadv_store_throughput_override(struct kobject *kobj,
atomic_set(&hard_iface->bat_v.throughput_override, tp_override); atomic_set(&hard_iface->bat_v.throughput_override, tp_override);
if (hard_iface->soft_iface) {
bat_priv = netdev_priv(hard_iface->soft_iface);
batadv_netlink_notify_hardif(bat_priv, hard_iface); batadv_netlink_notify_hardif(bat_priv, hard_iface);
}
out: out:
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
......
...@@ -616,14 +616,26 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv, ...@@ -616,14 +616,26 @@ static void batadv_tt_global_free(struct batadv_priv *bat_priv,
struct batadv_tt_global_entry *tt_global, struct batadv_tt_global_entry *tt_global,
const char *message) const char *message)
{ {
struct batadv_tt_global_entry *tt_removed_entry;
struct hlist_node *tt_removed_node;
batadv_dbg(BATADV_DBG_TT, bat_priv, batadv_dbg(BATADV_DBG_TT, bat_priv,
"Deleting global tt entry %pM (vid: %d): %s\n", "Deleting global tt entry %pM (vid: %d): %s\n",
tt_global->common.addr, tt_global->common.addr,
batadv_print_vid(tt_global->common.vid), message); batadv_print_vid(tt_global->common.vid), message);
batadv_hash_remove(bat_priv->tt.global_hash, batadv_compare_tt, tt_removed_node = batadv_hash_remove(bat_priv->tt.global_hash,
batadv_choose_tt, &tt_global->common); batadv_compare_tt,
batadv_tt_global_entry_put(tt_global); 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, ...@@ -1337,9 +1349,10 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr,
unsigned short vid, const char *message, unsigned short vid, const char *message,
bool roaming) bool roaming)
{ {
struct batadv_tt_local_entry *tt_removed_entry;
struct batadv_tt_local_entry *tt_local_entry; struct batadv_tt_local_entry *tt_local_entry;
u16 flags, curr_flags = BATADV_NO_FLAGS; 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); tt_local_entry = batadv_tt_local_hash_find(bat_priv, addr, vid);
if (!tt_local_entry) if (!tt_local_entry)
...@@ -1368,15 +1381,18 @@ u16 batadv_tt_local_remove(struct batadv_priv *bat_priv, const u8 *addr, ...@@ -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); 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_compare_tt,
batadv_choose_tt, batadv_choose_tt,
&tt_local_entry->common); &tt_local_entry->common);
if (!tt_entry_exists) if (!tt_removed_node)
goto out; goto out;
/* extra call to free the local tt entry */ /* drop reference of remove hash entry */
batadv_tt_local_entry_put(tt_local_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: out:
if (tt_local_entry) if (tt_local_entry)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment