diff options
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r-- | net/tipc/node.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index 52fd80b0e728..3819ab14e073 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c | |||
@@ -370,13 +370,17 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr, | |||
370 | spin_lock_bh(&tn->node_list_lock); | 370 | spin_lock_bh(&tn->node_list_lock); |
371 | n = tipc_node_find(net, addr); | 371 | n = tipc_node_find(net, addr); |
372 | if (n) { | 372 | if (n) { |
373 | if (n->capabilities == capabilities) | ||
374 | goto exit; | ||
373 | /* Same node may come back with new capabilities */ | 375 | /* Same node may come back with new capabilities */ |
376 | write_lock_bh(&n->lock); | ||
374 | n->capabilities = capabilities; | 377 | n->capabilities = capabilities; |
375 | for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { | 378 | for (bearer_id = 0; bearer_id < MAX_BEARERS; bearer_id++) { |
376 | l = n->links[bearer_id].link; | 379 | l = n->links[bearer_id].link; |
377 | if (l) | 380 | if (l) |
378 | tipc_link_update_caps(l, capabilities); | 381 | tipc_link_update_caps(l, capabilities); |
379 | } | 382 | } |
383 | write_unlock_bh(&n->lock); | ||
380 | goto exit; | 384 | goto exit; |
381 | } | 385 | } |
382 | n = kzalloc(sizeof(*n), GFP_ATOMIC); | 386 | n = kzalloc(sizeof(*n), GFP_ATOMIC); |