diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/crypto.c | 12 | ||||
| -rw-r--r-- | net/tipc/socket.c | 9 | 
2 files changed, 15 insertions, 6 deletions
diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index c38babaa4e57..7c523dc81575 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -326,7 +326,8 @@ static void tipc_aead_free(struct rcu_head *rp)  	if (aead->cloned) {  		tipc_aead_put(aead->cloned);  	} else { -		head = *this_cpu_ptr(aead->tfm_entry); +		head = *get_cpu_ptr(aead->tfm_entry); +		put_cpu_ptr(aead->tfm_entry);  		list_for_each_entry_safe(tfm_entry, tmp, &head->list, list) {  			crypto_free_aead(tfm_entry->tfm);  			list_del(&tfm_entry->list); @@ -399,10 +400,15 @@ static void tipc_aead_users_set(struct tipc_aead __rcu *aead, int val)   */  static struct crypto_aead *tipc_aead_tfm_next(struct tipc_aead *aead)  { -	struct tipc_tfm **tfm_entry = this_cpu_ptr(aead->tfm_entry); +	struct tipc_tfm **tfm_entry; +	struct crypto_aead *tfm; +	tfm_entry = get_cpu_ptr(aead->tfm_entry);  	*tfm_entry = list_next_entry(*tfm_entry, list); -	return (*tfm_entry)->tfm; +	tfm = (*tfm_entry)->tfm; +	put_cpu_ptr(tfm_entry); + +	return tfm;  }  /** diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 2679e97e0389..ebd280e767bd 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -2771,18 +2771,21 @@ static int tipc_shutdown(struct socket *sock, int how)  	trace_tipc_sk_shutdown(sk, NULL, TIPC_DUMP_ALL, " ");  	__tipc_shutdown(sock, TIPC_CONN_SHUTDOWN); -	sk->sk_shutdown = SEND_SHUTDOWN; +	if (tipc_sk_type_connectionless(sk)) +		sk->sk_shutdown = SHUTDOWN_MASK; +	else +		sk->sk_shutdown = SEND_SHUTDOWN;  	if (sk->sk_state == TIPC_DISCONNECTING) {  		/* Discard any unreceived messages */  		__skb_queue_purge(&sk->sk_receive_queue); -		/* Wake up anyone sleeping in poll */ -		sk->sk_state_change(sk);  		res = 0;  	} else {  		res = -ENOTCONN;  	} +	/* Wake up anyone sleeping in poll. */ +	sk->sk_state_change(sk);  	release_sock(sk);  	return res;  |