Skip to content

Commit 98d20e5

Browse files
bergwolfgregkh
authored andcommitted
vsock: cancel packets when failing to connect
[ Upstream commit 380feae ] Otherwise we'll leave the packets queued until releasing vsock device. E.g., if guest is slow to start up, resulting ETIMEDOUT on connect, guest will get the connect requests from failed host sockets. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Reviewed-by: Jorgen Hansen <jhansen@vmware.com> Signed-off-by: Peng Tao <bergwolf@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <alexander.levin@verizon.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent 482b3f9 commit 98d20e5

1 file changed

Lines changed: 14 additions & 0 deletions

File tree

net/vmw_vsock/af_vsock.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1101,10 +1101,19 @@ static const struct proto_ops vsock_dgram_ops = {
11011101
.sendpage = sock_no_sendpage,
11021102
};
11031103

1104+
static int vsock_transport_cancel_pkt(struct vsock_sock *vsk)
1105+
{
1106+
if (!transport->cancel_pkt)
1107+
return -EOPNOTSUPP;
1108+
1109+
return transport->cancel_pkt(vsk);
1110+
}
1111+
11041112
static void vsock_connect_timeout(struct work_struct *work)
11051113
{
11061114
struct sock *sk;
11071115
struct vsock_sock *vsk;
1116+
int cancel = 0;
11081117

11091118
vsk = container_of(work, struct vsock_sock, dwork.work);
11101119
sk = sk_vsock(vsk);
@@ -1115,8 +1124,11 @@ static void vsock_connect_timeout(struct work_struct *work)
11151124
sk->sk_state = SS_UNCONNECTED;
11161125
sk->sk_err = ETIMEDOUT;
11171126
sk->sk_error_report(sk);
1127+
cancel = 1;
11181128
}
11191129
release_sock(sk);
1130+
if (cancel)
1131+
vsock_transport_cancel_pkt(vsk);
11201132

11211133
sock_put(sk);
11221134
}
@@ -1223,11 +1235,13 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
12231235
err = sock_intr_errno(timeout);
12241236
sk->sk_state = SS_UNCONNECTED;
12251237
sock->state = SS_UNCONNECTED;
1238+
vsock_transport_cancel_pkt(vsk);
12261239
goto out_wait;
12271240
} else if (timeout == 0) {
12281241
err = -ETIMEDOUT;
12291242
sk->sk_state = SS_UNCONNECTED;
12301243
sock->state = SS_UNCONNECTED;
1244+
vsock_transport_cancel_pkt(vsk);
12311245
goto out_wait;
12321246
}
12331247

0 commit comments

Comments
 (0)