|
@@ -563,13 +563,21 @@ static void vhost_vsock_reset_orphans(struct sock *sk)
|
|
|
* executing.
|
|
|
*/
|
|
|
|
|
|
- if (!vhost_vsock_get(vsk->remote_addr.svm_cid)) {
|
|
|
- sock_set_flag(sk, SOCK_DONE);
|
|
|
- vsk->peer_shutdown = SHUTDOWN_MASK;
|
|
|
- sk->sk_state = SS_UNCONNECTED;
|
|
|
- sk->sk_err = ECONNRESET;
|
|
|
- sk->sk_error_report(sk);
|
|
|
- }
|
|
|
+ /* If the peer is still valid, no need to reset connection */
|
|
|
+ if (vhost_vsock_get(vsk->remote_addr.svm_cid))
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* If the close timeout is pending, let it expire. This avoids races
|
|
|
+ * with the timeout callback.
|
|
|
+ */
|
|
|
+ if (vsk->close_work_scheduled)
|
|
|
+ return;
|
|
|
+
|
|
|
+ sock_set_flag(sk, SOCK_DONE);
|
|
|
+ vsk->peer_shutdown = SHUTDOWN_MASK;
|
|
|
+ sk->sk_state = SS_UNCONNECTED;
|
|
|
+ sk->sk_err = ECONNRESET;
|
|
|
+ sk->sk_error_report(sk);
|
|
|
}
|
|
|
|
|
|
static int vhost_vsock_dev_release(struct inode *inode, struct file *file)
|