batman-adv: Drop reference to netdevice on last reference
authorSven Eckelmann <sven@narfation.org>
Tue, 17 Mar 2020 23:26:55 +0000 (00:26 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 20 Mar 2020 08:06:25 +0000 (09:06 +0100)
commit 140ed8e87ca8f4875c2b146cdb2cdbf0c9ac6080 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/batman-adv/hard-interface.c
net/batman-adv/hard-interface.h

index ecaa68ae62f5d41508394040d008c152d212d254..cc3be5489f5c8de904be45044e90df97186f7562 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 7b12ea8ea29d1a398f649b40c97106705bcd2289..4d74c04159114654d30ab6eb690532ee0d7e5a16 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 *