Skip to content
Snippets Groups Projects
  1. Dec 13, 2020
  2. Dec 11, 2020
  3. Dec 10, 2020
  4. Oct 09, 2020
    • Kevin Wolf's avatar
      block: Convert 'block_resize' to coroutine · eb94b81a
      Kevin Wolf authored
      
      block_resize performs some I/O that could potentially take quite some
      time, so use it as an example for the new 'coroutine': true annotation
      in the QAPI schema.
      
      bdrv_truncate() requires that we're already in the right AioContext for
      the BlockDriverState if called in coroutine context. So instead of just
      taking the AioContext lock, move the QMP handler coroutine to the
      context.
      
      Call blk_unref() only after switching back because blk_unref() may only
      be called in the main thread.
      
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      Message-Id: <20201005155855.256490-15-kwolf@redhat.com>
      Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      eb94b81a
  5. Oct 06, 2020
    • Pavel Dovgalyuk's avatar
      migration: introduce icount field for snapshots · b39847a5
      Pavel Dovgalyuk authored
      
      Saving icount as a parameters of the snapshot allows navigation between
      them in the execution replay scenario.
      This information can be used for finding a specific snapshot for proceeding
      the recorded execution to the specific moment of the time.
      E.g., 'reverse step' action (introduced in one of the following patches)
      needs to load the nearest snapshot which is prior to the current moment
      of time.
      This patch also updates snapshot test which verifies qemu monitor output.
      
      Signed-off-by: default avatarPavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
      Acked-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Acked-by: default avatarKevin Wolf <kwolf@redhat.com>
      
      --
      
      v4 changes:
       - squashed format update with test output update
      v7 changes:
       - introduced the spaces between the fields in snapshot info output
       - updated the test to match new field widths
      Message-Id: <160174518865.12451.14327573383978752463.stgit@pasha-ThinkPad-X280>
      
      Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      b39847a5
  6. Sep 23, 2020
    • Stefan Hajnoczi's avatar
      qemu/atomic.h: rename atomic_ to qatomic_ · d73415a3
      Stefan Hajnoczi authored
      
      clang's C11 atomic_fetch_*() functions only take a C11 atomic type
      pointer argument. QEMU uses direct types (int, etc) and this causes a
      compiler error when a QEMU code calls these functions in a source file
      that also included <stdatomic.h> via a system header file:
      
        $ CC=clang CXX=clang++ ./configure ... && make
        ../util/async.c:79:17: error: address argument to atomic operation must be a pointer to _Atomic type ('unsigned int *' invalid)
      
      Avoid using atomic_*() names in QEMU's atomic.h since that namespace is
      used by <stdatomic.h>. Prefix QEMU's APIs with 'q' so that atomic.h
      and <stdatomic.h> can co-exist. I checked /usr/include on my machine and
      searched GitHub for existing "qatomic_" users but there seem to be none.
      
      This patch was generated using:
      
        $ git grep -h -o '\<atomic\(64\)\?_[a-z0-9_]\+' include/qemu/atomic.h | \
          sort -u >/tmp/changed_identifiers
        $ for identifier in $(</tmp/changed_identifiers); do
              sed -i "s%\<$identifier\>%q$identifier%g" \
                  $(git grep -I -l "\<$identifier\>")
          done
      
      I manually fixed line-wrap issues and misaligned rST tables.
      
      Signed-off-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: default avatarPhilippe Mathieu-Daudé <philmd@redhat.com>
      Acked-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
      Message-Id: <20200923105646.47864-1-stefanha@redhat.com>
      d73415a3
  7. Sep 07, 2020
    • Hanna Reitz's avatar
      blockdev: Fix active commit choice · 05ea385a
      Hanna Reitz authored
      
      We have to perform an active commit whenever the top node has a parent
      that has taken the WRITE permission on it.
      
      This means that block-commit's @backing-file parameter is no longer
      allowed for such nodes, and that users will have to issue a
      block-job-complete command.  Neither should pose a problem in practice,
      because this case was basically just broken until now.
      
      (Since this commit already touches block-commit's documentation, it also
      moves up the chunk explaining general block-commit behavior that for
      some reason was situated under @backing-file.)
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      05ea385a
    • Hanna Reitz's avatar
      commit: Deal with filters · 9a71b9de
      Hanna Reitz authored
      
      This includes some permission limiting (for example, we only need to
      take the RESIZE permission if the base is smaller than the top).
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      9a71b9de
    • Hanna Reitz's avatar
      backup: Deal with filters · 2b088c60
      Hanna Reitz authored
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
      2b088c60
    • Hanna Reitz's avatar
      mirror: Deal with filters · 3f072a7f
      Hanna Reitz authored
      
      This includes some permission limiting (for example, we only need to
      take the RESIZE permission for active commits where the base is smaller
      than the top).
      
      base_overlay is introduced so we can query bdrv_is_allocated_above() on
      it - we cannot do that with base itself, because a filter's block_status
      is the same as its child node, so if there are filters on base,
      bdrv_is_allocated_above() on base would return information including
      base.
      
      Use this opportunity to rename qmp_drive_mirror()'s "source" BDS to
      "target_backing_bs", because that is what it really refers to.
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      3f072a7f
    • Hanna Reitz's avatar
      blockdev: Use CAF in external_snapshot_prepare() · 7cc734a9
      Hanna Reitz authored
      
      This allows us to differentiate between filters and nodes with COW
      backing files: Filters cannot be used as overlays at all (for this
      function).
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      Reviewed-by: default avatarAndrey Shinkevich <andrey.shinkevich@virtuozzo.com>
      Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
      7cc734a9
    • Hanna Reitz's avatar
      stream: Deal with filters · 67acfd21
      Hanna Reitz authored
      
      Because of the (not so recent anymore) changes that make the stream job
      independent of the base node and instead track the node above it, we
      have to split that "bottom" node into two cases: The bottom COW node,
      and the node directly above the base node (which may be an R/W filter
      or the bottom COW node).
      
      Signed-off-by: default avatarMax Reitz <mreitz@redhat.com>
      67acfd21
  8. Jul 14, 2020
  9. Jul 10, 2020
    • Markus Armbruster's avatar
      error: Eliminate error_propagate() manually · 992861fb
      Markus Armbruster authored
      
      When all we do with an Error we receive into a local variable is
      propagating to somewhere else, we can just as well receive it there
      right away.  The previous two commits did that for sufficiently simple
      cases with Coccinelle.  Do it for several more manually.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <20200707160613.848843-37-armbru@redhat.com>
      992861fb
    • Markus Armbruster's avatar
      error: Eliminate error_propagate() with Coccinelle, part 2 · af175e85
      Markus Armbruster authored
      
      When all we do with an Error we receive into a local variable is
      propagating to somewhere else, we can just as well receive it there
      right away.  The previous commit did that with a Coccinelle script I
      consider fairly trustworthy.  This commit uses the same script with
      the matching of return taken out, i.e. we convert
      
          if (!foo(..., &err)) {
              ...
              error_propagate(errp, err);
              ...
          }
      
      to
      
          if (!foo(..., errp)) {
              ...
              ...
          }
      
      This is unsound: @err could still be read between afterwards.  I don't
      know how to express "no read of @err without an intervening write" in
      Coccinelle.  Instead, I manually double-checked for uses of @err.
      
      Suboptimal line breaks tweaked manually.  qdev_realize() simplified
      further to placate scripts/checkpatch.pl.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <20200707160613.848843-36-armbru@redhat.com>
      af175e85
    • Markus Armbruster's avatar
      error: Eliminate error_propagate() with Coccinelle, part 1 · 668f62ec
      Markus Armbruster authored
      
      When all we do with an Error we receive into a local variable is
      propagating to somewhere else, we can just as well receive it there
      right away.  Convert
      
          if (!foo(..., &err)) {
              ...
              error_propagate(errp, err);
              ...
              return ...
          }
      
      to
      
          if (!foo(..., errp)) {
              ...
              ...
              return ...
          }
      
      where nothing else needs @err.  Coccinelle script:
      
          @rule1 forall@
          identifier fun, err, errp, lbl;
          expression list args, args2;
          binary operator op;
          constant c1, c2;
          symbol false;
          @@
               if (
          (
          -        fun(args, &err, args2)
          +        fun(args, errp, args2)
          |
          -        !fun(args, &err, args2)
          +        !fun(args, errp, args2)
          |
          -        fun(args, &err, args2) op c1
          +        fun(args, errp, args2) op c1
          )
                  )
               {
                   ... when != err
                       when != lbl:
                       when strict
          -        error_propagate(errp, err);
                   ... when != err
          (
                   return;
          |
                   return c2;
          |
                   return false;
          )
               }
      
          @rule2 forall@
          identifier fun, err, errp, lbl;
          expression list args, args2;
          expression var;
          binary operator op;
          constant c1, c2;
          symbol false;
          @@
          -    var = fun(args, &err, args2);
          +    var = fun(args, errp, args2);
               ... when != err
               if (
          (
                   var
          |
                   !var
          |
                   var op c1
          )
                  )
               {
                   ... when != err
                       when != lbl:
                       when strict
          -        error_propagate(errp, err);
                   ... when != err
          (
                   return;
          |
                   return c2;
          |
                   return false;
          |
                   return var;
          )
               }
      
          @depends on rule1 || rule2@
          identifier err;
          @@
          -    Error *err = NULL;
               ... when != err
      
      Not exactly elegant, I'm afraid.
      
      The "when != lbl:" is necessary to avoid transforming
      
               if (fun(args, &err)) {
                   goto out
               }
               ...
           out:
               error_propagate(errp, err);
      
      even though other paths to label out still need the error_propagate().
      For an actual example, see sclp_realize().
      
      Without the "when strict", Coccinelle transforms vfio_msix_setup(),
      incorrectly.  I don't know what exactly "when strict" does, only that
      it helps here.
      
      The match of return is narrower than what I want, but I can't figure
      out how to express "return where the operand doesn't use @err".  For
      an example where it's too narrow, see vfio_intx_enable().
      
      Silently fails to convert hw/arm/armsse.c, because Coccinelle gets
      confused by ARMSSE being used both as typedef and function-like macro
      there.  Converted manually.
      
      Line breaks tidied up manually.  One nested declaration of @local_err
      deleted manually.  Preexisting unwanted blank line dropped in
      hw/riscv/sifive_e.c.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Message-Id: <20200707160613.848843-35-armbru@redhat.com>
      668f62ec
    • Markus Armbruster's avatar
      qemu-option: Use returned bool to check for failure · 235e59cf
      Markus Armbruster authored
      
      The previous commit enables conversion of
      
          foo(..., &err);
          if (err) {
              ...
          }
      
      to
      
          if (!foo(..., &err)) {
              ...
          }
      
      for QemuOpts functions that now return true / false on success /
      error.  Coccinelle script:
      
          @@
          identifier fun = {
              opts_do_parse, parse_option_bool, parse_option_number,
              parse_option_size, qemu_opt_parse, qemu_opt_rename, qemu_opt_set,
              qemu_opt_set_bool, qemu_opt_set_number, qemu_opts_absorb_qdict,
              qemu_opts_do_parse, qemu_opts_from_qdict_entry, qemu_opts_set,
              qemu_opts_validate
          };
          expression list args, args2;
          typedef Error;
          Error *err;
          @@
          -    fun(args, &err, args2);
          -    if (err)
          +    if (!fun(args, &err, args2))
               {
                   ...
               }
      
      A few line breaks tidied up manually.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20200707160613.848843-15-armbru@redhat.com>
      [Conflict with commit 0b6786a9 "block/amend: refactor qcow2 amend
      options" resolved by rerunning Coccinelle on master's version]
      235e59cf
    • Markus Armbruster's avatar
      qemu-option: Make functions taking Error ** return bool, not void · c75d7f71
      Markus Armbruster authored
      
      See recent commit "error: Document Error API usage rules" for
      rationale.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Message-Id: <20200707160613.848843-14-armbru@redhat.com>
      c75d7f71
    • Markus Armbruster's avatar
      qemu-option: Check return value instead of @err where convenient · c6ecec43
      Markus Armbruster authored
      
      Convert uses like
      
          opts = qemu_opts_create(..., &err);
          if (err) {
              ...
          }
      
      to
      
          opts = qemu_opts_create(..., errp);
          if (!opts) {
              ...
          }
      
      Eliminate error_propagate() that are now unnecessary.  Delete @err
      that are now unused.
      
      Note that we can't drop parallels_open()'s error_propagate() here.  We
      continue to execute it even in the converted case.  It's a no-op then:
      local_err is null.
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Reviewed-by: default avatarGreg Kurz <groug@kaod.org>
      Message-Id: <20200707160613.848843-8-armbru@redhat.com>
      c6ecec43
  10. Jun 23, 2020
    • Markus Armbruster's avatar
      blockdev: Deprecate -drive with bogus interface type · a1b40bda
      Markus Armbruster authored
      
      Drives with interface types other than if=none are for onboard
      devices.  Unfortunately, any such drives the board doesn't pick up can
      still be used with -device, like this:
      
          $ qemu-system-x86_64 -nodefaults -display none -S -drive if=floppy,id=bogus,unit=7 -device ide-cd,drive=bogus -monitor stdio
          QEMU 5.0.50 monitor - type 'help' for more information
          (qemu) info block
          bogus: [not inserted]
      	Attached to:      /machine/peripheral-anon/device[0]
      	Removable device: not locked, tray closed
          (qemu) info qtree
          bus: main-system-bus
            type System
            [...]
      	    bus: ide.1
      	      type IDE
      	      dev: ide-cd, id ""
      --->		drive = "bogus"
      		[...]
      		unit = 0 (0x0)
            [...]
      
      This kind of abuse has always worked.  Deprecate it:
      
          qemu-system-x86_64: -drive if=floppy,id=bogus,unit=7: warning: bogus if=floppy is deprecated, use if=none
      
      Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
      Message-Id: <20200622094227.1271650-9-armbru@redhat.com>
      a1b40bda
  11. May 19, 2020
    • Eric Blake's avatar
      blockdev: Split off basic bitmap operations for qemu-img · bb4e58c6
      Eric Blake authored
      
      Upcoming patches want to add some basic bitmap manipulation abilities
      to qemu-img.  But blockdev.o is too heavyweight to link into qemu-img
      (among other things, it would drag in block jobs and transaction
      support - qemu-img does offline manipulation, where atomicity is less
      important because there are no concurrent modifications to compete
      with), so it's time to split off the bare bones of what we will need
      into a new file block/monitor/bitmap-qmp-cmds.o.
      
      This is sufficient to expose 6 QMP commands for use by qemu-img (add,
      remove, clear, enable, disable, merge), as well as move the three
      helper functions touched in the previous patch.  Regarding
      MAINTAINERS, the new file is automatically part of block core, but
      also makes sense as related to other dirty bitmap files.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
      Message-Id: <20200513011648.166876-6-eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      bb4e58c6
    • Eric Blake's avatar
      blockdev: Promote several bitmap functions to non-static · c6996cf9
      Eric Blake authored
      
      The next patch will split blockdev.c, which will require accessing
      some previously-static functions from more than one .c file.  But part
      of promoting a function to public is picking a naming scheme that does
      not reek of exposing too many internals (two of the three functions
      were named starting with 'do_').  To make future code motion easier,
      perform the function rename and non-static promotion into its own
      patch.
      
      Signed-off-by: default avatarEric Blake <eblake@redhat.com>
      Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
      Message-Id: <20200513011648.166876-5-eblake@redhat.com>
      Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      c6996cf9
  12. May 05, 2020
  13. May 04, 2020
  14. Apr 30, 2020
  15. Apr 07, 2020
    • Stefan Reiter's avatar
      job: take each job's lock individually in job_txn_apply · b660a84b
      Stefan Reiter authored
      
      All callers of job_txn_apply hold a single job's lock, but different
      jobs within a transaction can have different contexts, thus we need to
      lock each one individually before applying the callback function.
      
      Similar to job_completed_txn_abort this also requires releasing the
      caller's context before and reacquiring it after to avoid recursive
      locks which might break AIO_WAIT_WHILE in the callback. This is safe, since
      existing code would already have to take this into account, lest
      job_completed_txn_abort might have broken.
      
      This also brings to light a different issue: When a callback function in
      job_txn_apply moves it's job to a different AIO context, callers will
      try to release the wrong lock (now that we re-acquire the lock
      correctly, previously it would just continue with the old lock, leaving
      the job unlocked for the rest of the return path). Fix this by not caching
      the job's context.
      
      This is only necessary for qmp_block_job_finalize, qmp_job_finalize and
      job_exit, since everyone else calls through job_exit.
      
      One test needed adapting, since it calls job_finalize directly, so it
      manually needs to acquire the correct context.
      
      Signed-off-by: default avatarStefan Reiter <s.reiter@proxmox.com>
      Message-Id: <20200407115651.69472-2-s.reiter@proxmox.com>
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      b660a84b
  16. Mar 11, 2020
    • Kevin Wolf's avatar
      block: Fix cross-AioContext blockdev-snapshot · 30dd65f3
      Kevin Wolf authored
      
      external_snapshot_prepare() tries to move the overlay to the AioContext
      of the backing file (the snapshotted node). However, it's possible that
      this doesn't work, but the backing file can instead be moved to the
      overlay's AioContext (e.g. opening the backing chain for a mirror
      target).
      
      bdrv_append() already indirectly uses bdrv_attach_node(), which takes
      care to move nodes to make sure they use the same AioContext and which
      tries both directions.
      
      So the problem has a simple fix: Just delete the unnecessary extra
      bdrv_try_set_aio_context() call in external_snapshot_prepare() and
      instead assert in bdrv_append() that both nodes were indeed moved to the
      same AioContext.
      
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      Message-Id: <20200310113831.27293-6-kwolf@redhat.com>
      Tested-by: default avatarPeter Krempa <pkrempa@redhat.com>
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      30dd65f3
    • Kevin Wolf's avatar
      block: Relax restrictions for blockdev-snapshot · d29d3d1f
      Kevin Wolf authored
      
      blockdev-snapshot returned an error if the overlay was already in use,
      which it defined as having any BlockBackend parent. This is in fact both
      too strict (some parents can tolerate the change of visible data caused
      by attaching a backing file) and too loose (some non-BlockBackend
      parents may not be happy with it).
      
      One important use case that is prevented by the too strict check is live
      storage migration with blockdev-mirror. Here, the target node is
      usually opened without a backing file so that the active layer is
      mirrored while its backing chain can be copied in the background.
      
      The backing chain should be attached to the mirror target node when
      finalising the job, just before switching the users of the source node
      to the new copy (at which point the mirror job still has a reference to
      the node). drive-mirror did this automatically, but with blockdev-mirror
      this is the job of the QMP client, so it needs a way to do this.
      
      blockdev-snapshot is the obvious way, so this patch makes it work in
      this scenario. The new condition is that no parent uses CONSISTENT_READ
      permissions. This will ensure that the operation will still be blocked
      when the node is attached to the guest device, so blockdev-snapshot
      remains safe.
      
      (For the sake of completeness, x-blockdev-reopen can be used to achieve
      the same, however it is a big hammer, performs the graph change
      completely unchecked and is still experimental. So even with the option
      of using x-blockdev-reopen, there are reasons why blockdev-snapshot
      should be able to perform this operation.)
      
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      Message-Id: <20200310113831.27293-3-kwolf@redhat.com>
      Reviewed-by: default avatarPeter Krempa <pkrempa@redhat.com>
      Tested-by: default avatarPeter Krempa <pkrempa@redhat.com>
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      d29d3d1f
  17. Mar 09, 2020
  18. Mar 06, 2020
  19. Feb 20, 2020
  20. Feb 18, 2020
  21. Jan 30, 2020
  22. Jan 27, 2020
    • Sergio Lopez's avatar
      blockdev: Return bs to the proper context on snapshot abort · 377410f6
      Sergio Lopez authored
      external_snapshot_abort() calls to bdrv_set_backing_hd(), which
      returns state->old_bs to the main AioContext, as it's intended to be
      used then the BDS is going to be released. As that's not the case when
      aborting an external snapshot, return it to the AioContext it was
      before the call.
      
      This issue can be triggered by issuing a transaction with two actions,
      a proper blockdev-snapshot-sync and a bogus one, so the second will
      trigger a transaction abort. This results in a crash with an stack
      trace like this one:
      
       #0  0x00007fa1048b28df in __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:50
       #1  0x00007fa10489ccf5 in __GI_abort () at abort.c:79
       #2  0x00007fa10489cbc9 in __assert_fail_base
           (fmt=0x7fa104a03300 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=0x5572240b44d8 "bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs)", file=0x557224014d30 "block.c", line=2240, function=<optimized out>) at assert.c:92
       #3  0x00007fa1048aae96 in __GI___assert_fail
           (assertion=assertion@entry=0x5572240b44d8 "bdrv_get_aio_context(old_bs) == bdrv_get_aio_context(new_bs)", file=file@entry=0x557224014d30 "block.c", line=line@entry=2240, function=function@entry=0x5572240b5d60 <__PRETTY_FUNCTION__.31620> "bdrv_replace_child_noperm") at assert.c:101
       #4  0x0000557223e631f8 in bdrv_replace_child_noperm (child=0x557225b9c980, new_bs=new_bs@entry=0x557225c42e40) at block.c:2240
       #5  0x0000557223e68be7 in bdrv_replace_node (from=0x557226951a60, to=0x557225c42e40, errp=0x5572247d6138 <error_abort>) at block.c:4196
       #6  0x0000557223d069c4 in external_snapshot_abort (common=0x557225d7e170) at blockdev.c:1731
       #7  0x0000557223d069c4 in external_snapshot_abort (common=0x557225d7e170) at blockdev.c:1717
       #8  0x0000557223d09013 in qmp_transaction (dev_list=<optimized out>, has_props=<optimized out>, props=0x557225cc7d70, errp=errp@entry=0x7ffe704c0c98) at blockdev.c:2360
       #9  0x0000557223e32085 in qmp_marshal_transaction (args=<optimized out>, ret=<optimized out>, errp=0x7ffe704c0d08) at qapi/qapi-commands-transaction.c:44
       #10 0x0000557223ee798c in do_qmp_dispatch (errp=0x7ffe704c0d00, allow_oob=<optimized out>, request=<optimized out>, cmds=0x5572247d3cc0 <qmp_commands>) at qapi/qmp-dispatch.c:132
       #11 0x0000557223ee798c in qmp_dispatch (cmds=0x5572247d3cc0 <qmp_commands>, request=<optimized out>, allow_oob=<optimized out>) at qapi/qmp-dispatch.c:175
       #12 0x0000557223e06141 in monitor_qmp_dispatch (mon=0x557225c69ff0, req=<optimized out>) at monitor/qmp.c:120
       #13 0x0000557223e0678a in monitor_qmp_bh_dispatcher (data=<optimized out>) at monitor/qmp.c:209
       #14 0x0000557223f2f366 in aio_bh_call (bh=0x557225b9dc60) at util/async.c:117
       #15 0x0000557223f2f366 in aio_bh_poll (ctx=ctx@entry=0x557225b9c840) at util/async.c:117
       #16 0x0000557223f32754 in aio_dispatch (ctx=0x557225b9c840) at util/aio-posix.c:459
       #17 0x0000557223f2f242 in aio_ctx_dispatch (source=<optimized out>, callback=<optimized out>, user_data=<optimized out>) at util/async.c:260
       #18 0x00007fa10913467d in g_main_dispatch (context=0x557225c28e80) at gmain.c:3176
       #19 0x00007fa10913467d in g_main_context_dispatch (context=context@entry=0x557225c28e80) at gmain.c:3829
       #20 0x0000557223f31808 in glib_pollfds_poll () at util/main-loop.c:219
       #21 0x0000557223f31808 in os_host_main_loop_wait (timeout=<optimized out>) at util/main-loop.c:242
       #22 0x0000557223f31808 in main_loop_wait (nonblocking=<optimized out>) at util/main-loop.c:518
       #23 0x0000557223d13201 in main_loop () at vl.c:1828
       #24 0x0000557223bbfb82 in main (argc=<optimized out>, argv=<optimized out>, envp=<optimized out>) at vl.c:4504
      
      RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1779036
      
      
      Signed-off-by: default avatarSergio Lopez <slp@redhat.com>
      Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
      377410f6
Loading