aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/tipc/node.c')
-rw-r--r--net/tipc/node.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 2dc4919ab23c..2717893e9dbe 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -383,6 +383,11 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,
383 tipc_link_update_caps(l, capabilities); 383 tipc_link_update_caps(l, capabilities);
384 } 384 }
385 write_unlock_bh(&n->lock); 385 write_unlock_bh(&n->lock);
386 /* Calculate cluster capabilities */
387 tn->capabilities = TIPC_NODE_CAPABILITIES;
388 list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
389 tn->capabilities &= temp_node->capabilities;
390 }
386 goto exit; 391 goto exit;
387 } 392 }
388 n = kzalloc(sizeof(*n), GFP_ATOMIC); 393 n = kzalloc(sizeof(*n), GFP_ATOMIC);
@@ -433,6 +438,11 @@ static struct tipc_node *tipc_node_create(struct net *net, u32 addr,
433 break; 438 break;
434 } 439 }
435 list_add_tail_rcu(&n->list, &temp_node->list); 440 list_add_tail_rcu(&n->list, &temp_node->list);
441 /* Calculate cluster capabilities */
442 tn->capabilities = TIPC_NODE_CAPABILITIES;
443 list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
444 tn->capabilities &= temp_node->capabilities;
445 }
436 trace_tipc_node_create(n, true, " "); 446 trace_tipc_node_create(n, true, " ");
437exit: 447exit:
438 spin_unlock_bh(&tn->node_list_lock); 448 spin_unlock_bh(&tn->node_list_lock);
@@ -589,6 +599,7 @@ static void tipc_node_clear_links(struct tipc_node *node)
589 */ 599 */
590static bool tipc_node_cleanup(struct tipc_node *peer) 600static bool tipc_node_cleanup(struct tipc_node *peer)
591{ 601{
602 struct tipc_node *temp_node;
592 struct tipc_net *tn = tipc_net(peer->net); 603 struct tipc_net *tn = tipc_net(peer->net);
593 bool deleted = false; 604 bool deleted = false;
594 605
@@ -604,6 +615,13 @@ static bool tipc_node_cleanup(struct tipc_node *peer)
604 deleted = true; 615 deleted = true;
605 } 616 }
606 tipc_node_write_unlock(peer); 617 tipc_node_write_unlock(peer);
618
619 /* Calculate cluster capabilities */
620 tn->capabilities = TIPC_NODE_CAPABILITIES;
621 list_for_each_entry_rcu(temp_node, &tn->node_list, list) {
622 tn->capabilities &= temp_node->capabilities;
623 }
624
607 spin_unlock_bh(&tn->node_list_lock); 625 spin_unlock_bh(&tn->node_list_lock);
608 return deleted; 626 return deleted;
609} 627}