1. 20 3月, 2018 2 次提交
  2. 19 3月, 2018 38 次提交
    • P
      Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging · 2c8cfc0b
      Peter Maydell 提交于
      Block layer patches
      
      # gpg: Signature made Mon 19 Mar 2018 11:01:45 GMT
      # gpg:                using RSA key 7F09B272C88F2FD6
      # gpg: Good signature from "Kevin Wolf <kwolf@redhat.com>"
      # Primary key fingerprint: DC3D EB15 9A9A F95D 3D74  56FE 7F09 B272 C88F 2FD6
      
      * remotes/kevin/tags/for-upstream: (46 commits)
        iotests: Avoid realpath, for CentOS 6
        block: fix iotest 146 output expectations
        iscsi: fix iSER compilation
        block: Fix leak of ignore_children in error path
        vvfat: Fix inherit_options flags
        block/mirror: change the semantic of 'force' of block-job-cancel
        vpc: Require aligned size in .bdrv_co_create
        vpc: Support .bdrv_co_create
        vhdx: Support .bdrv_co_create
        vdi: Make comments consistent with other drivers
        qed: Support .bdrv_co_create
        qcow: Support .bdrv_co_create
        qemu-iotests: Enable write tests for parallels
        parallels: Support .bdrv_co_create
        iotests: Add regression test for commit base locking
        block: Fix flags in reopen queue
        vdi: Implement .bdrv_co_create
        vdi: Move file creation to vdi_co_create_opts
        vdi: Pull option parsing from vdi_co_create
        qemu-iotests: Test luks QMP image creation
        ...
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      2c8cfc0b
    • E
      iotests: Avoid realpath, for CentOS 6 · 63ca8406
      Eric Blake 提交于
      CentOS 6 lacks a realpath binary on the base install, which makes
      all iotests runs fail since the 2.11 release:
      
      001         - output mismatch (see 001.out.bad)
      ./check: line 815: realpath: command not found
      diff: missing operand after `/home/dummy/qemu/tests/qemu-iotests/001.out'
      diff: Try `diff --help' for more information.
      
      Many of the uses of 'realpath' in the check script were being
      used on the output of 'type -p' - but that is already an
      absolute file name.  While a canonical name can often be
      shorter (realpath gets rid of /../), it can also be longer (due
      to symlink expansion); and we really don't care if the name is
      canonical, merely that it was an executable file with an
      absolute path.  These were broken in commit cceaf1db.
      
      The remaining use of realpath was to convert a possibly relative
      filename into an absolute one before calling diff to make it
      easier to copy-and-paste the filename for moving the .bad file
      into place as the new reference file even when running iotests
      out-of-tree (see commit 93e53fb6), but $PWD can achieve the same
      purpose.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
      Reviewed-by: NJeff Cody <jcody@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <f4bug@amsat.org>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      63ca8406
    • J
      block: fix iotest 146 output expectations · 181bb882
      Jeff Cody 提交于
      Commit bff55548 added "force_size" into the common.filter for
      _filter_img_create(), but test 146 still expects it in the output.
      Signed-off-by: NJeff Cody <jcody@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      181bb882
    • P
      iscsi: fix iSER compilation · b16a7cfa
      Paolo Bonzini 提交于
      This fails in Fedora 28.
      Reported-by: NAndreas Schwab <schwab@suse.de>
      Signed-off-by: NPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      b16a7cfa
    • F
      block: Fix leak of ignore_children in error path · 2c860e79
      Fam Zheng 提交于
      Reported-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      2c860e79
    • F
      vvfat: Fix inherit_options flags · 4f8e3a1f
      Fam Zheng 提交于
      Overriding flags violates the precedence rules of
      bdrv_reopen_queue_child. Just like the read-only option, no-flush should
      be put into the options. The same is done in bdrv_temp_snapshot_options.
      Reported-by: NStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      4f8e3a1f
    • L
      block/mirror: change the semantic of 'force' of block-job-cancel · b76e4458
      Liang Li 提交于
      When doing drive mirror to a low speed shared storage, if there was heavy
      BLK IO write workload in VM after the 'ready' event, drive mirror block job
      can't be canceled immediately, it would keep running until the heavy BLK IO
      workload stopped in the VM.
      
      Libvirt depends on the current block-job-cancel semantics, which is that
      when used without a flag after the 'ready' event, the command blocks
      until data is in sync.  However, these semantics are awkward in other
      situations, for example, people may use drive mirror for realtime
      backups while still wanting to use block live migration.  Libvirt cannot
      start a block live migration while another drive mirror is in progress,
      but the user would rather abandon the backup attempt as broken and
      proceed with the live migration than be stuck waiting for the current
      drive mirror backup to finish.
      
      The drive-mirror command already includes a 'force' flag, which libvirt
      does not use, although it documented the flag as only being useful to
      quit a job which is paused.  However, since quitting a paused job has
      the same effect as abandoning a backup in a non-paused job (namely, the
      destination file is not in sync, and the command completes immediately),
      we can just improve the documentation to make the force flag obviously
      useful.
      
      Cc: Paolo Bonzini <pbonzini@redhat.com>
      Cc: Jeff Cody <jcody@redhat.com>
      Cc: Kevin Wolf <kwolf@redhat.com>
      Cc: Max Reitz <mreitz@redhat.com>
      Cc: Eric Blake <eblake@redhat.com>
      Cc: John Snow <jsnow@redhat.com>
      Reported-by: NHuaitong Han <huanhuaitong@didichuxing.com>
      Signed-off-by: NHuaitong Han <huanhuaitong@didichuxing.com>
      Signed-off-by: NLiang Li <liliangleo@didichuxing.com>
      Signed-off-by: NJeff Cody <jcody@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      b76e4458
    • K
      vpc: Require aligned size in .bdrv_co_create · 1cfeaf38
      Kevin Wolf 提交于
      Perform the rounding to match a CHS geometry only in the legacy code
      path in .bdrv_co_create_opts. QMP now requires that the user already
      passes a CHS aligned image size, unless force-size=true is given.
      
      CHS alignment is required to make the image compatible with Virtual PC,
      but not for use with newer Microsoft hypervisors.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      1cfeaf38
    • K
      vpc: Support .bdrv_co_create · 182c8835
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to vpc, which
      enables image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      182c8835
    • K
      vhdx: Support .bdrv_co_create · 09b68dab
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to vhdx, which
      enables image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      09b68dab
    • K
      vdi: Make comments consistent with other drivers · da23248f
      Kevin Wolf 提交于
      This makes the .bdrv_co_create(_opts) implementation of vdi look more
      like the other recently converted block drivers.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      da23248f
    • K
      qed: Support .bdrv_co_create · 959355a4
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to qed, which
      enables image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      959355a4
    • K
      qcow: Support .bdrv_co_create · 42a3e1ab
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to qcow, which
      enables image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJeff Cody <jcody@redhat.com>
      42a3e1ab
    • K
      qemu-iotests: Enable write tests for parallels · e1473133
      Kevin Wolf 提交于
      Originally we added parallels as a read-only format to qemu-iotests
      where we did just some tests with a binary image. Since then, write and
      image creation support has been added to the driver, so we can now
      enable it in _supported_fmt generic.
      
      The driver doesn't support migration yet, though, so we need to add it
      to the list of exceptions in 181.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJeff Cody <jcody@redhat.com>
      e1473133
    • K
      parallels: Support .bdrv_co_create · 1511b490
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to parallels, which
      enables image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJeff Cody <jcody@redhat.com>
      1511b490
    • F
      iotests: Add regression test for commit base locking · de963500
      Fam Zheng 提交于
      Signed-off-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      de963500
    • F
      block: Fix flags in reopen queue · 1a529736
      Fam Zheng 提交于
      Reopen flags are not synchronized according to the
      bdrv_reopen_queue_child precedence until bdrv_reopen_prepare. It is a
      bit too late: we already check the consistency in bdrv_check_perm before
      that.
      
      This fixes the bug that when bdrv_reopen a RO node as RW, the flags for
      backing child are wrong. Before, we could recurse with flags.rw=1; now,
      role->inherit_options + update_flags_from_options will make sure to
      clear the bit when necessary.  Note that this will not clear an
      explicitly set bit, as in the case of parallel block jobs (e.g.
      test_stream_parallel in 030), because the explicit options include
      'read-only=false' (for an intermediate node used by a different job).
      Signed-off-by: NFam Zheng <famz@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      1a529736
    • M
      vdi: Implement .bdrv_co_create · e3810574
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e3810574
    • M
      vdi: Move file creation to vdi_co_create_opts · ec73f060
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ec73f060
    • M
      vdi: Pull option parsing from vdi_co_create · 49858b50
      Max Reitz 提交于
      In preparation of QAPI-fying VDI image creation, we have to create a
      BlockdevCreateOptionsVdi type which is received by a (future)
      vdi_co_create().
      
      vdi_co_create_opts() now converts the QemuOpts object into such a
      BlockdevCreateOptionsVdi object.  The protocol-layer file is still
      created in vdi_co_do_create() (and BlockdevCreateOptionsVdi.file is set
      to an empty string), but that will be addressed by a follow-up patch.
      
      Note that cluster-size is not part of the QAPI schema because it is not
      supported by default.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      49858b50
    • K
      qemu-iotests: Test luks QMP image creation · d06195e6
      Kevin Wolf 提交于
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      d06195e6
    • K
      luks: Catch integer overflow for huge sizes · 3d7ed9c4
      Kevin Wolf 提交于
      When you request an image size close to UINT64_MAX, the addition of the
      crypto header may cause an integer overflow. Catch it instead of
      silently truncating the image size.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      3d7ed9c4
    • K
      luks: Turn invalid assertion into check · e39e959e
      Kevin Wolf 提交于
      The .bdrv_getlength implementation of the crypto block driver asserted
      that the payload offset isn't after EOF. This is an invalid assertion to
      make as the image file could be corrupted. Instead, check it and return
      -EIO if the file is too small for the payload offset.
      
      Zero length images are fine, so trigger -EIO only on offset > len, not
      on offset >= len as the assertion did before.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      e39e959e
    • K
      luks: Support .bdrv_co_create · 1bedcaf1
      Kevin Wolf 提交于
      This adds the .bdrv_co_create driver callback to luks, which enables
      image creation over QMP.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      1bedcaf1
    • K
      luks: Create block_crypto_co_create_generic() · 1ec4f416
      Kevin Wolf 提交于
      Everything that refers to the protocol layer or QemuOpts is moved out of
      block_crypto_create_generic(), so that the remaining function is
      suitable to be called by a .bdrv_co_create implementation.
      
      LUKS is the only driver that actually implements the old interface, and
      we don't intend to use it in any new drivers, so put the moved out code
      directly into a LUKS function rather than creating a generic
      intermediate one.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      1ec4f416
    • K
      luks: Separate image file creation from formatting · 3b5a1f6a
      Kevin Wolf 提交于
      The crypto driver used to create the image file in a callback from the
      crypto subsystem. If we want to implement .bdrv_co_create, this needs to
      go away because that callback will get a reference to an already
      existing block node.
      
      Move the image file creation to block_crypto_create_generic().
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      3b5a1f6a
    • J
      tests/test-blockjob: test cancellations · fb367e03
      John Snow 提交于
      Whatever the state a blockjob is in, it should be able to be canceled
      by the block layer.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      fb367e03
    • J
      iotests: test manual job dismissal · 6d8be967
      John Snow 提交于
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      6d8be967
    • J
      blockjobs: Expose manual property · b40dacdc
      John Snow 提交于
      Expose the "manual" property via QAPI for the backup-related jobs.
      As of this commit, this allows the management API to request the
      "concluded" and "dismiss" semantics for backup jobs.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      b40dacdc
    • J
      blockjobs: add block-job-finalize · 11b61fbc
      John Snow 提交于
      Instead of automatically transitioning from PENDING to CONCLUDED, gate
      the .prepare() and .commit() phases behind an explicit acknowledgement
      provided by the QMP monitor if auto_finalize = false has been requested.
      
      This allows us to perform graph changes in prepare and/or commit so that
      graph changes do not occur autonomously without knowledge of the
      controlling management layer.
      
      Transactions that have reached the "PENDING" state together can all be
      moved to invoke their finalization methods by issuing block_job_finalize
      to any one job in the transaction.
      
      Jobs in a transaction with mixed job->auto_finalize settings will all
      remain stuck in the "PENDING" state, as if the entire transaction was
      specified with auto_finalize = false. Jobs that specified
      auto_finalize = true, however, will still not emit the PENDING event.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      11b61fbc
    • J
      blockjobs: add PENDING status and event · 5f241594
      John Snow 提交于
      For jobs utilizing the new manual workflow, we intend to prohibit
      them from modifying the block graph until the management layer provides
      an explicit ACK via block-job-finalize to move the process forward.
      
      To distinguish this runstate from "ready" or "waiting," we add a new
      "pending" event and status.
      
      For now, the transition from PENDING to CONCLUDED/ABORTING is automatic,
      but a future commit will add the explicit block-job-finalize step.
      
      Transitions:
      Waiting -> Pending:   Normal transition.
      Pending -> Concluded: Normal transition.
      Pending -> Aborting:  Late transactional failures and cancellations.
      
      Removed Transitions:
      Waiting -> Concluded: Jobs must go to PENDING first.
      
      Verbs:
      Cancel: Can be applied to a pending job.
      
                   +---------+
                   |UNDEFINED|
                   +--+------+
                      |
                   +--v----+
         +---------+CREATED+-----------------+
         |         +--+----+                 |
         |            |                      |
         |         +--+----+     +------+    |
         +---------+RUNNING<----->PAUSED|    |
         |         +--+-+--+     +------+    |
         |            | |                    |
         |            | +------------------+ |
         |            |                    | |
         |         +--v--+       +-------+ | |
         +---------+READY<------->STANDBY| | |
         |         +--+--+       +-------+ | |
         |            |                    | |
         |         +--v----+               | |
         +---------+WAITING<---------------+ |
         |         +--+----+                 |
         |            |                      |
         |         +--v----+                 |
         +---------+PENDING|                 |
         |         +--+----+                 |
         |            |                      |
      +--v-----+   +--v------+               |
      |ABORTING+--->CONCLUDED|               |
      +--------+   +--+------+               |
                      |                      |
                   +--v-+                    |
                   |NULL<--------------------+
                   +----+
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      5f241594
    • J
      blockjobs: add waiting status · e8af5686
      John Snow 提交于
      For jobs that are stuck waiting on others in a transaction, it would
      be nice to know that they are no longer "running" in that sense, but
      instead are waiting on other jobs in the transaction.
      
      Jobs that are "waiting" in this sense cannot be meaningfully altered
      any longer as they have left their running loop. The only meaningful
      user verb for jobs in this state is "cancel," which will cancel the
      whole transaction, too.
      
      Transitions:
      Running -> Waiting:   Normal transition.
      Ready   -> Waiting:   Normal transition.
      Waiting -> Aborting:  Transactional cancellation.
      Waiting -> Concluded: Normal transition.
      
      Removed Transitions:
      Running -> Concluded: Jobs must go to WAITING first.
      Ready   -> Concluded: Jobs must go to WAITING first.
      
      Verbs:
      Cancel: Can be applied to WAITING jobs.
      
                   +---------+
                   |UNDEFINED|
                   +--+------+
                      |
                   +--v----+
         +---------+CREATED+-----------------+
         |         +--+----+                 |
         |            |                      |
         |         +--v----+     +------+    |
         +---------+RUNNING<----->PAUSED|    |
         |         +--+-+--+     +------+    |
         |            | |                    |
         |            | +------------------+ |
         |            |                    | |
         |         +--v--+       +-------+ | |
         +---------+READY<------->STANDBY| | |
         |         +--+--+       +-------+ | |
         |            |                    | |
         |         +--v----+               | |
         +---------+WAITING<---------------+ |
         |         +--+----+                 |
         |            |                      |
      +--v-----+   +--v------+               |
      |ABORTING+--->CONCLUDED|               |
      +--------+   +--+------+               |
                      |                      |
                   +--v-+                    |
                   |NULL<--------------------+
                   +----+
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e8af5686
    • J
      blockjobs: add prepare callback · 2da4617a
      John Snow 提交于
      Some jobs upon finalization may need to perform some work that can
      still fail. If these jobs are part of a transaction, it's important
      that these callbacks fail the entire transaction.
      
      We allow for a new callback in addition to commit/abort/clean that
      allows us the opportunity to have fairly late-breaking failures
      in the transactional process.
      
      The expected flow is:
      
      - All jobs in a transaction converge to the PENDING state,
        added in a forthcoming commit.
      - Upon being finalized, either automatically or explicitly
        by the user, jobs prepare to complete.
      - If any job fails preparation, all jobs call .abort.
      - Otherwise, they succeed and call .commit.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      2da4617a
    • J
      blockjobs: add block_job_txn_apply function · efe4d4b7
      John Snow 提交于
      Simply apply a function transaction-wide.
      A few more uses of this in forthcoming patches.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      efe4d4b7
    • J
      blockjobs: add commit, abort, clean helpers · 43628d93
      John Snow 提交于
      The completed_single function is getting a little mucked up with
      checking to see which callbacks exist, so let's factor them out.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      43628d93
    • J
      blockjobs: ensure abort is called for cancelled jobs · 35d6b368
      John Snow 提交于
      Presently, even if a job is canceled post-completion as a result of
      a failing peer in a transaction, it will still call .commit because
      nothing has updated or changed its return code.
      
      The reason why this does not cause problems currently is because
      backup's implementation of .commit checks for cancellation itself.
      
      I'd like to simplify this contract:
      
      (1) Abort is called if the job/transaction fails
      (2) Commit is called if the job/transaction succeeds
      
      To this end: A job's return code, if 0, will be forcibly set as
      -ECANCELED if that job has already concluded. Remove the now
      redundant check in the backup job implementation.
      
      We need to check for cancellation in both block_job_completed
      AND block_job_completed_single, because jobs may be cancelled between
      those two calls; for instance in transactions. This also necessitates
      an ABORTING -> ABORTING transition to be allowed.
      
      The check in block_job_completed could be removed, but there's no
      point in starting to attempt to succeed a transaction that we know
      in advance will fail.
      
      This does NOT affect mirror jobs that are "canceled" during their
      synchronous phase. The mirror job itself forcibly sets the canceled
      property to false prior to ceding control, so such cases will invoke
      the "commit" callback.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      35d6b368
    • J
      blockjobs: add block_job_dismiss · 75f71059
      John Snow 提交于
      For jobs that have reached their CONCLUDED state, prior to having their
      last reference put down (meaning jobs that have completed successfully,
      unsuccessfully, or have been canceled), allow the user to dismiss the
      job's lingering status report via block-job-dismiss.
      
      This gives management APIs the chance to conclusively determine if a job
      failed or succeeded, even if the event broadcast was missed.
      
      Note: block_job_do_dismiss and block_job_decommission happen to do
      exactly the same thing, but they're called from different semantic
      contexts, so both aliases are kept to improve readability.
      
      Note 2: Don't worry about the 0x04 flag definition for AUTO_DISMISS, she
      has a friend coming in a future patch to fill the hole where 0x02 is.
      
      Verbs:
      Dismiss: operates on CONCLUDED jobs only.
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      75f71059
    • J
      blockjobs: add NULL state · 3925cd3b
      John Snow 提交于
      Add a new state that specifically demarcates when we begin to permanently
      demolish a job after it has performed all work. This makes the transition
      explicit in the STM table and highlights conditions under which a job may
      be demolished.
      
      Alongside this state, add a new helper command "block_job_decommission",
      which transitions to the NULL state and puts down our implicit reference.
      This separates instances in the code for "block_job_unref" which merely
      undo a matching "block_job_ref" with instances intended to initiate the
      full destruction of the object.
      
      This decommission action also sets a number of fields to make sure that
      block internals or external users that are holding a reference to a job
      to see when it "finishes" are convinced that the job object is "done."
      This is necessary, for instance, to do a block_job_cancel_sync on a
      created object which will not make any progress.
      
      Now, all jobs must go through block_job_decommission prior to being
      freed, giving us start-to-finish state machine coverage for jobs.
      
      Transitions:
      Created   -> Null: Early failure event before the job is started
      Concluded -> Null: Standard transition.
      
      Verbs:
      None. This should not ever be visible to the monitor.
      
                   +---------+
                   |UNDEFINED|
                   +--+------+
                      |
                   +--v----+
         +---------+CREATED+------------------+
         |         +--+----+                  |
         |            |                       |
         |         +--v----+     +------+     |
         +---------+RUNNING<----->PAUSED|     |
         |         +--+-+--+     +------+     |
         |            | |                     |
         |            | +------------------+  |
         |            |                    |  |
         |         +--v--+       +-------+ |  |
         +---------+READY<------->STANDBY| |  |
         |         +--+--+       +-------+ |  |
         |            |                    |  |
      +--v-----+   +--v------+             |  |
      |ABORTING+--->CONCLUDED<-------------+  |
      +--------+   +--+------+                |
                      |                       |
                   +--v-+                     |
                   |NULL<---------------------+
                   +----+
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      3925cd3b