1. 25 2月, 2019 5 次提交
    • V
      block: improve should_update_child · 2f30b7c3
      Vladimir Sementsov-Ogievskiy 提交于
      As it already said in the comment, we don't want to create loops in
      parent->child relations. So, when we try to append @to to @c, we should
      check that @c is not in @to children subtree, and we should check it
      recursively, not only the first level. The patch provides BFS-based
      search, to check the relations.
      
      This is needed for further fleecing-hook filter usage: we need to
      append it to source, when the hook is already a parent of target, and
      source may be in a backing chain of target (fleecing-scheme). So, on
      appending, the hook should not became a child (direct or through
      children subtree) of the target.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      2f30b7c3
    • K
      block: Use normal drain for bdrv_set_aio_context() · d70d5954
      Kevin Wolf 提交于
      Now that bdrv_set_aio_context() works inside drained sections, it can
      also use the real drain function instead of open coding something
      similar.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      d70d5954
    • K
      block: Fix AioContext switch for drained node · e64f25f3
      Kevin Wolf 提交于
      When a drained node changes its AioContext, we need to move its
      aio_disable_external() to the new context, too.
      
      Without this fix, drain_end will try to reenable the new context, which
      has never been disabled, so an assertion failure is triggered.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      e64f25f3
    • K
      block: Don't poll in bdrv_set_aio_context() · 6c75d761
      Kevin Wolf 提交于
      The explicit aio_poll() call in bdrv_set_aio_context() was added in
      commit c2b6428d as a workaround for bdrv_drain() failing to achieve
      to actually quiesce everything (specifically the NBD client code to
      switch AioContext).
      
      Now that the NBD client has been fixed to complete this operation during
      bdrv_drain(), we don't need the workaround any more.
      
      It was wrong anyway: aio_poll() must always be run in the home thread of
      the AioContext.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      6c75d761
    • D
      block: don't set the same context · 57830a49
      Denis Plotnikov 提交于
      Adds a fast path on aio context setting preventing
      unnecessary context setting routine.
      Also, it prevents issues with cyclic walk of child
      bds-es appeared because of registering aio walking
      notifiers:
      
      Call stack:
      
      0  __GI_raise
      1  __GI_abort
      2  __assert_fail_base
      3  __GI___assert_fail
      4  bdrv_detach_aio_context (bs=0x55f54d65c000)      <<<
      5  bdrv_detach_aio_context (bs=0x55f54fc8a800)
      6  bdrv_set_aio_context (bs=0x55f54fc8a800, ...)
      7  block_job_attached_aio_context
      8  bdrv_attach_aio_context (bs=0x55f54d65c000, ...) <<<
      9  bdrv_set_aio_context (bs=0x55f54d65c000)
      10 blk_set_aio_context
      11 virtio_blk_data_plane_stop
      12 virtio_bus_stop_ioeventfd
      13 virtio_vmstate_change
      14 vm_state_notify (running=0, state=RUN_STATE_SHUTDOWN)
      15 do_vm_stop (state=RUN_STATE_SHUTDOWN, send_stop=true)
      16 vm_stop (state=RUN_STATE_SHUTDOWN)
      17 main_loop_should_exit
      18 main_loop
      19 main
      
      This can happen because of "new" context attachment to VM disk bds.
      When attaching a new context the corresponding aio context handler is
      called for each of aio_notifiers registered on the VM disk bds context.
      Among those handlers, there is the block_job_attached_aio_context handler
      which sets a new aio context for the block job bds. When doing so,
      the old context is detached from all the block job bds children and one of
      them is the VM disk bds, serving as backing store for the blockjob bds,
      although the VM disk bds is actually the initializer of that process.
      Since the VM disk bds is protected with walking_aio_notifiers flag
      from double processing in recursive calls, the assert fires.
      Signed-off-by: NDenis Plotnikov <dplotnikov@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      57830a49
  2. 12 2月, 2019 1 次提交
  3. 01 2月, 2019 3 次提交
    • K
      block: Fix invalidate_cache error path for parent activation · 78fc3b3a
      Kevin Wolf 提交于
      bdrv_co_invalidate_cache() clears the BDRV_O_INACTIVE flag before
      actually activating a node so that the correct permissions etc. are
      taken. In case of errors, the flag must be restored so that the next
      call to bdrv_co_invalidate_cache() retries activation.
      
      Restoring the flag was missing in the error path for a failed
      parent->role->activate() call. The consequence is that this attempt to
      activate all images correctly fails because we still set errp, however
      on the next attempt BDRV_O_INACTIVE is already clear, so we return
      success without actually retrying the failed action.
      
      An example where this is observable in practice is migration to a QEMU
      instance that has a raw format block node attached to a guest device
      with share-rw=off (the default) while another process holds
      BLK_PERM_WRITE for the same image. In this case, all activation steps
      before parent->role->activate() succeed because raw can tolerate other
      writers to the image. Only the parent callback (in particular
      blk_root_activate()) tries to implement the share-rw=on property and
      requests exclusive write permissions. This fails when the migration
      completes and correctly displays an error. However, a manual 'cont' will
      incorrectly resume the VM without calling blk_root_activate() again.
      
      This case is described in more detail in the following bug report:
      https://bugzilla.redhat.com/show_bug.cgi?id=1531888
      
      Fix this by correctly restoring the BDRV_O_INACTIVE flag in the error
      path.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Tested-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      78fc3b3a
    • K
      block: Apply auto-read-only for ro-whitelist drivers · 8be25de6
      Kevin Wolf 提交于
      If QEMU was configured with a driver in --block-drv-ro-whitelist, trying
      to use that driver read-write resulted in an error message even if
      auto-read-only=on was set.
      
      Consider auto-read-only=on for the whitelist checking and use it to
      automatically degrade to read-only for block drivers on the read-only
      whitelist.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      8be25de6
    • K
      block: Fix hangs in synchronous APIs with iothreads · 4720cbee
      Kevin Wolf 提交于
      In the block layer, synchronous APIs are often implemented by creating a
      coroutine that calls the asynchronous coroutine-based implementation and
      then waiting for completion with BDRV_POLL_WHILE().
      
      For this to work with iothreads (more specifically, when the synchronous
      API is called in a thread that is not the home thread of the block
      device, so that the coroutine will run in a different thread), we must
      make sure to call aio_wait_kick() at the end of the operation. Many
      places are missing this, so that BDRV_POLL_WHILE() keeps hanging even if
      the condition has long become false.
      
      Note that bdrv_dec_in_flight() involves an aio_wait_kick() call. This
      corresponds to the BDRV_POLL_WHILE() in the drain functions, but it is
      generally not enough for most other operations because they haven't set
      the return value in the coroutine entry stub yet. To avoid race
      conditions there, we need to kick after setting the return value.
      
      The race window is small enough that the problem doesn't usually surface
      in the common path. However, it does surface and causes easily
      reproducible hangs if the operation can return early before even calling
      bdrv_inc/dec_in_flight, which many of them do (trivial error or no-op
      success paths).
      
      The bug in bdrv_truncate(), bdrv_check() and bdrv_invalidate_cache() is
      slightly different: These functions even neglected to schedule the
      coroutine in the home thread of the node. This avoids the hang, but is
      obviously wrong, too. Fix those to schedule the coroutine in the right
      AioContext in addition to adding aio_wait_kick() calls.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      4720cbee
  4. 31 1月, 2019 1 次提交
  5. 14 12月, 2018 7 次提交
  6. 27 11月, 2018 1 次提交
    • K
      block: Don't inactivate children before parents · 9e37271f
      Kevin Wolf 提交于
      bdrv_child_cb_inactivate() asserts that parents are already inactive
      when children get inactivated. This precondition is necessary because
      parents could still issue requests in their inactivation code.
      
      When block nodes are created individually with -blockdev, all of them
      are monitor owned and will be returned by bdrv_next() in an undefined
      order (in practice, in the order of their creation, which is usually
      children before parents), which obviously fails the assertion:
      
      qemu: block.c:899: bdrv_child_cb_inactivate: Assertion `bs->open_flags & BDRV_O_INACTIVE' failed.
      
      This patch fixes the ordering by skipping nodes with still active
      parents in bdrv_inactivate_recurse() because we know that they will be
      covered by recursion when the last active parent becomes inactive.
      
      With the correct parents-before-children ordering, we also got rid of
      the reason why commit aad0b7a0 introduced two passes, so we can go
      back to a single-pass recursion. This is necessary so we can rely on the
      BDRV_O_INACTIVE flag to skip nodes with active parents (the flag used
      to be set only in pass 2, so we would always skip non-root nodes in
      pass 1 because all parents would still be considered active; setting the
      flag in pass 1 would mean, that we never skip anything in pass 2 because
      all parents are already considered inactive).
      
      Because of the change to single pass, this patch is best reviewed with
      whitespace changes ignored.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      9e37271f
  7. 23 11月, 2018 2 次提交
    • A
      block: Update BlockDriverState.inherits_from on bdrv_drop_intermediate() · 6bd858b3
      Alberto Garcia 提交于
      The previous patch fixed the inherits_from pointer after block-stream,
      and this one does the same for block-commit.
      
      When block-commit finishes and the 'top' node is not the topmost one
      from the backing chain then all nodes above 'base' up to and including
      'top' are removed from the chain.
      
      The bdrv_drop_intermediate() call converts a chain like this one:
      
          base <- intermediate <- top <- active
      
      into this one:
      
          base <- active
      
      In a simple scenario each backing file from the first chain has the
      inherits_from attribute pointing to its parent. This means that
      reopening 'active' will recursively reopen all its children, whose
      options can be changed in the process.
      
      However after the 'block-commit' call base.inherits_from is NULL and
      the chain is broken, so 'base' does not inherit from 'active' and will
      not be reopened automatically:
      
         $ qemu-img create -f qcow2 hd0.qcow2 1M
         $ qemu-img create -f qcow2 -b hd0.qcow2 hd1.qcow2
         $ qemu-img create -f qcow2 -b hd1.qcow2 hd2.qcow2
         $ $QEMU -drive if=none,file=hd2.qcow2
      
         { 'execute': 'block-commit',
           'arguments': {
             'device': 'none0',
             'top': 'hd1.qcow2' } }
      
         { 'execute': 'human-monitor-command',
           'arguments': {
              'command-line':
                'qemu-io none0 "reopen -o backing.l2-cache-size=2M"' } }
      
         { "return": "Cannot change the option 'backing.l2-cache-size'\r\n"}
      
      This patch updates base.inherits_from in this scenario, and adds a
      test case.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      6bd858b3
    • A
      block: Update BlockDriverState.inherits_from on bdrv_set_backing_hd() · 0065c455
      Alberto Garcia 提交于
      When a BlockDriverState's child is opened (be it a backing file, the
      protocol layer, or any other) inherits_from is set to point to the
      parent node. Children opened separately and then attached to a parent
      don't have this pointer set.
      
      bdrv_reopen_queue_child() uses this to determine whether a node's
      children must also be reopened inheriting the options from the parent
      or not. If inherits_from points to the parent then the child is
      reopened and its options can be changed, like in this example:
      
         $ qemu-img create -f qcow2 hd0.qcow2 1M
         $ qemu-img create -f qcow2 hd1.qcow2 1M
         $ $QEMU -drive if=none,node-name=hd0,file=hd0.qcow2,\
                        backing.driver=qcow2,backing.file.filename=hd1.qcow2
         (qemu) qemu-io hd0 "reopen -o backing.l2-cache-size=2M"
      
      If the child does not inherit from the parent then it does not get
      reopened and its options cannot be changed:
      
         $ $QEMU -drive if=none,node-name=hd1,file=hd1.qcow2
                 -drive if=none,node-name=hd0,file=hd0.qcow2,backing=hd1
         (qemu) qemu-io hd0 "reopen -o backing.l2-cache-size=2M"
         Cannot change the option 'backing.l2-cache-size'
      
      If a disk image has a chain of backing files then all of them are also
      connected through their inherits_from pointers (i.e. it's possible to
      walk the chain in reverse order from base to top).
      
      However this is broken if the intermediate nodes are removed using
      e.g. block-stream because the inherits_from pointer from the base node
      becomes NULL:
      
         $ qemu-img create -f qcow2 hd0.qcow2 1M
         $ qemu-img create -f qcow2 -b hd0.qcow2 hd1.qcow2
         $ qemu-img create -f qcow2 -b hd1.qcow2 hd2.qcow2
         $ $QEMU -drive if=none,file=hd2.qcow2
         (qemu) qemu-io none0 "reopen -o backing.l2-cache-size=2M"
         (qemu) block_stream none0 0 hd0.qcow2
         (qemu) qemu-io none0 "reopen -o backing.l2-cache-size=2M"
         Cannot change the option 'backing.l2-cache-size'
      
      This patch updates the inherits_from pointer if the intermediate nodes
      of a backing chain are removed using bdrv_set_backing_hd(), and adds a
      test case for this scenario.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      0065c455
  8. 22 11月, 2018 1 次提交
  9. 19 11月, 2018 1 次提交
    • M
      block: Always abort reopen after prepare succeeded · 9ad08c44
      Max Reitz 提交于
      bdrv_reopen_multiple() does not invoke bdrv_reopen_abort() for the
      element of the reopen queue for which bdrv_reopen_prepare() failed,
      because it assumes that the prepare function will have rolled back all
      changes already.
      
      However, bdrv_reopen_prepare() does not do this in every case: It may
      notice an error after BlockDriver.bdrv_reopen_prepare() succeeded, and
      it will not invoke BlockDriver.bdrv_reopen_abort() then; and neither
      will bdrv_reopen_multiple(), as explained above.
      
      This is wrong because we must always call .bdrv_reopen_commit() or
      .bdrv_reopen_abort() after .bdrv_reopen_prepare() has succeeded.
      Otherwise, the block driver has no chance to undo what it has done in
      its implementation of .bdrv_reopen_prepare().
      
      To fix this, bdrv_reopen_prepare() has to call .bdrv_reopen_abort() if
      it wants to return an error after .bdrv_reopen_prepare() has succeeded.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      9ad08c44
  10. 05 11月, 2018 4 次提交
    • K
      block: Require auto-read-only for existing fallbacks · eaa2410f
      Kevin Wolf 提交于
      Some block drivers have traditionally changed their node to read-only
      mode without asking the user. This behaviour has been marked deprecated
      since 2.11, expecting users to provide an explicit read-only=on option.
      
      Now that we have auto-read-only=on, enable these drivers to make use of
      the option.
      
      This is the only use of bdrv_set_read_only(), so we can make it a bit
      more specific and turn it into a bdrv_apply_auto_read_only() that is
      more convenient for drivers to use.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      eaa2410f
    • K
      block: Add auto-read-only option · e35bdc12
      Kevin Wolf 提交于
      If a management application builds the block graph node by node, the
      protocol layer doesn't inherit its read-only option from the format
      layer any more, so it must be set explicitly.
      
      Backing files should work on read-only storage, but at the same time, a
      block job like commit should be able to reopen them read-write if they
      are on read-write storage. However, without option inheritance, reopen
      only changes the read-only option for the root node (typically the
      format layer), but not the protocol layer, so reopening fails (the
      format layer wants to get write permissions, but the protocol layer is
      still read-only).
      
      A simple workaround for the problem in the management tool would be to
      open the protocol layer always read-write and to make only the format
      layer read-only for backing files. However, sometimes the file is
      actually stored on read-only storage and we don't know whether the image
      can be opened read-write (for example, for NBD it depends on the server
      we're trying to connect to). This adds an option that makes QEMU try to
      open the image read-write, but allows it to degrade to a read-only mode
      without returning an error.
      
      The documentation for this option is consciously phrased in a way that
      allows QEMU to switch to a better model eventually: Instead of trying
      when the image is first opened, making the read-only flag dynamic and
      changing it automatically whenever the first BLK_PERM_WRITE user is
      attached or the last one is detached would be much more useful
      behaviour.
      
      Unfortunately, this more useful behaviour is also a lot harder to
      implement, and libvirt needs a solution now before it can switch to
      -blockdev, so let's start with this easier approach for now.
      
      Instead of adding a new auto-read-only option, turning the existing
      read-only into an enum (with a bool alternate for compatibility) was
      considered, but it complicated the implementation to the point that it
      didn't seem to be worth it.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      e35bdc12
    • K
      block: Update flags in bdrv_set_read_only() · eeae6a59
      Kevin Wolf 提交于
      To fully change the read-only state of a node, we must not only change
      bs->read_only, but also update bs->open_flags.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      eeae6a59
    • A
      415bbca8
  11. 30 10月, 2018 1 次提交
    • V
      dirty-bitmaps: clean-up bitmaps loading and migration logic · 9c98f145
      Vladimir Sementsov-Ogievskiy 提交于
      This patch aims to bring the following behavior:
      
      1. We don't load bitmaps, when started in inactive mode. It's the case
      of incoming migration. In this case we wait for bitmaps migration
      through migration channel (if 'dirty-bitmaps' capability is enabled) or
      for invalidation (to load bitmaps from the image).
      
      2. We don't remove persistent bitmaps on inactivation. Instead, we only
      remove bitmaps after storing. This is the only way to restore bitmaps,
      if we decided to resume source after [failed] migration with
      'dirty-bitmaps' capability enabled (which means, that bitmaps were not
      stored).
      
      3. We load bitmaps on open and any invalidation, it's ok for all cases:
        - normal open
        - migration target invalidation with dirty-bitmaps capability
          (bitmaps are migrating through migration channel, the are not
           stored, so they should have IN_USE flag set and will be skipped
           when loading. However, it would fail if bitmaps are read-only[1])
        - migration target invalidation without dirty-bitmaps capability
          (normal load of the bitmaps, if migrated with shared storage)
        - source invalidation with dirty-bitmaps capability
          (skip because IN_USE)
        - source invalidation without dirty-bitmaps capability
          (bitmaps were dropped, reload them)
      
      [1]: to accurately handle this, migration of read-only bitmaps is
           explicitly forbidden in this patch.
      
      New mechanism for not storing bitmaps when migrate with dirty-bitmaps
      capability is introduced: migration filed in BdrvDirtyBitmap.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      9c98f145
  12. 19 10月, 2018 2 次提交
    • M
      block: Clean up bdrv_img_create()'s error reporting · da7e92ca
      Markus Armbruster 提交于
      bdrv_img_create() takes an Error ** argument and uses it in the
      conventional way, except for one place: when qemu_opts_do_parse()
      fails, it first reports its error to stderr or the HMP monitor with
      error_report_err(), then error_setg()'s a generic error.
      
      When the caller reports that second error similarly, this produces two
      consecutive error messages on stderr or the HMP monitor.
      
      When the caller does something else with it, such as send it via QMP,
      the first error still goes to stderr or the HMP monitor.  Fortunately,
      no such caller exists.
      
      Simply use the first error as is.  Update expected output of
      qemu-iotest 049 accordingly.
      
      Cc: Kevin Wolf <kwolf@redhat.com>
      Cc: Max Reitz <mreitz@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20181017082702.5581-37-armbru@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      da7e92ca
    • M
      error: Fix use of error_prepend() with &error_fatal, &error_abort · 4b576648
      Markus Armbruster 提交于
      From include/qapi/error.h:
      
        * Pass an existing error to the caller with the message modified:
        *     error_propagate(errp, err);
        *     error_prepend(errp, "Could not frobnicate '%s': ", name);
      
      Fei Li pointed out that doing error_propagate() first doesn't work
      well when @errp is &error_fatal or &error_abort: the error_prepend()
      is never reached.
      
      Since I doubt fixing the documentation will stop people from getting
      it wrong, introduce error_propagate_prepend(), in the hope that it
      lures people away from using its constituents in the wrong order.
      Update the instructions in error.h accordingly.
      
      Convert existing error_prepend() next to error_propagate to
      error_propagate_prepend().  If any of these get reached with
      &error_fatal or &error_abort, the error messages improve.  I didn't
      check whether that's the case anywhere.
      
      Cc: Fei Li <fli@suse.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20181017082702.5581-2-armbru@redhat.com>
      4b576648
  13. 01 10月, 2018 6 次提交
    • A
      block: Allow changing 'detect-zeroes' on reopen · 543770bd
      Alberto Garcia 提交于
      'detect-zeroes' is one of the basic BlockdevOptions available for all
      drivers, but it's not handled by bdrv_reopen_prepare(), so any attempt
      to change it results in an error:
      
         (qemu) qemu-io virtio0 "reopen -o detect-zeroes=on"
         Cannot change the option 'detect-zeroes'
      
      Since there's no reason why we shouldn't allow changing it and the
      implementation is simple let's just do it.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      543770bd
    • A
      block: Allow changing 'discard' on reopen · 593b3071
      Alberto Garcia 提交于
      'discard' is one of the basic BlockdevOptions available for all
      drivers, but it's not handled by bdrv_reopen_prepare() so any attempt
      to change it results in an error:
      
         (qemu) qemu-io virtio0 "reopen -o discard=on"
         Cannot change the option 'discard'
      
      Since there's no reason why we shouldn't allow changing it and the
      implementation is simple let's just do it.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      593b3071
    • A
      block: Forbid trying to change unsupported options during reopen · 57f9db9a
      Alberto Garcia 提交于
      The bdrv_reopen_prepare() function checks all options passed to each
      BlockDriverState (in the reopen_state->options QDict) and makes all
      necessary preparations to apply the option changes requested by the
      user.
      
      Options are removed from the QDict as they are processed, so at the
      end of bdrv_reopen_prepare() only the options that can't be changed
      are left. Then a loop goes over all remaining options and verifies
      that the old and new values are identical, returning an error if
      they're not.
      
      The problem is that at the moment there are options that are removed
      from the QDict although they can't be changed. The consequence of this
      is any modification to any of those options is silently ignored:
      
         (qemu) qemu-io virtio0 "reopen -o discard=on"
      
      This happens when all options from bdrv_runtime_opts are removed
      from the QDict but then only a few of them are processed. Since
      it's especially important that "node-name" and "driver" are not
      changed, the code puts them back into the QDict so they are checked
      at the end of the function. Instead of putting only those two options
      back into the QDict, this patch puts all unprocessed options using
      qemu_opts_to_qdict().
      
      update_flags_from_options() also needs to be modified to prevent
      BDRV_OPT_CACHE_NO_FLUSH, BDRV_OPT_CACHE_DIRECT and BDRV_OPT_READ_ONLY
      from going back to the QDict.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      57f9db9a
    • A
      block: Allow child references on reopen · db905283
      Alberto Garcia 提交于
      In the previous patches we removed all child references from
      bs->{options,explicit_options} because keeping them is useless and
      wrong.
      
      Because of this, any attempt to reopen a BlockDriverState using a
      child reference as one of its options would result in a failure,
      because bdrv_reopen_prepare() would detect that there's a new option
      (the child reference) that wasn't present in bs->options.
      
      But passing child references on reopen can be useful. It's a way to
      specify a BDS's child without having to pass recursively all of the
      child's options, and if the reference points to a different BDS then
      this can allow us to replace the child.
      
      However, replacing the child is something that needs to be implemented
      case by case and only when it makes sense. For now, this patch allows
      passing a child reference as long as it points to the current child of
      the BlockDriverState.
      
      It's also important to remember that, as a consequence of the
      previous patches, this child reference will be removed from
      bs->{options,explicit_options} after the reopening has been completed.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      db905283
    • A
      block: Don't look for child references in append_open_options() · a600aadd
      Alberto Garcia 提交于
      In the previous patch we removed child references from bs->options, so
      there's no need to look for them here anymore.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      a600aadd
    • A
      block: Remove child references from bs->{options,explicit_options} · 50196d7a
      Alberto Garcia 提交于
      Block drivers allow opening their children using a reference to an
      existing BlockDriverState. These references remain stored in the
      'options' and 'explicit_options' QDicts, but we don't need to keep
      them once everything is open.
      
      What is more important, these values can become wrong if the children
      change:
      
          $ qemu-img create -f qcow2 hd0.qcow2 10M
          $ qemu-img create -f qcow2 hd1.qcow2 10M
          $ qemu-img create -f qcow2 hd2.qcow2 10M
          $ $QEMU -drive if=none,file=hd0.qcow2,node-name=hd0 \
                  -drive if=none,file=hd1.qcow2,node-name=hd1,backing=hd0 \
                  -drive file=hd2.qcow2,node-name=hd2,backing=hd1
      
      After this hd2 has hd1 as its backing file. Now let's remove it using
      block_stream:
      
          (qemu) block_stream hd2 0 hd0.qcow2
      
      Now hd0 is the backing file of hd2, but hd2's options QDicts still
      contain backing=hd1.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      50196d7a
  14. 25 9月, 2018 2 次提交
    • K
      block: Use a single global AioWait · cfe29d82
      Kevin Wolf 提交于
      When draining a block node, we recurse to its parent and for subtree
      drains also to its children. A single AIO_WAIT_WHILE() is then used to
      wait for bdrv_drain_poll() to become true, which depends on all of the
      nodes we recursed to. However, if the respective child or parent becomes
      quiescent and calls bdrv_wakeup(), only the AioWait of the child/parent
      is checked, while AIO_WAIT_WHILE() depends on the AioWait of the
      original node.
      
      Fix this by using a single AioWait for all callers of AIO_WAIT_WHILE().
      
      This may mean that the draining thread gets a few more unnecessary
      wakeups because an unrelated operation got completed, but we already
      wake it up when something _could_ have changed rather than only if it
      has certainly changed.
      
      Apart from that, drain is a slow path anyway. In theory it would be
      possible to use wakeups more selectively and still correctly, but the
      gains are likely not worth the additional complexity. In fact, this
      patch is a nice simplification for some places in the code.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      cfe29d82
    • A
      block: Fix use after free error in bdrv_open_inherit() · 8961be33
      Alberto Garcia 提交于
      When a block device is opened with BDRV_O_SNAPSHOT and the
      bdrv_append_temp_snapshot() call fails then the error code path tries
      to unref the already destroyed 'options' QDict.
      
      This can be reproduced easily by setting TMPDIR to a location where
      the QEMU process can't write:
      
         $ TMPDIR=/nonexistent $QEMU -drive driver=null-co,snapshot=on
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8961be33
  15. 25 8月, 2018 1 次提交
    • M
      qjson: Have qobject_from_json() & friends reject empty and blank · dd98e848
      Markus Armbruster 提交于
      The last case where qobject_from_json() & friends return null without
      setting an error is empty or blank input.  Callers:
      
      * block.c's parse_json_protocol() reports "Could not parse the JSON
        options".  It's marked as a work-around, because it also covered
        actual bugs, but they got fixed in the previous few commits.
      
      * qobject_input_visitor_new_str() reports "JSON parse error".  Also
        marked as work-around.  The recent fixes have made this unreachable,
        because it currently gets called only for input starting with '{'.
      
      * check-qjson.c's empty_input() and blank_input() demonstrate the
        behavior.
      
      * The other callers are not affected since they only pass input with
        exactly one JSON value or, in the case of negative tests, one error.
      
      Fail with "Expecting a JSON value" instead of returning null, and
      simplify callers.
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20180823164025.12553-48-armbru@redhat.com>
      dd98e848
  16. 15 8月, 2018 2 次提交
    • A
      block: Simplify append_open_options() · 261dbcb1
      Alberto Garcia 提交于
      This function returns a BDS's driver-specific options, excluding also
      those from its children. Since we have just removed all children
      options from bs->options there's no need to do this last step.
      
      We allow references to children, though ("backing": "node0"), so those
      we still have to remove.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      261dbcb1
    • A
      block: Update bs->options if bdrv_reopen() succeeds · 4c8350fe
      Alberto Garcia 提交于
      If bdrv_reopen() succeeds then bs->explicit_options is updated with
      the new values, but bs->options never changes.
      
      Here's an example:
      
         { "execute": "blockdev-add",
           "arguments": {
             "driver": "qcow2",
             "node-name": "hd0",
             "overlap-check": "all",
             "file": {
               "driver": "file",
               "filename": "hd0.qcow2"
             }
           }
         }
      
      After this, both bs->options and bs->explicit_options contain
      "overlap-check": "all".
      
      Now let's change that using qemu-io's reopen command:
      
         (qemu) qemu-io hd0 "reopen -o overlap-check=none"
      
      After this, bs->explicit_options contains the new value but
      bs->options still keeps the old one.
      
      This patch updates bs->options after a BDS has been successfully
      reopened.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      4c8350fe