|
@@ -570,7 +570,7 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias)
|
|
* TCP 'magic' in here.
|
|
* TCP 'magic' in here.
|
|
*/
|
|
*/
|
|
int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
- int addr_len, int flags)
|
|
|
|
|
|
+ int addr_len, int flags, int is_sendmsg)
|
|
{
|
|
{
|
|
struct sock *sk = sock->sk;
|
|
struct sock *sk = sock->sk;
|
|
int err;
|
|
int err;
|
|
@@ -605,7 +605,7 @@ int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
goto out;
|
|
goto out;
|
|
case SS_CONNECTING:
|
|
case SS_CONNECTING:
|
|
if (inet_sk(sk)->defer_connect)
|
|
if (inet_sk(sk)->defer_connect)
|
|
- err = -EINPROGRESS;
|
|
|
|
|
|
+ err = is_sendmsg ? -EINPROGRESS : -EISCONN;
|
|
else
|
|
else
|
|
err = -EALREADY;
|
|
err = -EALREADY;
|
|
/* Fall out of switch with err, set for this state */
|
|
/* Fall out of switch with err, set for this state */
|
|
@@ -679,7 +679,7 @@ int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
|
|
int err;
|
|
int err;
|
|
|
|
|
|
lock_sock(sock->sk);
|
|
lock_sock(sock->sk);
|
|
- err = __inet_stream_connect(sock, uaddr, addr_len, flags);
|
|
|
|
|
|
+ err = __inet_stream_connect(sock, uaddr, addr_len, flags, 0);
|
|
release_sock(sock->sk);
|
|
release_sock(sock->sk);
|
|
return err;
|
|
return err;
|
|
}
|
|
}
|