Merge ra.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux
All conflicts were trivial overlapping changes, so reasonably easy to resolve. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -149,7 +149,8 @@ static int smc_release(struct socket *sock)
|
||||
smc->clcsock = NULL;
|
||||
}
|
||||
if (smc->use_fallback) {
|
||||
sock_put(sk); /* passive closing */
|
||||
if (sk->sk_state != SMC_LISTEN && sk->sk_state != SMC_INIT)
|
||||
sock_put(sk); /* passive closing */
|
||||
sk->sk_state = SMC_CLOSED;
|
||||
sk->sk_state_change(sk);
|
||||
}
|
||||
@@ -441,12 +442,18 @@ static int smc_connect_decline_fallback(struct smc_sock *smc, int reason_code)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (reason_code < 0) /* error, fallback is not possible */
|
||||
if (reason_code < 0) { /* error, fallback is not possible */
|
||||
if (smc->sk.sk_state == SMC_INIT)
|
||||
sock_put(&smc->sk); /* passive closing */
|
||||
return reason_code;
|
||||
}
|
||||
if (reason_code != SMC_CLC_DECL_REPLY) {
|
||||
rc = smc_clc_send_decline(smc, reason_code);
|
||||
if (rc < 0)
|
||||
if (rc < 0) {
|
||||
if (smc->sk.sk_state == SMC_INIT)
|
||||
sock_put(&smc->sk); /* passive closing */
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
return smc_connect_fallback(smc);
|
||||
}
|
||||
@@ -459,8 +466,6 @@ static int smc_connect_abort(struct smc_sock *smc, int reason_code,
|
||||
smc_lgr_forget(smc->conn.lgr);
|
||||
mutex_unlock(&smc_create_lgr_pending);
|
||||
smc_conn_free(&smc->conn);
|
||||
if (reason_code < 0 && smc->sk.sk_state == SMC_INIT)
|
||||
sock_put(&smc->sk); /* passive closing */
|
||||
return reason_code;
|
||||
}
|
||||
|
||||
@@ -1527,6 +1532,8 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
|
||||
if (sk->sk_err)
|
||||
mask |= EPOLLERR;
|
||||
} else {
|
||||
if (sk->sk_state != SMC_CLOSED)
|
||||
sock_poll_wait(file, sk_sleep(sk), wait);
|
||||
if (sk->sk_err)
|
||||
mask |= EPOLLERR;
|
||||
if ((sk->sk_shutdown == SHUTDOWN_MASK) ||
|
||||
@@ -1552,7 +1559,6 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
|
||||
}
|
||||
if (smc->conn.urg_state == SMC_URG_VALID)
|
||||
mask |= EPOLLPRI;
|
||||
|
||||
}
|
||||
|
||||
return mask;
|
||||
@@ -1633,7 +1639,8 @@ static int smc_setsockopt(struct socket *sock, int level, int optname,
|
||||
|
||||
if (optlen < sizeof(int))
|
||||
return -EINVAL;
|
||||
get_user(val, (int __user *)optval);
|
||||
if (get_user(val, (int __user *)optval))
|
||||
return -EFAULT;
|
||||
|
||||
lock_sock(sk);
|
||||
switch (optname) {
|
||||
@@ -1701,10 +1708,13 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
|
||||
return -EBADF;
|
||||
return smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
|
||||
}
|
||||
lock_sock(&smc->sk);
|
||||
switch (cmd) {
|
||||
case SIOCINQ: /* same as FIONREAD */
|
||||
if (smc->sk.sk_state == SMC_LISTEN)
|
||||
if (smc->sk.sk_state == SMC_LISTEN) {
|
||||
release_sock(&smc->sk);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (smc->sk.sk_state == SMC_INIT ||
|
||||
smc->sk.sk_state == SMC_CLOSED)
|
||||
answ = 0;
|
||||
@@ -1713,8 +1723,10 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
|
||||
break;
|
||||
case SIOCOUTQ:
|
||||
/* output queue size (not send + not acked) */
|
||||
if (smc->sk.sk_state == SMC_LISTEN)
|
||||
if (smc->sk.sk_state == SMC_LISTEN) {
|
||||
release_sock(&smc->sk);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (smc->sk.sk_state == SMC_INIT ||
|
||||
smc->sk.sk_state == SMC_CLOSED)
|
||||
answ = 0;
|
||||
@@ -1724,8 +1736,10 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
|
||||
break;
|
||||
case SIOCOUTQNSD:
|
||||
/* output queue size (not send only) */
|
||||
if (smc->sk.sk_state == SMC_LISTEN)
|
||||
if (smc->sk.sk_state == SMC_LISTEN) {
|
||||
release_sock(&smc->sk);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (smc->sk.sk_state == SMC_INIT ||
|
||||
smc->sk.sk_state == SMC_CLOSED)
|
||||
answ = 0;
|
||||
@@ -1733,8 +1747,10 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
|
||||
answ = smc_tx_prepared_sends(&smc->conn);
|
||||
break;
|
||||
case SIOCATMARK:
|
||||
if (smc->sk.sk_state == SMC_LISTEN)
|
||||
if (smc->sk.sk_state == SMC_LISTEN) {
|
||||
release_sock(&smc->sk);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (smc->sk.sk_state == SMC_INIT ||
|
||||
smc->sk.sk_state == SMC_CLOSED) {
|
||||
answ = 0;
|
||||
@@ -1750,8 +1766,10 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
|
||||
}
|
||||
break;
|
||||
default:
|
||||
release_sock(&smc->sk);
|
||||
return -ENOIOCTLCMD;
|
||||
}
|
||||
release_sock(&smc->sk);
|
||||
|
||||
return put_user(answ, (int __user *)arg);
|
||||
}
|
||||
|
Reference in New Issue
Block a user