@@ -476,7 +476,7 @@ static void update_disconnected_filename(SocketChardev *s)
static void tcp_chr_disconnect_locked(Chardev *chr)
{
SocketChardev *s = SOCKET_CHARDEV(chr);
- bool emit_close = s->state == TCP_CHARDEV_STATE_CONNECTED;
+ bool was_connected = s->state == TCP_CHARDEV_STATE_CONNECTED;
tcp_chr_free_connection(chr);
@@ -485,11 +485,11 @@ static void tcp_chr_disconnect_locked(Chardev *chr)
chr, NULL, chr->gcontext);
}
update_disconnected_filename(s);
- if (emit_close) {
+ if (was_connected) {
qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
- }
- if (s->reconnect_time) {
- qemu_chr_socket_restart_timer(chr);
+ if (s->reconnect_time) {
+ qemu_chr_socket_restart_timer(chr);
+ }
}
}
During vhost-user reconnect functionality testing the following assert was hit: qemu-system-x86_64: chardev/char-socket.c:125: qemu_chr_socket_restart_timer: Assertion `!s->reconnect_timer' failed. Aborted (core dumped) This is observed only if the connection is closed by the vhost-user-blk daemon during the initialization routine. In this case the tcp_chr_disconnect_locked() routine is called twice. First time it is called in the tcp_chr_write() routine, after getting the SIGPIPE signal. Second time it is called when vhost_user_blk_connect() routine return error. In general it looks correct, because the initialization routine can return error in many cases. The tcp_chr_disconnect_locked() routine could be fixed. The timer will be restarted only if the close event is emitted. Signed-off-by: Dima Stepanov <dimastep@yandex-team.ru> --- chardev/char-socket.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)