The master (soft-interface) should remove the references to its soft-interfaces before it gets destroyed. Otherwise the usage count of the interface will not be zero and therefore the net_device cannot be removed. This leads to an endless hang of the unregister call.
Signed-off-by: Sven Eckelmann sven@narfation.org --- net/batman-adv/soft-interface.c | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/net/batman-adv/soft-interface.c b/net/batman-adv/soft-interface.c index 8467b9f..5fd0560 100644 --- a/net/batman-adv/soft-interface.c +++ b/net/batman-adv/soft-interface.c @@ -546,6 +546,14 @@ struct net_device *batadv_softif_create(const char *name)
void batadv_softif_destroy(struct net_device *soft_iface) { + struct batadv_hard_iface *hard_iface; + + list_for_each_entry(hard_iface, &batadv_hardif_list, list) { + if (hard_iface->soft_iface == soft_iface) + batadv_hardif_disable_interface(hard_iface, + BATADV_IF_CLEANUP_KEEP); + } + batadv_sysfs_del_meshif(soft_iface); unregister_netdevice(soft_iface); }