From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48250) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WO35I-0001oV-KA for qemu-devel@nongnu.org; Thu, 13 Mar 2014 06:42:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WO35A-0000oK-1H for qemu-devel@nongnu.org; Thu, 13 Mar 2014 06:41:56 -0400 Sender: Paolo Bonzini Message-ID: <53218B65.708@redhat.com> Date: Thu, 13 Mar 2014 11:41:41 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <1394706702-14425-1-git-send-email-kraxel@redhat.com> <1394706702-14425-2-git-send-email-kraxel@redhat.com> In-Reply-To: <1394706702-14425-2-git-send-email-kraxel@redhat.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PULL 1/1] char: restore read callback on a reattached (hotplug) chardev List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Gerd Hoffmann , qemu-devel@nongnu.org Cc: Gal Hammer , qemu-stable@nongnu.org, Anthony Liguori Il 13/03/2014 11:31, Gerd Hoffmann ha scritto: > From: Gal Hammer > > Fix a bug that was introduced in commit 386a5a1e. A removal of a device > set the chr handlers to NULL. However when the device is plugged back, > its read callback is not restored so data can't be transferred from the > host to the guest (e.g. via the virtio-serial port). > > https://bugzilla.redhat.com/show_bug.cgi?id=1027181 > > Signed-off-by: Gal Hammer > Signed-off-by: Gerd Hoffmann Adding qemu-stable. > --- > qemu-char.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/qemu-char.c b/qemu-char.c > index 4d50838..54ed244 100644 > --- a/qemu-char.c > +++ b/qemu-char.c > @@ -213,7 +213,7 @@ void qemu_chr_add_handlers(CharDriverState *s, > s->chr_read = fd_read; > s->chr_event = fd_event; > s->handler_opaque = opaque; > - if (s->chr_update_read_handler) > + if (fe_open && s->chr_update_read_handler) > s->chr_update_read_handler(s); > > if (!s->explicit_fe_open) { > @@ -1136,13 +1136,14 @@ static void pty_chr_state(CharDriverState *chr, int connected) > if (!s->connected) { > s->connected = 1; > qemu_chr_be_generic_open(chr); > + } > + if (!chr->fd_in_tag) { > chr->fd_in_tag = io_add_watch_poll(s->fd, pty_chr_read_poll, > pty_chr_read, chr); > } > } > } > > - > static void pty_chr_close(struct CharDriverState *chr) > { > PtyCharDriver *s = chr->opaque; > @@ -2509,6 +2510,17 @@ static void tcp_chr_connect(void *opaque) > qemu_chr_be_generic_open(chr); > } > > +static void tcp_chr_update_read_handler(CharDriverState *chr) > +{ > + TCPCharDriver *s = chr->opaque; > + > + remove_fd_in_watch(chr); > + if (s->chan) { > + chr->fd_in_tag = io_add_watch_poll(s->chan, tcp_chr_read_poll, > + tcp_chr_read, chr); > + } > +} > + > #define IACSET(x,a,b,c) x[0] = a; x[1] = b; x[2] = c; > static void tcp_chr_telnet_init(int fd) > { > @@ -2664,6 +2676,7 @@ static CharDriverState *qemu_chr_open_socket_fd(int fd, bool do_nodelay, > chr->get_msgfd = tcp_get_msgfd; > chr->chr_add_client = tcp_chr_add_client; > chr->chr_add_watch = tcp_chr_add_watch; > + chr->chr_update_read_handler = tcp_chr_update_read_handler; > /* be isn't opened until we get a connection */ > chr->explicit_be_open = true; > >