--- x/net/netrom/nr_route.c +++ y/net/netrom/nr_route.c @@ -511,9 +511,12 @@ void nr_rt_device_down(struct net_device struct nr_node *t; int i; +loop: spin_lock_bh(&nr_neigh_list_lock); nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) { if (s->dev == dev) { + nr_remove_neigh_locked(s); + spin_unlock_bh(&nr_neigh_list_lock); spin_lock_bh(&nr_node_list_lock); nr_node_for_each_safe(t, node2t, &nr_node_list) { nr_node_lock(t); @@ -539,8 +542,7 @@ void nr_rt_device_down(struct net_device nr_node_unlock(t); } spin_unlock_bh(&nr_node_list_lock); - - nr_remove_neigh_locked(s); + goto loop; } } spin_unlock_bh(&nr_neigh_list_lock);