diff options
Diffstat (limited to 'net/smc')
| -rw-r--r-- | net/smc/af_smc.c | 26 | ||||
| -rw-r--r-- | net/smc/smc_clc.c | 14 | ||||
| -rw-r--r-- | net/smc/smc_close.c | 14 | ||||
| -rw-r--r-- | net/smc/smc_pnet.c | 2 | 
4 files changed, 30 insertions, 26 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c index 2d8a1e15e4f9..015231789ed2 100644 --- a/net/smc/af_smc.c +++ b/net/smc/af_smc.c @@ -742,7 +742,10 @@ static void smc_connect_work(struct work_struct *work)  		smc->sk.sk_err = -rc;  out: -	smc->sk.sk_state_change(&smc->sk); +	if (smc->sk.sk_err) +		smc->sk.sk_state_change(&smc->sk); +	else +		smc->sk.sk_write_space(&smc->sk);  	kfree(smc->connect_info);  	smc->connect_info = NULL;  	release_sock(&smc->sk); @@ -1150,9 +1153,9 @@ static int smc_listen_rdma_reg(struct smc_sock *new_smc, int local_contact)  }  /* listen worker: finish RDMA setup */ -static void smc_listen_rdma_finish(struct smc_sock *new_smc, -				   struct smc_clc_msg_accept_confirm *cclc, -				   int local_contact) +static int smc_listen_rdma_finish(struct smc_sock *new_smc, +				  struct smc_clc_msg_accept_confirm *cclc, +				  int local_contact)  {  	struct smc_link *link = &new_smc->conn.lgr->lnk[SMC_SINGLE_LINK];  	int reason_code = 0; @@ -1175,11 +1178,12 @@ static void smc_listen_rdma_finish(struct smc_sock *new_smc,  		if (reason_code)  			goto decline;  	} -	return; +	return 0;  decline:  	mutex_unlock(&smc_create_lgr_pending);  	smc_listen_decline(new_smc, reason_code, local_contact); +	return reason_code;  }  /* setup for RDMA connection of server */ @@ -1276,8 +1280,10 @@ static void smc_listen_work(struct work_struct *work)  	}  	/* finish worker */ -	if (!ism_supported) -		smc_listen_rdma_finish(new_smc, &cclc, local_contact); +	if (!ism_supported) { +		if (smc_listen_rdma_finish(new_smc, &cclc, local_contact)) +			return; +	}  	smc_conn_save_peer_info(new_smc, &cclc);  	mutex_unlock(&smc_create_lgr_pending);  	smc_listen_out_connected(new_smc); @@ -1529,7 +1535,7 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,  		return EPOLLNVAL;  	smc = smc_sk(sock->sk); -	if ((sk->sk_state == SMC_INIT) || smc->use_fallback) { +	if (smc->use_fallback) {  		/* delegate to CLC child sock */  		mask = smc->clcsock->ops->poll(file, smc->clcsock, wait);  		sk->sk_err = smc->clcsock->sk->sk_err; @@ -1560,9 +1566,9 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,  				mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;  			if (sk->sk_state == SMC_APPCLOSEWAIT1)  				mask |= EPOLLIN; +			if (smc->conn.urg_state == SMC_URG_VALID) +				mask |= EPOLLPRI;  		} -		if (smc->conn.urg_state == SMC_URG_VALID) -			mask |= EPOLLPRI;  	}  	return mask; diff --git a/net/smc/smc_clc.c b/net/smc/smc_clc.c index 83aba9ade060..52241d679cc9 100644 --- a/net/smc/smc_clc.c +++ b/net/smc/smc_clc.c @@ -446,14 +446,12 @@ int smc_clc_send_proposal(struct smc_sock *smc, int smc_type,  	vec[i++].iov_len = sizeof(trl);  	/* due to the few bytes needed for clc-handshake this cannot block */  	len = kernel_sendmsg(smc->clcsock, &msg, vec, i, plen); -	if (len < sizeof(pclc)) { -		if (len >= 0) { -			reason_code = -ENETUNREACH; -			smc->sk.sk_err = -reason_code; -		} else { -			smc->sk.sk_err = smc->clcsock->sk->sk_err; -			reason_code = -smc->sk.sk_err; -		} +	if (len < 0) { +		smc->sk.sk_err = smc->clcsock->sk->sk_err; +		reason_code = -smc->sk.sk_err; +	} else if (len < (int)sizeof(pclc)) { +		reason_code = -ENETUNREACH; +		smc->sk.sk_err = -reason_code;  	}  	return reason_code; diff --git a/net/smc/smc_close.c b/net/smc/smc_close.c index ac961dfb1ea1..ea2b87f29469 100644 --- a/net/smc/smc_close.c +++ b/net/smc/smc_close.c @@ -100,15 +100,14 @@ static void smc_close_active_abort(struct smc_sock *smc)  	struct smc_cdc_conn_state_flags *txflags =  		&smc->conn.local_tx_ctrl.conn_state_flags; -	sk->sk_err = ECONNABORTED; -	if (smc->clcsock && smc->clcsock->sk) { -		smc->clcsock->sk->sk_err = ECONNABORTED; -		smc->clcsock->sk->sk_state_change(smc->clcsock->sk); +	if (sk->sk_state != SMC_INIT && smc->clcsock && smc->clcsock->sk) { +		sk->sk_err = ECONNABORTED; +		if (smc->clcsock && smc->clcsock->sk) { +			smc->clcsock->sk->sk_err = ECONNABORTED; +			smc->clcsock->sk->sk_state_change(smc->clcsock->sk); +		}  	}  	switch (sk->sk_state) { -	case SMC_INIT: -		sk->sk_state = SMC_PEERABORTWAIT; -		break;  	case SMC_ACTIVE:  		sk->sk_state = SMC_PEERABORTWAIT;  		release_sock(sk); @@ -143,6 +142,7 @@ static void smc_close_active_abort(struct smc_sock *smc)  	case SMC_PEERFINCLOSEWAIT:  		sock_put(sk); /* passive closing */  		break; +	case SMC_INIT:  	case SMC_PEERABORTWAIT:  	case SMC_CLOSED:  		break; diff --git a/net/smc/smc_pnet.c b/net/smc/smc_pnet.c index 01c6ce042a1c..7cb3e4f07c10 100644 --- a/net/smc/smc_pnet.c +++ b/net/smc/smc_pnet.c @@ -461,7 +461,7 @@ static const struct genl_ops smc_pnet_ops[] = {  };  /* SMC_PNETID family definition */ -static struct genl_family smc_pnet_nl_family = { +static struct genl_family smc_pnet_nl_family __ro_after_init = {  	.hdrsize = 0,  	.name = SMCR_GENL_FAMILY_NAME,  	.version = SMCR_GENL_FAMILY_VERSION,  | 
