qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 00/50] blockdev: BlockBackend and media


From: Max Reitz
Subject: [Qemu-devel] [PATCH 00/50] blockdev: BlockBackend and media
Date: Mon, 26 Jan 2015 11:02:34 -0500

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]