Browse Source

rxrpc: Accesses of rxrpc_local::service need to be RCU managed

struct rxrpc_local->service is marked __rcu - this means that accesses of
it need to be managed using RCU wrappers.  There are two such places in
rxrpc_release_sock() where the value is checked and cleared.  Fix this by
using the appropriate wrappers.

Signed-off-by: David Howells <dhowells@redhat.com>
David Howells 8 years ago
parent
commit
b63452c11e
1 changed files with 2 additions and 2 deletions
  1. 2 2
      net/rxrpc/af_rxrpc.c

+ 2 - 2
net/rxrpc/af_rxrpc.c

@@ -678,9 +678,9 @@ static int rxrpc_release_sock(struct sock *sk)
 	sk->sk_state = RXRPC_CLOSE;
 	sk->sk_state = RXRPC_CLOSE;
 	spin_unlock_bh(&sk->sk_receive_queue.lock);
 	spin_unlock_bh(&sk->sk_receive_queue.lock);
 
 
-	if (rx->local && rx->local->service == rx) {
+	if (rx->local && rcu_access_pointer(rx->local->service) == rx) {
 		write_lock(&rx->local->services_lock);
 		write_lock(&rx->local->services_lock);
-		rx->local->service = NULL;
+		rcu_assign_pointer(rx->local->service, NULL);
 		write_unlock(&rx->local->services_lock);
 		write_unlock(&rx->local->services_lock);
 	}
 	}