|
@@ -1166,13 +1166,15 @@ static __poll_t smc_poll(struct file *file, struct socket *sock,
|
|
|
/* delegate to CLC child sock */
|
|
|
release_sock(sk);
|
|
|
mask = smc->clcsock->ops->poll(file, smc->clcsock, wait);
|
|
|
- /* if non-blocking connect finished ... */
|
|
|
lock_sock(sk);
|
|
|
- if ((sk->sk_state == SMC_INIT) && (mask & EPOLLOUT)) {
|
|
|
- sk->sk_err = smc->clcsock->sk->sk_err;
|
|
|
- if (sk->sk_err) {
|
|
|
- mask |= EPOLLERR;
|
|
|
- } else {
|
|
|
+ sk->sk_err = smc->clcsock->sk->sk_err;
|
|
|
+ if (sk->sk_err) {
|
|
|
+ mask |= EPOLLERR;
|
|
|
+ } else {
|
|
|
+ /* if non-blocking connect finished ... */
|
|
|
+ if (sk->sk_state == SMC_INIT &&
|
|
|
+ mask & EPOLLOUT &&
|
|
|
+ smc->clcsock->sk->sk_state != TCP_CLOSE) {
|
|
|
rc = smc_connect_rdma(smc);
|
|
|
if (rc < 0)
|
|
|
mask |= EPOLLERR;
|