batman-adv: Drop reference to netdevice on last reference
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>
This commit is contained in:
parent
aaa5672052
commit
140ed8e87c
@ -47,13 +47,16 @@
|
|||||||
#include "sysfs.h"
|
#include "sysfs.h"
|
||||||
#include "translation-table.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);
|
dev_put(hard_iface->net_dev);
|
||||||
kfree(hard_iface);
|
|
||||||
|
kfree_rcu(hard_iface, rcu);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct batadv_hard_iface *
|
struct batadv_hard_iface *
|
||||||
|
@ -61,18 +61,18 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
|
|||||||
void batadv_hardif_remove_interfaces(void);
|
void batadv_hardif_remove_interfaces(void);
|
||||||
int batadv_hardif_min_mtu(struct net_device *soft_iface);
|
int batadv_hardif_min_mtu(struct net_device *soft_iface);
|
||||||
void batadv_update_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
|
* batadv_hardif_free_ref - decrement the hard interface refcounter and
|
||||||
* possibly free it
|
* possibly release it
|
||||||
* @hard_iface: the hard interface to free
|
* @hard_iface: the hard interface to free
|
||||||
*/
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface)
|
batadv_hardif_free_ref(struct batadv_hard_iface *hard_iface)
|
||||||
{
|
{
|
||||||
if (atomic_dec_and_test(&hard_iface->refcount))
|
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 *
|
static inline struct batadv_hard_iface *
|
||||||
|
Loading…
Reference in New Issue
Block a user