aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/node.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-02-04 19:09:38 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-04 19:09:38 -0500
commit251c005a6403933b3405fdc15fca4355e7590b42 (patch)
tree9804ac41fbf6758b52ebec7c981a714d9d9199bd /net/tipc/node.c
parent940288b6a560710d4c63bc84d9570779dd7dec2b (diff)
parentaf9946fde9983e1312e5bcda7d1658fee2a3cb1d (diff)
Merge branch 'tipc-next'
Jon Maloy says: ==================== tipc: some small fixes During extensive testing and analysis of running dual links between nodes, we have encountered some issues that potentially may cause problems. We choose to fix those proactively in this series. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r--net/tipc/node.c15
1 files changed, 9 insertions, 6 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c
index ee5d33cfcf80..842bd7ad4b17 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -96,14 +96,14 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr)
96 struct tipc_node *n_ptr, *temp_node; 96 struct tipc_node *n_ptr, *temp_node;
97 97
98 spin_lock_bh(&tn->node_list_lock); 98 spin_lock_bh(&tn->node_list_lock);
99 99 n_ptr = tipc_node_find(net, addr);
100 if (n_ptr)
101 goto exit;
100 n_ptr = kzalloc(sizeof(*n_ptr), GFP_ATOMIC); 102 n_ptr = kzalloc(sizeof(*n_ptr), GFP_ATOMIC);
101 if (!n_ptr) { 103 if (!n_ptr) {
102 spin_unlock_bh(&tn->node_list_lock);
103 pr_warn("Node creation failed, no memory\n"); 104 pr_warn("Node creation failed, no memory\n");
104 return NULL; 105 goto exit;
105 } 106 }
106
107 n_ptr->addr = addr; 107 n_ptr->addr = addr;
108 n_ptr->net = net; 108 n_ptr->net = net;
109 spin_lock_init(&n_ptr->lock); 109 spin_lock_init(&n_ptr->lock);
@@ -123,9 +123,8 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr)
123 list_add_tail_rcu(&n_ptr->list, &temp_node->list); 123 list_add_tail_rcu(&n_ptr->list, &temp_node->list);
124 n_ptr->action_flags = TIPC_WAIT_PEER_LINKS_DOWN; 124 n_ptr->action_flags = TIPC_WAIT_PEER_LINKS_DOWN;
125 n_ptr->signature = INVALID_NODE_SIG; 125 n_ptr->signature = INVALID_NODE_SIG;
126
127 tn->num_nodes++; 126 tn->num_nodes++;
128 127exit:
129 spin_unlock_bh(&tn->node_list_lock); 128 spin_unlock_bh(&tn->node_list_lock);
130 return n_ptr; 129 return n_ptr;
131} 130}
@@ -406,6 +405,10 @@ static void node_lost_contact(struct tipc_node *n_ptr)
406 l_ptr->reset_checkpoint = l_ptr->next_in_no; 405 l_ptr->reset_checkpoint = l_ptr->next_in_no;
407 l_ptr->exp_msg_count = 0; 406 l_ptr->exp_msg_count = 0;
408 tipc_link_reset_fragments(l_ptr); 407 tipc_link_reset_fragments(l_ptr);
408
409 /* Link marked for deletion after failover? => do it now */
410 if (l_ptr->flags & LINK_STOPPED)
411 tipc_link_delete(l_ptr);
409 } 412 }
410 413
411 n_ptr->action_flags &= ~TIPC_WAIT_OWN_LINKS_DOWN; 414 n_ptr->action_flags &= ~TIPC_WAIT_OWN_LINKS_DOWN;