net: Add netdev all_adj_list refcnt propagation to fix panic
[firefly-linux-kernel-4.4.55.git] / net / batman-adv / main.c
index 40750cbe4f4f3121abc356aab09993bbd61f9c59..d7f17c1aa4a4bd75014c27443175cc9afc92f8df 100644 (file)
@@ -30,6 +30,7 @@
 #include <linux/ipv6.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <linux/lockdep.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/netdevice.h>
@@ -148,7 +149,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
        INIT_HLIST_HEAD(&bat_priv->mcast.want_all_ipv6_list);
 #endif
        INIT_LIST_HEAD(&bat_priv->tt.changes_list);
-       INIT_LIST_HEAD(&bat_priv->tt.req_list);
+       INIT_HLIST_HEAD(&bat_priv->tt.req_list);
        INIT_LIST_HEAD(&bat_priv->tt.roam_list);
 #ifdef CONFIG_BATMAN_ADV_MCAST
        INIT_HLIST_HEAD(&bat_priv->mcast.mla_list);
@@ -198,7 +199,7 @@ void batadv_mesh_free(struct net_device *soft_iface)
 
        batadv_purge_outstanding_packets(bat_priv, NULL);
 
-       batadv_gw_node_purge(bat_priv);
+       batadv_gw_node_free(bat_priv);
        batadv_nc_mesh_free(bat_priv);
        batadv_dat_free(bat_priv);
        batadv_bla_free(bat_priv);
@@ -583,7 +584,7 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
        seq_puts(seq, "Available routing algorithms:\n");
 
        hlist_for_each_entry(bat_algo_ops, &batadv_algo_list, list) {
-               seq_printf(seq, "%s\n", bat_algo_ops->name);
+               seq_printf(seq, " * %s\n", bat_algo_ops->name);
        }
 
        return 0;
@@ -737,13 +738,17 @@ static u16 batadv_tvlv_container_list_size(struct batadv_priv *bat_priv)
 /**
  * batadv_tvlv_container_remove - remove tvlv container from the tvlv container
  *  list
+ * @bat_priv: the bat priv with all the soft interface information
  * @tvlv: the to be removed tvlv container
  *
  * Has to be called with the appropriate locks being acquired
  * (tvlv.container_list_lock).
  */
-static void batadv_tvlv_container_remove(struct batadv_tvlv_container *tvlv)
+static void batadv_tvlv_container_remove(struct batadv_priv *bat_priv,
+                                        struct batadv_tvlv_container *tvlv)
 {
+       lockdep_assert_held(&bat_priv->tvlv.handler_list_lock);
+
        if (!tvlv)
                return;
 
@@ -768,7 +773,7 @@ void batadv_tvlv_container_unregister(struct batadv_priv *bat_priv,
 
        spin_lock_bh(&bat_priv->tvlv.container_list_lock);
        tvlv = batadv_tvlv_container_get(bat_priv, type, version);
-       batadv_tvlv_container_remove(tvlv);
+       batadv_tvlv_container_remove(bat_priv, tvlv);
        spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
 }
 
@@ -807,7 +812,7 @@ void batadv_tvlv_container_register(struct batadv_priv *bat_priv,
 
        spin_lock_bh(&bat_priv->tvlv.container_list_lock);
        tvlv_old = batadv_tvlv_container_get(bat_priv, type, version);
-       batadv_tvlv_container_remove(tvlv_old);
+       batadv_tvlv_container_remove(bat_priv, tvlv_old);
        hlist_add_head(&tvlv_new->list, &bat_priv->tvlv.container_list);
        spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
 }