diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 35 | 
1 files changed, 20 insertions, 15 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index e0ee83263a39..8217905348f4 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -372,42 +372,49 @@ static struct tipc_node *tipc_node_find_by_id(struct net *net, u8 *id)  }  static void tipc_node_read_lock(struct tipc_node *n) +	__acquires(n->lock)  {  	read_lock_bh(&n->lock);  }  static void tipc_node_read_unlock(struct tipc_node *n) +	__releases(n->lock)  {  	read_unlock_bh(&n->lock);  }  static void tipc_node_write_lock(struct tipc_node *n) +	__acquires(n->lock)  {  	write_lock_bh(&n->lock);  }  static void tipc_node_write_unlock_fast(struct tipc_node *n) +	__releases(n->lock)  {  	write_unlock_bh(&n->lock);  }  static void tipc_node_write_unlock(struct tipc_node *n) +	__releases(n->lock)  { +	struct tipc_socket_addr sk;  	struct net *net = n->net; -	u32 addr = 0;  	u32 flags = n->action_flags; -	u32 link_id = 0; -	u32 bearer_id;  	struct list_head *publ_list; +	struct tipc_uaddr ua; +	u32 bearer_id;  	if (likely(!flags)) {  		write_unlock_bh(&n->lock);  		return;  	} -	addr = n->addr; -	link_id = n->link_id; -	bearer_id = link_id & 0xffff; +	tipc_uaddr(&ua, TIPC_SERVICE_RANGE, TIPC_NODE_SCOPE, +		   TIPC_LINK_STATE, n->addr, n->addr); +	sk.ref = n->link_id; +	sk.node = n->addr; +	bearer_id = n->link_id & 0xffff;  	publ_list = &n->publ_list;  	n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | @@ -416,20 +423,18 @@ static void tipc_node_write_unlock(struct tipc_node *n)  	write_unlock_bh(&n->lock);  	if (flags & TIPC_NOTIFY_NODE_DOWN) -		tipc_publ_notify(net, publ_list, addr, n->capabilities); +		tipc_publ_notify(net, publ_list, n->addr, n->capabilities);  	if (flags & TIPC_NOTIFY_NODE_UP) -		tipc_named_node_up(net, addr, n->capabilities); +		tipc_named_node_up(net, n->addr, n->capabilities);  	if (flags & TIPC_NOTIFY_LINK_UP) { -		tipc_mon_peer_up(net, addr, bearer_id); -		tipc_nametbl_publish(net, TIPC_LINK_STATE, addr, addr, -				     TIPC_NODE_SCOPE, link_id, link_id); +		tipc_mon_peer_up(net, n->addr, bearer_id); +		tipc_nametbl_publish(net, &ua, &sk, n->link_id);  	}  	if (flags & TIPC_NOTIFY_LINK_DOWN) { -		tipc_mon_peer_down(net, addr, bearer_id); -		tipc_nametbl_withdraw(net, TIPC_LINK_STATE, addr, -				      addr, link_id); +		tipc_mon_peer_down(net, n->addr, bearer_id); +		tipc_nametbl_withdraw(net, &ua, &sk, n->link_id);  	}  } @@ -2009,7 +2014,7 @@ static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb,  		return true;  	} -	/* No synching needed if only one link */ +	/* No syncing needed if only one link */  	if (!pl || !tipc_link_is_up(pl))  		return true;  |