diff options
Diffstat (limited to 'net/tipc/node.c')
| -rw-r--r-- | net/tipc/node.c | 12 | 
1 files changed, 9 insertions, 3 deletions
diff --git a/net/tipc/node.c b/net/tipc/node.c index b48d97cbbe29..49ddc484c4fe 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -1689,6 +1689,7 @@ int tipc_node_xmit(struct net *net, struct sk_buff_head *list,  	struct tipc_node *n;  	struct sk_buff_head xmitq;  	bool node_up = false; +	struct net *peer_net;  	int bearer_id;  	int rc; @@ -1705,18 +1706,23 @@ int tipc_node_xmit(struct net *net, struct sk_buff_head *list,  		return -EHOSTUNREACH;  	} +	rcu_read_lock();  	tipc_node_read_lock(n);  	node_up = node_is_up(n); -	if (node_up && n->peer_net && check_net(n->peer_net)) { +	peer_net = n->peer_net; +	tipc_node_read_unlock(n); +	if (node_up && peer_net && check_net(peer_net)) {  		/* xmit inner linux container */ -		tipc_lxc_xmit(n->peer_net, list); +		tipc_lxc_xmit(peer_net, list);  		if (likely(skb_queue_empty(list))) { -			tipc_node_read_unlock(n); +			rcu_read_unlock();  			tipc_node_put(n);  			return 0;  		}  	} +	rcu_read_unlock(); +	tipc_node_read_lock(n);  	bearer_id = n->active_links[selector & 1];  	if (unlikely(bearer_id == INVALID_BEARER_ID)) {  		tipc_node_read_unlock(n);  |