diff options
Diffstat (limited to 'net/tipc/name_distr.c')
| -rw-r--r-- | net/tipc/name_distr.c | 18 | 
1 files changed, 10 insertions, 8 deletions
| diff --git a/net/tipc/name_distr.c b/net/tipc/name_distr.c index 3cfeb9df64b0..61219f0b9677 100644 --- a/net/tipc/name_distr.c +++ b/net/tipc/name_distr.c @@ -94,8 +94,9 @@ struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ)  		list_add_tail_rcu(&publ->binding_node, &nt->node_scope);  		return NULL;  	} -	list_add_tail_rcu(&publ->binding_node, &nt->cluster_scope); - +	write_lock_bh(&nt->cluster_scope_lock); +	list_add_tail(&publ->binding_node, &nt->cluster_scope); +	write_unlock_bh(&nt->cluster_scope_lock);  	skb = named_prepare_buf(net, PUBLICATION, ITEM_SIZE, 0);  	if (!skb) {  		pr_warn("Publication distribution failure\n"); @@ -112,11 +113,13 @@ struct sk_buff *tipc_named_publish(struct net *net, struct publication *publ)   */  struct sk_buff *tipc_named_withdraw(struct net *net, struct publication *publ)  { +	struct name_table *nt = tipc_name_table(net);  	struct sk_buff *buf;  	struct distr_item *item; -	list_del_rcu(&publ->binding_node); - +	write_lock_bh(&nt->cluster_scope_lock); +	list_del(&publ->binding_node); +	write_unlock_bh(&nt->cluster_scope_lock);  	if (publ->scope == TIPC_NODE_SCOPE)  		return NULL; @@ -147,7 +150,7 @@ static void named_distribute(struct net *net, struct sk_buff_head *list,  			ITEM_SIZE) * ITEM_SIZE;  	u32 msg_rem = msg_dsz; -	list_for_each_entry_rcu(publ, pls, binding_node) { +	list_for_each_entry(publ, pls, binding_node) {  		/* Prepare next buffer: */  		if (!skb) {  			skb = named_prepare_buf(net, PUBLICATION, msg_rem, @@ -189,11 +192,10 @@ void tipc_named_node_up(struct net *net, u32 dnode)  	__skb_queue_head_init(&head); -	rcu_read_lock(); +	read_lock_bh(&nt->cluster_scope_lock);  	named_distribute(net, &head, dnode, &nt->cluster_scope); -	rcu_read_unlock(); -  	tipc_node_xmit(net, &head, dnode, 0); +	read_unlock_bh(&nt->cluster_scope_lock);  }  /** |