|
@@ -225,9 +225,10 @@ static unsigned int tipc_hashfn(u32 addr)
|
|
|
|
|
|
static void tipc_node_kref_release(struct kref *kref)
|
|
|
{
|
|
|
- struct tipc_node *node = container_of(kref, struct tipc_node, kref);
|
|
|
+ struct tipc_node *n = container_of(kref, struct tipc_node, kref);
|
|
|
|
|
|
- tipc_node_delete(node);
|
|
|
+ kfree(n->bc_entry.link);
|
|
|
+ kfree_rcu(n, rcu);
|
|
|
}
|
|
|
|
|
|
static void tipc_node_put(struct tipc_node *node)
|
|
@@ -395,21 +396,20 @@ static void tipc_node_delete(struct tipc_node *node)
|
|
|
{
|
|
|
list_del_rcu(&node->list);
|
|
|
hlist_del_rcu(&node->hash);
|
|
|
- kfree(node->bc_entry.link);
|
|
|
- kfree_rcu(node, rcu);
|
|
|
+ tipc_node_put(node);
|
|
|
+
|
|
|
+ del_timer_sync(&node->timer);
|
|
|
+ tipc_node_put(node);
|
|
|
}
|
|
|
|
|
|
void tipc_node_stop(struct net *net)
|
|
|
{
|
|
|
- struct tipc_net *tn = net_generic(net, tipc_net_id);
|
|
|
+ struct tipc_net *tn = tipc_net(net);
|
|
|
struct tipc_node *node, *t_node;
|
|
|
|
|
|
spin_lock_bh(&tn->node_list_lock);
|
|
|
- list_for_each_entry_safe(node, t_node, &tn->node_list, list) {
|
|
|
- if (del_timer(&node->timer))
|
|
|
- tipc_node_put(node);
|
|
|
- tipc_node_put(node);
|
|
|
- }
|
|
|
+ list_for_each_entry_safe(node, t_node, &tn->node_list, list)
|
|
|
+ tipc_node_delete(node);
|
|
|
spin_unlock_bh(&tn->node_list_lock);
|
|
|
}
|
|
|
|
|
@@ -530,9 +530,7 @@ static void tipc_node_timeout(unsigned long data)
|
|
|
if (rc & TIPC_LINK_DOWN_EVT)
|
|
|
tipc_node_link_down(n, bearer_id, false);
|
|
|
}
|
|
|
- if (!mod_timer(&n->timer, jiffies + n->keepalive_intv))
|
|
|
- tipc_node_get(n);
|
|
|
- tipc_node_put(n);
|
|
|
+ mod_timer(&n->timer, jiffies + n->keepalive_intv);
|
|
|
}
|
|
|
|
|
|
/**
|