diff options
Diffstat (limited to 'net/rxrpc/conn_service.c')
| -rw-r--r-- | net/rxrpc/conn_service.c | 23 | 
1 files changed, 17 insertions, 6 deletions
| diff --git a/net/rxrpc/conn_service.c b/net/rxrpc/conn_service.c index eef551f40dc2..e60fcd2a4a02 100644 --- a/net/rxrpc/conn_service.c +++ b/net/rxrpc/conn_service.c @@ -121,7 +121,8 @@ replace_old_connection:   * Preallocate a service connection.  The connection is placed on the proc and   * reap lists so that we don't have to get the lock from BH context.   */ -struct rxrpc_connection *rxrpc_prealloc_service_connection(gfp_t gfp) +struct rxrpc_connection *rxrpc_prealloc_service_connection(struct rxrpc_net *rxnet, +							   gfp_t gfp)  {  	struct rxrpc_connection *conn = rxrpc_alloc_connection(gfp); @@ -132,10 +133,10 @@ struct rxrpc_connection *rxrpc_prealloc_service_connection(gfp_t gfp)  		conn->state = RXRPC_CONN_SERVICE_PREALLOC;  		atomic_set(&conn->usage, 2); -		write_lock(&rxrpc_connection_lock); -		list_add_tail(&conn->link, &rxrpc_connections); -		list_add_tail(&conn->proc_link, &rxrpc_connection_proc_list); -		write_unlock(&rxrpc_connection_lock); +		write_lock(&rxnet->conn_lock); +		list_add_tail(&conn->link, &rxnet->service_conns); +		list_add_tail(&conn->proc_link, &rxnet->conn_proc_list); +		write_unlock(&rxnet->conn_lock);  		trace_rxrpc_conn(conn, rxrpc_conn_new_service,  				 atomic_read(&conn->usage), @@ -149,7 +150,8 @@ struct rxrpc_connection *rxrpc_prealloc_service_connection(gfp_t gfp)   * Set up an incoming connection.  This is called in BH context with the RCU   * read lock held.   */ -void rxrpc_new_incoming_connection(struct rxrpc_connection *conn, +void rxrpc_new_incoming_connection(struct rxrpc_sock *rx, +				   struct rxrpc_connection *conn,  				   struct sk_buff *skb)  {  	struct rxrpc_skb_priv *sp = rxrpc_skb(skb); @@ -159,6 +161,7 @@ void rxrpc_new_incoming_connection(struct rxrpc_connection *conn,  	conn->proto.epoch	= sp->hdr.epoch;  	conn->proto.cid		= sp->hdr.cid & RXRPC_CIDMASK;  	conn->params.service_id	= sp->hdr.serviceId; +	conn->service_id	= sp->hdr.serviceId;  	conn->security_ix	= sp->hdr.securityIndex;  	conn->out_clientflag	= 0;  	if (conn->security_ix) @@ -166,6 +169,14 @@ void rxrpc_new_incoming_connection(struct rxrpc_connection *conn,  	else  		conn->state	= RXRPC_CONN_SERVICE; +	/* See if we should upgrade the service.  This can only happen on the +	 * first packet on a new connection.  Once done, it applies to all +	 * subsequent calls on that connection. +	 */ +	if (sp->hdr.userStatus == RXRPC_USERSTATUS_SERVICE_UPGRADE && +	    conn->service_id == rx->service_upgrade.from) +		conn->service_id = rx->service_upgrade.to; +  	/* Make the connection a target for incoming packets. */  	rxrpc_publish_service_conn(conn->params.peer, conn); |