|
@@ -1102,10 +1102,19 @@ static const struct proto_ops vsock_dgram_ops = {
|
|
|
.sendpage = sock_no_sendpage,
|
|
|
};
|
|
|
|
|
|
+static int vsock_transport_cancel_pkt(struct vsock_sock *vsk)
|
|
|
+{
|
|
|
+ if (!transport->cancel_pkt)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ return transport->cancel_pkt(vsk);
|
|
|
+}
|
|
|
+
|
|
|
static void vsock_connect_timeout(struct work_struct *work)
|
|
|
{
|
|
|
struct sock *sk;
|
|
|
struct vsock_sock *vsk;
|
|
|
+ int cancel = 0;
|
|
|
|
|
|
vsk = container_of(work, struct vsock_sock, dwork.work);
|
|
|
sk = sk_vsock(vsk);
|
|
@@ -1116,8 +1125,11 @@ static void vsock_connect_timeout(struct work_struct *work)
|
|
|
sk->sk_state = SS_UNCONNECTED;
|
|
|
sk->sk_err = ETIMEDOUT;
|
|
|
sk->sk_error_report(sk);
|
|
|
+ cancel = 1;
|
|
|
}
|
|
|
release_sock(sk);
|
|
|
+ if (cancel)
|
|
|
+ vsock_transport_cancel_pkt(vsk);
|
|
|
|
|
|
sock_put(sk);
|
|
|
}
|
|
@@ -1224,11 +1236,13 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
err = sock_intr_errno(timeout);
|
|
|
sk->sk_state = SS_UNCONNECTED;
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
+ vsock_transport_cancel_pkt(vsk);
|
|
|
goto out_wait;
|
|
|
} else if (timeout == 0) {
|
|
|
err = -ETIMEDOUT;
|
|
|
sk->sk_state = SS_UNCONNECTED;
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
+ vsock_transport_cancel_pkt(vsk);
|
|
|
goto out_wait;
|
|
|
}
|
|
|
|