batman-adv: Drop reference to netdevice on last reference
authorSven Eckelmann <sven@narfation.org>
Tue, 5 Jan 2016 11:06:26 +0000 (12:06 +0100)
committerAntonio Quartulli <a@unstable.cc>
Wed, 10 Feb 2016 15:23:57 +0000 (23:23 +0800)
The references to the network device should be dropped inside the release
function for batadv_hard_iface similar to what is done with the batman-adv
internal datastructures.

Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
Signed-off-by: Antonio Quartulli <a@unstable.cc>
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h

index db90022..b17e272 100644 (file)
 #include "sysfs.h"
 #include "translation-table.h"
 
-void batadv_hardif_free_rcu(struct rcu_head *rcu)
+/**
+ * batadv_hardif_release - release hard interface from lists and queue for
+ *  free after rcu grace period
+ * @hard_iface: the hard interface to free
+ */
+void batadv_hardif_release(struct batadv_hard_iface *hard_iface)
 {
-       struct batadv_hard_iface *hard_iface;
-
-       hard_iface = container_of(rcu, struct batadv_hard_iface, rcu);
        dev_put(hard_iface->net_dev);
-       kfree(hard_iface);
+
+       kfree_rcu(hard_iface, rcu);
 }
 
 struct batadv_hard_iface *
index 4d6b5e1..9eb08ad 100644 (file)
@@ -61,18 +61,18 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
 void batadv_hardif_remove_interfaces(void);
 int batadv_hardif_min_mtu(struct net_device *soft_iface);
 void batadv_update_min_mtu(struct net_device *soft_iface);
-void batadv_hardif_free_rcu(struct rcu_head *rcu);
+void batadv_hardif_release(struct batadv_hard_iface *hard_iface);
 
 /**
  * batadv_hardif_free_ref - decrement the hard interface refcounter and
- *  possibly free it
+ *  possibly release it
  * @hard_iface: the hard interface to free
  */
 static inline void
 batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface)
 {
        if (atomic_dec_and_test(&hard_iface->refcount))
-               call_rcu(&hard_iface->rcu, batadv_hardif_free_rcu);
+               batadv_hardif_release(hard_iface);
 }
 
 static inline struct batadv_hard_iface *