On 22/10/2016 11:53, Marc-André Lureau wrote:
> - if (chr->chr_can_read || chr->chr_read ||
> - chr->chr_event || chr->handler_opaque) {
> + if (chr->be) {
> error_setg(errp, "Chardev '%s' is busy", id);
This doesn't work with the mux chardev. To some extent a preexisting
bug, but made worse by this patch. But it can be fixed easily:
diff --git a/qemu-char.c b/qemu-char.c
index b9330f3..6dd779f 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -915,6 +915,16 @@ unavailable:
return false;
}
+static bool qemu_chr_is_busy(CharDriverState *s)
+{
+ if (s->is_mux) {
+ MuxDriver *d = s->opaque;
+ return d->mux_cnt >= 0;
+ } else {
+ return s->be != NULL;
+ }
+}
+
void qemu_chr_fe_deinit(CharBackend *b)
{
assert(b);
@@ -4807,7 +4817,7 @@ void qmp_chardev_remove(const char *id, Error **errp)
error_setg(errp, "Chardev '%s' not found", id);
return;
}
- if (chr->be) {
+ if (qemu_chr_is_busy(chr)) {
error_setg(errp, "Chardev '%s' is busy", id);
return;
}