aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/smc/af_smc.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 05e4ffe5aabd..e7de5f282722 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1122,6 +1122,8 @@ static void smc_tcp_listen_work(struct work_struct *work)
1122 sock_hold(lsk); /* sock_put in smc_listen_work */ 1122 sock_hold(lsk); /* sock_put in smc_listen_work */
1123 INIT_WORK(&new_smc->smc_listen_work, smc_listen_work); 1123 INIT_WORK(&new_smc->smc_listen_work, smc_listen_work);
1124 smc_copy_sock_settings_to_smc(new_smc); 1124 smc_copy_sock_settings_to_smc(new_smc);
1125 new_smc->sk.sk_sndbuf = lsmc->sk.sk_sndbuf;
1126 new_smc->sk.sk_rcvbuf = lsmc->sk.sk_rcvbuf;
1125 sock_hold(&new_smc->sk); /* sock_put in passive closing */ 1127 sock_hold(&new_smc->sk); /* sock_put in passive closing */
1126 if (!schedule_work(&new_smc->smc_listen_work)) 1128 if (!schedule_work(&new_smc->smc_listen_work))
1127 sock_put(&new_smc->sk); 1129 sock_put(&new_smc->sk);
@@ -1397,8 +1399,7 @@ static int smc_shutdown(struct socket *sock, int how)
1397 lock_sock(sk); 1399 lock_sock(sk);
1398 1400
1399 rc = -ENOTCONN; 1401 rc = -ENOTCONN;
1400 if ((sk->sk_state != SMC_LISTEN) && 1402 if ((sk->sk_state != SMC_ACTIVE) &&
1401 (sk->sk_state != SMC_ACTIVE) &&
1402 (sk->sk_state != SMC_PEERCLOSEWAIT1) && 1403 (sk->sk_state != SMC_PEERCLOSEWAIT1) &&
1403 (sk->sk_state != SMC_PEERCLOSEWAIT2) && 1404 (sk->sk_state != SMC_PEERCLOSEWAIT2) &&
1404 (sk->sk_state != SMC_APPCLOSEWAIT1) && 1405 (sk->sk_state != SMC_APPCLOSEWAIT1) &&
@@ -1521,12 +1522,16 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
1521 1522
1522 smc = smc_sk(sock->sk); 1523 smc = smc_sk(sock->sk);
1523 conn = &smc->conn; 1524 conn = &smc->conn;
1525 lock_sock(&smc->sk);
1524 if (smc->use_fallback) { 1526 if (smc->use_fallback) {
1525 if (!smc->clcsock) 1527 if (!smc->clcsock) {
1528 release_sock(&smc->sk);
1526 return -EBADF; 1529 return -EBADF;
1527 return smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg); 1530 }
1531 answ = smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
1532 release_sock(&smc->sk);
1533 return answ;
1528 } 1534 }
1529 lock_sock(&smc->sk);
1530 switch (cmd) { 1535 switch (cmd) {
1531 case SIOCINQ: /* same as FIONREAD */ 1536 case SIOCINQ: /* same as FIONREAD */
1532 if (smc->sk.sk_state == SMC_LISTEN) { 1537 if (smc->sk.sk_state == SMC_LISTEN) {