** This is a resend due to me messing up John's CC in the first thread. Sorry for the superfluous mails, but I feel like it's better to bother you all with the same mails again than to keep bothering innocent people. **
This series reworks a lot regarding BlockBackend and media. It is essentially a v3 to the "blockdev: Add blockdev-change-medium with read-only option" series (which is in fact a part of this series), but of course does a lot more. Basically, this series allows empty BlockBackends, that is BBs without a BDS tree. Before this series, empty drives are represented by a BlockBackend with an empty BDS attached to it (a BDS with a NULL driver). However, now we have BlockBackends, thus an empty drive should be represented by a BlockBackend without any BDS tree attached to it. This is what this series does. I am CC'ing a lot of people (basically everyone who is working on the block layer) due to the fact that this series touches a lot of places in the block layer. Please pick out patches that seem to be relevant to your area of expertise (e.g. there is an FDC tray patch for John; there are some block job patches for Jeff; etc. pp.). I want to explicitly encourage you to review only parts of this series! (Of course, reviewing everything is fine, too :-)) Also, brace for a follow-up regarding bdrv_close_all() (there is a nice bug in there which I found while working on this series). This series depends on v3 (or any later version) of my series 'block: Remove "growable", add blk_new_open()'. - Patches 1 and 2 make it possible to use blockdev-add without creating a BlockBackend. This is necessary because the QMP command introduced in patch 42 (blockdev-insert-medium) will insert a BDS tree (a medium) into a BlockBackend (a drive). Creating a BlockBackend for such a BDS tree would both be a hassle and a waste, so this makes it possible to omit creating a BB. Patches 35 and 36 are kind of a follow-up to these; but patch 35 depends on patch 34 which is the reason why there is a large gap between patch 2 and 35. - Patch 3 implements a tray status for floppy disk drives. See the commit message for more information on what this means. - Patches 3 to 33 basically all prepare the block layer for having BBs without BDS trees. I will only list the most notable ones (patch 3, for instance, is not notable). They do so by moving some information into the BlockBackend, and primarily by intercepting accesses to empty BBs in the BB layer and resorting to default actions there. Furthermore, hopefully all non-BB calls to bdrv_*() functions are guarded by checking whether that BDS actually exists. - Patch 6 makes blk_is_inserted() return true only if there is a BDS tree; furthermore, blk_is_available() is added which additionally checks whether the guest device tray is closed. - Patches 7 and 8 are some kind of follow-up to patch 6; they make bdrv_is_inserted() actually useful (unless I'm not mistaken; maybe I am and they make bdrv_is_inserted() actually useless). - Patches 9, 11 and 12 move some (root!) BDS fields into the BB, because that is where they belong. This way they survive a medium (BDS tree) change. - Patch 10 is necessary because the structure moved in patch 11 (BlockAcctStats) contains one field which does belong into the BDS (wr_highest_offset). Thus, this field is moved out of that structure into the BDS here. - Patch 13 adds a structure to the BB which can save some options from the root BDS so they survive a medium change. In theory, those options should probably not survive a medium change (they are not really drive- but medium-related), but this is how the 'change' command always handled it so this structure (the BlockBackendRootState, BBRS) is required for compatibility. One of these options is the read-only status, for example. - Patches 17 to 30 and patches 32 and 33 prepare functions in the block layer which directly access a BDS to cope with a non-existing BDS tree. Patch 31 is a prerequisite for patch 32. - Patch 34 "gets down to business": Empty drives no longer have a BDS tree. - Patches 35 and 36 are, as described above, a follow-up to patch 1. - Patch 37 is the counterpart to patch 31, obviously. - Patches 38 to 41 implement the basic QMP operations for tray and medium operation: blockdev-open-tray, blockdev-close-tray, blockdev-remove-medium and blockdev-insert-medium. - Patches 42 and 43 reimplement 'eject' and 'change' using these new medium operations. - With me now knowing exactly what 'change' does (because I reimplemented it), patch 44 became possible. - Patches 45 to 48 are from v2 of series (slightly modified) "blockdev: Add blockdev-change-medium with read-only option" One modification are notes in patch 45 that blockdev-change-medium is preferred over simply 'change' [Eric] and what atomic operations blockdev-change-medium itself performs. - Patch 50 adds a test for 'change' and all associated QMP commands, patch 49 makes small amendments to VM.add_drive() in iotests.py to make the new test work. git-backport-diff output against v2 of "blockdev: Add blockdev-change-medium with read-only option": 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 045/50:[0007] [FC] 'qmp: Introduce blockdev-change-medium' 046/50:[----] [--] 'hmp: Use blockdev-change-medium for change command' 047/50:[0005] [FC] 'blockdev: Add read-only option to blockdev-change-medium' 048/50:[----] [--] 'hmp: Add read-only option to change command' (rest is "downstream-only") Max Reitz (50): blockdev: Allow creation of BDS trees without BB iotests: Only create BB if necessary hw/block/fdc: Implement tray status hw/usb-storage: Check whether BB is inserted block: Fix BB AIOCB AioContext without BDS block: Add blk_is_available() block: Make bdrv_is_inserted() recursive block/quorum: Implement bdrv_is_inserted() block: Move guest_block_size into BlockBackend block: Remove wr_highest_offset from BlockAcctStats block: Move BlockAcctStats into BlockBackend block: Move I/O status and error actions into BB block: Add BlockBackendRootState block: Make some BB functions fall back to BBRS block: Fail requests to empty BlockBackend block: Prepare remaining BB functions for NULL BDS block: Respect empty BB in bdrv_lookup_bs() block: Respect empty BB in bdrv_query_info() blockdev: Use BlockBackend for blockdev-backup TA blockdev: Check blk_is_available() in sn-del-int-sync blockdev: Check BB validity in internal snapshot TA blockdev: Check BB validity in drive-backup TA blockdev: Catch NULL BDS in block_set_io_throttle blockdev: Check BB validity in block-stream blockdev: Check BB validity in block-commit blockdev: Check BB validity in drive-backup blockdev: Check BB validity in blockdev-backup blockdev: Check BB validity in drive-mirror blockdev: Check BB validity in find_block_job() blockdev: Check BB validity in change-backing-file block: Add blk_insert_bs() blockdev: Check BB validity in eject and change blockdev: Respect NULL BDS in do_drive_del() blockdev: Do not create BDS for empty drive blockdev: Pull out blockdev option extraction blockdev: Allow more options for BB-less BDS tree block: Add blk_remove_bs() blockdev: Add blockdev-open-tray blockdev: Add blockdev-close-tray blockdev: Add blockdev-remove-medium blockdev: Add blockdev-insert-medium blockdev: Implement eject with basic operations blockdev: Implement change with basic operations block: Inquire tray state before tray-moved events qmp: Introduce blockdev-change-medium hmp: Use blockdev-change-medium for change command blockdev: Add read-only option to blockdev-change-medium hmp: Add read-only option to change command iotests: More options for VM.add_drive() iotests: Add test for change-related QMP commands block.c | 161 +------- block/accounting.c | 9 - block/backup.c | 17 +- block/block-backend.c | 356 ++++++++++++++-- block/commit.c | 3 +- block/mirror.c | 17 +- block/qapi.c | 32 +- block/quorum.c | 16 + block/stream.c | 3 +- blockdev.c | 915 +++++++++++++++++++++++++++++------------ blockjob.c | 5 +- hmp-commands.hx | 20 +- hmp.c | 46 ++- hw/block/fdc.c | 20 +- hw/usb/dev-storage.c | 2 +- include/block/accounting.h | 3 - include/block/block.h | 14 - include/block/block_int.h | 22 +- include/qemu/typedefs.h | 1 + include/sysemu/block-backend.h | 12 + include/sysemu/blockdev.h | 2 - qapi-schema.json | 3 +- qapi/block-core.json | 110 +++++ qmp-commands.hx | 204 +++++++++ qmp.c | 9 +- tests/fdc-test.c | 4 +- tests/qemu-iotests/067.out | 104 +---- tests/qemu-iotests/071 | 50 ++- tests/qemu-iotests/071.out | 16 +- tests/qemu-iotests/081 | 14 +- tests/qemu-iotests/081.out | 7 +- tests/qemu-iotests/087 | 20 - tests/qemu-iotests/087.out | 22 - tests/qemu-iotests/118 | 649 +++++++++++++++++++++++++++++ tests/qemu-iotests/118.out | 5 + tests/qemu-iotests/group | 1 + tests/qemu-iotests/iotests.py | 9 +- 37 files changed, 2198 insertions(+), 705 deletions(-) create mode 100755 tests/qemu-iotests/118 create mode 100644 tests/qemu-iotests/118.out -- 2.1.0