The series "BlockBackend and media" intended all block devices with removable media to implement a tray model; if the devices does not have a tray, it should emulate one.
While this may make sense from a technical perspective (blockdev-*-tray are guest device controlling operations, invoking blk_dev_change_media_cb(); blockdev-*-medium are operations concerning the block layer, controlling the BB-BDS link), it is (probably) unintuitive to users, and it requires said implementation of an emulated tray for each of the slot devices (floppy disk drives and SD card readers). We can get rid of those virtual trays by special-casing tray-less devices in blockdev-*-tray (those operations are no-ops there) and in blockdev-*-medium (those operations then have to invoke blk_dev_change_media_cb()). With this change, changing the medium inserted into a slot device will no longer emit TRAY_MOVED events (which seems like a bugfix to me, because slot devices actually do not have trays). Patches 1 and 2 are CC'd to qemu-stable because they fix 'change' for SD card readers. Patch 3 does not fix it for floppy disk drives, it just changes the behavior when used on them (no TRAY_MOVED events, no tray_open status, and blockdev-{open,close}-tray are optional), which is why it is not CC'd to qemu-stable; and patch 4 is more of a change in behavior than a stable-worthy fix. v3: - Patch 2: Keep blk_insert_bs(...) and QTAILQ_INSERT_TAIL(&bdrv_states, ...) paired [Berto] git-backport-diff against v2: Key: [----] : patches are identical [####] : number of functional differences between upstream/downstream patch [down] : patch is downstream-only The flags [FC] indicate (F)unctional and (C)ontextual differences, respectively 001/4:[----] [--] 'block: Add blk_dev_has_tray()' 002/4:[0002] [FC] 'blockdev: Fix 'change' for slot devices' 003/4:[----] [--] 'Revert "hw/block/fdc: Implement tray status"' 004/4:[----] [--] 'block/qapi: Emit tray_open only if there is a tray' Max Reitz (4): block: Add blk_dev_has_tray() blockdev: Fix 'change' for slot devices Revert "hw/block/fdc: Implement tray status" block/qapi: Emit tray_open only if there is a tray block/block-backend.c | 10 +++- block/qapi.c | 2 +- blockdev.c | 31 +++++++++++- hw/block/fdc.c | 20 ++------ include/block/block_int.h | 1 + qapi/block-core.json | 7 ++- tests/fdc-test.c | 2 - tests/qemu-iotests/067.out | 4 -- tests/qemu-iotests/118 | 117 ++++++++++++++------------------------------- 9 files changed, 83 insertions(+), 111 deletions(-) -- 2.7.0