From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59787) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XfQrB-0001pb-OY for qemu-devel@nongnu.org; Sat, 18 Oct 2014 06:03:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XfQr5-0002LB-Kr for qemu-devel@nongnu.org; Sat, 18 Oct 2014 06:03:29 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:60253) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XfQr4-0002Gu-VT for qemu-devel@nongnu.org; Sat, 18 Oct 2014 06:03:23 -0400 Message-ID: <54423AC9.2030302@huawei.com> Date: Sat, 18 Oct 2014 18:02:49 +0800 From: Weidong Huang MIME-Version: 1.0 Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Close the BlockDriverState when guest eject the media List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: "qemu-devel@nongnu.org" Cc: kwolf@redhat.com, stefanha@redhat.com Hi ALL: There are two ways to eject the cdrom tray. One is by the eject's qmp commmand(eject_device). The another one is by the guest(bdrv_eject). They have different results. eject_device: close the BlockDriverState(bdrv_close(bs)) bdrv_eject: don't close the BlockDriverState, This is ambiguous. So libvirt can't handle some situations. libvirt send eject qmp command ---> qemu send eject request to guest ---> guest respond to qemu ---> qemu emit tray_open event to libvirt ---> libvirt will not send change qmp command if media source is null. So the media is not be replace to the null. So close the BlockDriverState in bdrv_eject. Thanks. diff --git a/block.c b/block.c index d3aebeb..0be69de 100644 --- a/block.c +++ b/block.c @@ -5276,6 +5276,10 @@ void bdrv_eject(BlockDriverState *bs, bool eject_flag) qapi_event_send_device_tray_moved(bdrv_get_device_name(bs), eject_flag, &error_abort); } + + if (eject_flag) { + bdrv_close(bs); + } }