Am 27.07.2010 14:02, schrieb Markus Armbruster: > bdrv_eject() gets called when a device model opens or closes the tray. > > If the block driver implements method bdrv_eject(), that method gets > called. Drivers host_cdrom implements it, and it opens and closes the > physical tray, and nothing else. When a device model opens, then > closes the tray, media changes only if the user actively changes the > physical media while the tray is open. This is matches how physical > hardware behaves. > > If the block driver doesn't implement method bdrv_eject(), we do > something quite different: opening the tray severs the connection to > the image by calling bdrv_close(), and closing the tray does nothing. > When the device model opens, then closes the tray, media is gone, > unless the user actively inserts another one while the tray is open, > with a suitable change command in the monitor. This isn't how > physical hardware behaves. Rather inconvenient when programs > "helpfully" eject media to give you a chance to change it. The way > bdrv_eject() behaves here turns that chance into a must, which is not > what these programs or their users expect. > > Change the default action not to call bdrv_close(). Instead, note the > tray status in new BlockDriverState member tray_open. Use it in > bdrv_is_inserted(). > > Arguably, the device models should keep track of tray status > themselves. But this is less invasive. > > Signed-off-by: Markus Armbruster <arm...@redhat.com>
Thanks, applied to the block branch. Kevin