summary refs log tree commit diff
path: root/net
diff options
context:
space:
mode:
Diffstat (limited to 'net')
-rw-r--r--net/tipc/net.c3
-rw-r--r--net/tipc/net.h4
-rw-r--r--net/tipc/node.c7
3 files changed, 8 insertions, 6 deletions
diff --git a/net/tipc/net.c b/net/tipc/net.c
index 9bacfd00b91e..dd78d869829f 100644
--- a/net/tipc/net.c
+++ b/net/tipc/net.c
@@ -2,7 +2,7 @@
  * net/tipc/net.c: TIPC network routing code
  *
  * Copyright (c) 1995-2006, Ericsson AB
- * Copyright (c) 2005, Wind River Systems
+ * Copyright (c) 2005, 2010-2011, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -115,6 +115,7 @@ static int net_start(void)
 	tipc_net.nodes = kcalloc(tipc_max_nodes + 1,
 				 sizeof(*tipc_net.nodes), GFP_ATOMIC);
 	tipc_net.highest_node = 0;
+	atomic_set(&tipc_net.links, 0);
 
 	return tipc_net.nodes ? 0 : -ENOMEM;
 }
diff --git a/net/tipc/net.h b/net/tipc/net.h
index 4ae59ad04893..aa431ef8b7bf 100644
--- a/net/tipc/net.h
+++ b/net/tipc/net.h
@@ -2,7 +2,7 @@
  * net/tipc/net.h: Include file for TIPC network routing code
  *
  * Copyright (c) 1995-2006, Ericsson AB
- * Copyright (c) 2005, Wind River Systems
+ * Copyright (c) 2005, 2010-2011, Wind River Systems
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -49,7 +49,7 @@ struct tipc_node;
 struct network {
 	struct tipc_node **nodes;
 	u32 highest_node;
-	u32 links;
+	atomic_t links;
 };
 
 
diff --git a/net/tipc/node.c b/net/tipc/node.c
index 713ab5d7c54f..a24fad32345e 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -233,7 +233,7 @@ struct tipc_node *tipc_node_attach_link(struct link *l_ptr)
 
 		if (!n_ptr->links[bearer_id]) {
 			n_ptr->links[bearer_id] = l_ptr;
-			tipc_net.links++;
+			atomic_inc(&tipc_net.links);
 			n_ptr->link_cnt++;
 			return n_ptr;
 		}
@@ -247,7 +247,7 @@ struct tipc_node *tipc_node_attach_link(struct link *l_ptr)
 void tipc_node_detach_link(struct tipc_node *n_ptr, struct link *l_ptr)
 {
 	n_ptr->links[l_ptr->b_ptr->identity] = NULL;
-	tipc_net.links--;
+	atomic_dec(&tipc_net.links);
 	n_ptr->link_cnt--;
 }
 
@@ -450,7 +450,8 @@ struct sk_buff *tipc_node_get_links(const void *req_tlv_area, int req_tlv_space)
 
 	/* Get space for all unicast links + multicast link */
 
-	payload_size = TLV_SPACE(sizeof(link_info)) * (tipc_net.links + 1);
+	payload_size = TLV_SPACE(sizeof(link_info)) *
+		(atomic_read(&tipc_net.links) + 1);
 	if (payload_size > 32768u) {
 		read_unlock_bh(&tipc_net_lock);
 		return tipc_cfg_reply_error_string(TIPC_CFG_NOT_SUPPORTED