• A
    block: Handle child references in bdrv_reopen_queue() · 8546632e
    Alberto Garcia 提交于
    Children in QMP are specified with BlockdevRef / BlockdevRefOrNull,
    which can contain a set of child options, a child reference, or
    NULL. In optional attributes like "backing" it can also be missing.
    
    Only the first case (set of child options) is being handled properly
    by bdrv_reopen_queue(). This patch deals with all the others.
    
    Here's how these cases should be handled when bdrv_reopen_queue() is
    deciding what to do with each child of a BlockDriverState:
    
       1) Set of child options: if the child was implicitly created (i.e
          inherits_from points to the parent) then the options are removed
          from the parent's options QDict and are passed to the child with
          a recursive bdrv_reopen_queue() call. This case was already
          working fine.
    
       2) Child reference: there's two possibilites here.
    
          2a) Reference to the current child: if the child was implicitly
              created then it is put in the reopen queue, keeping its
              current set of options (since this was a child reference
              there was no way to specify a different set of options).
              If the child is not implicit then it keeps its current set
              of options but it is not reopened (and therefore does not
              inherit any new option from the parent).
    
          2b) Reference to a different BDS: the current child is not put
              in the reopen queue at all. Passing a reference to a
              different BDS can be used to replace a child, although at
              the moment no driver implements this, so it results in an
              error. In any case, the current child is not going to be
              reopened (and might in fact disappear if it's replaced)
    
       3) NULL: This is similar to (2b). Although no driver allows this
          yet it can be used to detach the current child so it should not
          be put in the reopen queue.
    
       4) Missing option: at the moment "backing" is the only case where
          this can happen. With "blockdev-add", leaving "backing" out
          means that the default backing file is opened. We don't want to
          open a new image during reopen, so we require that "backing" is
          always present. We'll relax this requirement a bit in the next
          patch. If keep_old_opts is true and "backing" is missing then
          this behaves like 2a (the current child is reopened).
    Signed-off-by: NAlberto Garcia <berto@igalia.com>
    Signed-off-by: NKevin Wolf <kwolf@redhat.com>
    8546632e
block.c 178.9 KB