1. 16 5月, 2018 2 次提交
    • X
      migration: fix saving normal page even if it's been compressed · 701b1876
      Xiao Guangrong 提交于
      Fix the bug introduced by da3f56cb (migration: remove
      ram_save_compressed_page()), It should be 'return' rather than
      'res'
      
      Sorry for this stupid mistake :(
      Signed-off-by: NXiao Guangrong <xiaoguangrong@tencent.com>
      Message-Id: <20180428081045.8878-1-xiaoguangrong@tencent.com>
      Signed-off-by: NJuan Quintela <quintela@redhat.com>
      701b1876
    • P
      Merge remote-tracking branch 'remotes/kevin/tags/for-upstream' into staging · c416eece
      Peter Maydell 提交于
      Block layer patches:
      
      - Switch AIO/callback based block drivers to a byte-based interface
      - Block jobs: Expose error string via query-block-jobs
      - Block job cleanups and fixes
      - hmp: Allow using a qdev id in block_set_io_throttle
      
      # gpg: Signature made Tue 15 May 2018 16:33:10 BST
      # 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: (37 commits)
        iotests: Add test for -U/force-share conflicts
        qemu-img: Use only string options in img_open_opts
        qemu-io: Use purely string blockdev options
        block: Document BDRV_REQ_WRITE_UNCHANGED support
        qemu-img: Check post-truncation size
        iotests: Add test for COR across nodes
        iotests: Copy 197 for COR filter driver
        iotests: Clean up wrap image in 197
        block: Support BDRV_REQ_WRITE_UNCHANGED in filters
        block/quorum: Support BDRV_REQ_WRITE_UNCHANGED
        block: Set BDRV_REQ_WRITE_UNCHANGED for COR writes
        block: Add BDRV_REQ_WRITE_UNCHANGED flag
        block: BLK_PERM_WRITE includes ..._UNCHANGED
        block: Add COR filter driver
        iotests: Skip 181 and 201 without userfaultfd
        iotests: Add failure matching to common.qemu
        docs: Document the new default sizes of the qcow2 caches
        qcow2: Give the refcount cache the minimum possible size by default
        specs/qcow2: Clarify that compressed clusters have the COPIED bit reset
        Fix error message about compressed clusters with OFLAG_COPIED
        ...
      Signed-off-by: NPeter Maydell <peter.maydell@linaro.org>
      c416eece
  2. 15 5月, 2018 38 次提交
    • K
      Merge remote-tracking branch 'mreitz/tags/pull-block-2018-05-15' into queue-block · 1fce860e
      Kevin Wolf 提交于
      - Copy-on-read block driver
      - The qcow2 default refcount cache size has been decreased
      - Various bug fixes
      
      # gpg: Signature made Tue May 15 16:18:25 2018 CEST
      # gpg:                using RSA key F407DB0061D5CF40
      # gpg: Good signature from "Max Reitz <mreitz@redhat.com>"
      # Primary key fingerprint: 91BE B60A 30DB 3E88 57D1  1829 F407 DB00 61D5 CF40
      
      * mreitz/tags/pull-block-2018-05-15: (21 commits)
        iotests: Add test for -U/force-share conflicts
        qemu-img: Use only string options in img_open_opts
        qemu-io: Use purely string blockdev options
        block: Document BDRV_REQ_WRITE_UNCHANGED support
        qemu-img: Check post-truncation size
        iotests: Add test for COR across nodes
        iotests: Copy 197 for COR filter driver
        iotests: Clean up wrap image in 197
        block: Support BDRV_REQ_WRITE_UNCHANGED in filters
        block/quorum: Support BDRV_REQ_WRITE_UNCHANGED
        block: Set BDRV_REQ_WRITE_UNCHANGED for COR writes
        block: Add BDRV_REQ_WRITE_UNCHANGED flag
        block: BLK_PERM_WRITE includes ..._UNCHANGED
        block: Add COR filter driver
        iotests: Skip 181 and 201 without userfaultfd
        iotests: Add failure matching to common.qemu
        docs: Document the new default sizes of the qcow2 caches
        qcow2: Give the refcount cache the minimum possible size by default
        specs/qcow2: Clarify that compressed clusters have the COPIED bit reset
        Fix error message about compressed clusters with OFLAG_COPIED
        ...
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      1fce860e
    • M
      iotests: Add test for -U/force-share conflicts · 4e7d73c5
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180502202051.15493-4-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      4e7d73c5
    • M
      qemu-img: Use only string options in img_open_opts · 4615f878
      Max Reitz 提交于
      img_open_opts() takes a QemuOpts and converts them to a QDict, so all
      values therein are strings.  Then it may try to call qdict_get_bool(),
      however, which will fail with a segmentation fault every time:
      
      $ ./qemu-img info -U --image-opts \
          driver=file,filename=/dev/null,force-share=off
      [1]    27869 segmentation fault (core dumped)  ./qemu-img info -U
      --image-opts driver=file,filename=/dev/null,force-share=off
      
      Fix this by using qdict_get_str() and comparing the value as a string.
      Also, when adding a force-share value to the QDict, add it as a string
      so it fits the rest of the dict.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180502202051.15493-3-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      4615f878
    • M
      qemu-io: Use purely string blockdev options · 2a01c01f
      Max Reitz 提交于
      Currently, qemu-io only uses string-valued blockdev options (as all are
      converted directly from QemuOpts) -- with one exception: -U adds the
      force-share option as a boolean.  This in itself is already a bit
      questionable, but a real issue is that it also assumes the value already
      existing in the options QDict would be a boolean, which is wrong.
      
      That has the following effect:
      
      $ ./qemu-io -r -U --image-opts \
          driver=file,filename=/dev/null,force-share=off
      [1]    15200 segmentation fault (core dumped)  ./qemu-io -r -U
      --image-opts driver=file,filename=/dev/null,force-share=off
      
      Since @opts is converted from QemuOpts, the value must be a string, and
      we have to compare it as such.  Consequently, it makes sense to also set
      it as a string instead of a boolean.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180502202051.15493-2-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      2a01c01f
    • M
      block: Document BDRV_REQ_WRITE_UNCHANGED support · c1e3489d
      Max Reitz 提交于
      Add BDRV_REQ_WRITE_UNCHANGED to the list of flags honored during pwrite
      and pwrite_zeroes, and also add a note on when you absolutely need to
      support it.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180502140359.18222-1-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      c1e3489d
    • M
      qemu-img: Check post-truncation size · 5279b303
      Max Reitz 提交于
      Some block drivers (iscsi and file-posix when dealing with device files)
      do not actually support truncation, even though they provide a
      .bdrv_truncate() method and will happily return success when providing a
      new size that does not exceed the current size.  This is because these
      drivers expect the user to resize the image outside of qemu and then
      provide qemu with that information through the block_resize command
      (compare cb1b83e7).
      
      Of course, anyone using qemu-img resize will find that behavior useless.
      So we should check the actual size of the image after the supposedly
      successful truncation took place, emit an error if nothing changed and
      emit a warning if the target size was not met.
      
      Buglink: https://bugzilla.redhat.com/show_bug.cgi?id=1523065Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180421163957.29872-1-mreitz@redhat.com
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      5279b303
    • M
      iotests: Add test for COR across nodes · 3e7a95fe
      Max Reitz 提交于
      COR across nodes (that is, you have some filter node between the
      actually COR target and the node that performs the COR) cannot reliably
      work together with the permission system when there is no explicit COR
      node that can request the WRITE_UNCHANGED permission for its child.
      This is because COR (currently) sneaks its requests by the usual
      permission checks, so it can work without a WRITE* permission; but if
      there is a filter node in between, that will re-issue the request, which
      then passes through the usual check -- and if nobody has requested a
      WRITE_UNCHANGED permission, that check will fail.
      
      There is no real direct fix apart from hoping that there is someone who
      has requested that permission; in case of just the qemu-io HMP command
      (and no guest device), however, that is not the case.  The real real fix
      is to implement the copy-on-read flag through an implicitly added COR
      node.  Such a node can request the necessary permissions as shown in
      this test.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180421132929.21610-10-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      3e7a95fe
    • M
      iotests: Copy 197 for COR filter driver · a62cbac4
      Max Reitz 提交于
      iotest 197 tests copy-on-read using the (now old) copy-on-read flag.
      Copy it to 215 and modify it to use the COR filter driver instead.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180421132929.21610-9-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      a62cbac4
    • M
      iotests: Clean up wrap image in 197 · 5fdc0b73
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-8-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      5fdc0b73
    • M
      block: Support BDRV_REQ_WRITE_UNCHANGED in filters · 228345bf
      Max Reitz 提交于
      Update the rest of the filter drivers to support
      BDRV_REQ_WRITE_UNCHANGED.  They already forward write request flags to
      their children, so we just have to announce support for it.
      
      This patch does not cover the replication driver because that currently
      does not support flags at all, and because it just grabs the WRITE
      permission for its children when it can, so we should be fine just
      submitting the incoming WRITE_UNCHANGED requests as normal writes.
      
      It also does not cover format drivers for similar reasons.  They all use
      bdrv_format_default_perms() as their .bdrv_child_perm() implementation
      so they just always grab the WRITE permission for their file children
      whenever possible.  In addition, it often would be difficult to
      ascertain whether incoming unchanging writes end up as unchanging writes
      in their files.  So we just leave them as normal potentially changing
      writes.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-7-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      228345bf
    • M
      block/quorum: Support BDRV_REQ_WRITE_UNCHANGED · 1b1a920b
      Max Reitz 提交于
      We just need to forward it to quorum's children (except in case of a
      rewrite because of corruption), but for that we first have to support
      flags in child requests at all.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-6-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      1b1a920b
    • M
      block: Set BDRV_REQ_WRITE_UNCHANGED for COR writes · 7adcf59f
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-5-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      7adcf59f
    • M
      block: Add BDRV_REQ_WRITE_UNCHANGED flag · c6035964
      Max Reitz 提交于
      This flag signifies that a write request will not change the visible
      disk content.  With this flag set, it is sufficient to have the
      BLK_PERM_WRITE_UNCHANGED permission instead of BLK_PERM_WRITE.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-4-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      c6035964
    • M
      block: BLK_PERM_WRITE includes ..._UNCHANGED · 24b7c538
      Max Reitz 提交于
      Currently we never actually check whether the WRITE_UNCHANGED
      permission has been taken for unchanging writes.  But the one check that
      is commented out checks both WRITE and WRITE_UNCHANGED; and considering
      that WRITE_UNCHANGED is already documented as being weaker than WRITE,
      we should probably explicitly document WRITE to include WRITE_UNCHANGED.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20180421132929.21610-3-mreitz@redhat.com
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      24b7c538
    • M
      block: Add COR filter driver · 6c6f24fd
      Max Reitz 提交于
      This adds a simple copy-on-read filter driver.  It relies on the already
      existing COR functionality in the central block layer code, which may be
      moved here once we no longer need it there.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180421132929.21610-2-mreitz@redhat.com
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      6c6f24fd
    • M
      iotests: Skip 181 and 201 without userfaultfd · b05a2225
      Max Reitz 提交于
      userfaultfd support depends on the host kernel, so it may not be
      available.  If so, 181 and 201 should be skipped.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180406151731.4285-3-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      b05a2225
    • M
      iotests: Add failure matching to common.qemu · 81c6ddf4
      Max Reitz 提交于
      Currently, common.qemu only allows to match for results indicating
      success.  The only way to fail is by provoking a timeout.  However,
      sometimes we do have a defined failure output and can match for that,
      which saves us from having to wait for the timeout in case of failure.
      Because failure can sometimes just result in a _notrun in the test, it
      is actually important to care about being able to fail quickly.
      
      Also, sometimes we simply do not get any specific output in case of
      success.  The only way to handle this currently would be to define an
      error message as the string to look for, which means that actual success
      results in a timeout.  This is really bad because it unnecessarily slows
      down a succeeding test.
      
      Therefore, this patch adds a new parameter $success_or_failure to
      _timed_wait_for and _send_qemu_cmd.  Setting this to a non-empty string
      makes both commands expect two match parameters: If the first matches,
      the function succeeds.  If the second matches, the function fails.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180406151731.4285-2-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      81c6ddf4
    • A
      docs: Document the new default sizes of the qcow2 caches · 603790ef
      Alberto Garcia 提交于
      We have just reduced the refcount cache size to the minimum unless
      the user explicitly requests a larger one, so we have to update the
      documentation to reflect this change.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Message-id: c5f0bde23558dd9d33b21fffc76ac9953cc19c56.1523968389.git.berto@igalia.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      603790ef
    • A
      qcow2: Give the refcount cache the minimum possible size by default · 52253998
      Alberto Garcia 提交于
      The L2 and refcount caches have default sizes that can be overridden
      using the l2-cache-size and refcount-cache-size (an additional
      parameter named cache-size sets the combined size of both caches).
      
      Unless forced by one of the aforementioned parameters, QEMU will set
      the unspecified sizes so that the L2 cache is 4 times larger than the
      refcount cache.
      
      This is based on the premise that the refcount metadata needs to be
      only a fourth of the L2 metadata to cover the same amount of disk
      space. This is incorrect for two reasons:
      
       a) The amount of disk covered by an L2 table depends solely on the
          cluster size, but in the case of a refcount block it depends on
          the cluster size *and* the width of each refcount entry.
          The 4/1 ratio is only valid with 16-bit entries (the default).
      
       b) When we talk about disk space and L2 tables we are talking about
          guest space (L2 tables map guest clusters to host clusters),
          whereas refcount blocks are used for host clusters (including
          L1/L2 tables and the refcount blocks themselves). On a fully
          populated (and uncompressed) qcow2 file, image size > virtual size
          so there are more refcount entries than L2 entries.
      
      Problem (a) could be fixed by adjusting the algorithm to take into
      account the refcount entry width. Problem (b) could be fixed by
      increasing a bit the refcount cache size to account for the clusters
      used for qcow2 metadata.
      
      However this patch takes a completely different approach and instead
      of keeping a ratio between both cache sizes it assigns as much as
      possible to the L2 cache and the remainder to the refcount cache.
      
      The reason is that L2 tables are used for every single I/O request
      from the guest and the effect of increasing the cache is significant
      and clearly measurable. Refcount blocks are however only used for
      cluster allocation and internal snapshots and in practice are accessed
      sequentially in most cases, so the effect of increasing the cache is
      negligible (even when doing random writes from the guest).
      
      So, make the refcount cache as small as possible unless the user
      explicitly asks for a larger one.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 9695182c2eb11b77cb319689a1ebaa4e7c9d6591.1523968389.git.berto@igalia.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      52253998
    • A
      specs/qcow2: Clarify that compressed clusters have the COPIED bit reset · 3c7d14b2
      Alberto Garcia 提交于
      Compressed clusters are not supposed to have the COPIED bit set, but
      this is not made explicit in the specs, so let's document it.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 74552e1d6e858d3159cb0c0e188e80bc9248e337.1523376013.git.berto@igalia.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      3c7d14b2
    • A
      Fix error message about compressed clusters with OFLAG_COPIED · 74c44a59
      Alberto Garcia 提交于
      Compressed clusters are not supposed to have the COPIED bit set.
      "qemu-img check" detects that and prints an error message reporting
      the number of the affected host cluster. This doesn't make much sense
      because compressed clusters are not aligned to host clusters, so it
      would be better to report the offset instead. Plus, the calculation is
      wrong and it uses the raw L2 entry as if it was simply an offset.
      
      This patch fixes the error message and reports the offset of the
      compressed cluster.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 0f687957feb72e80c740403191a47e607c2463fe.1523376013.git.berto@igalia.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      74c44a59
    • M
      iotests: Split 214 off of 122 · 6cba5377
      Max Reitz 提交于
      Commit abd3622c added a case to 122
      regarding how the qcow2 driver handles an incorrect compressed data
      length value.  This does not really fit into 122, as that file is
      supposed to contain qemu-img convert test cases, which this case is not.
      So this patch splits it off into its own file; maybe we will even get
      more qcow2-only compression tests in the future.
      
      Also, that test case does not work with refcount_bits=1, so mark that
      option as unsupported.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20180406164108.26118-1-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      6cba5377
    • K
      blockjob: Add block_job_driver() · bd21935b
      Kevin Wolf 提交于
      The backup block job directly accesses the driver field in BlockJob. Add
      a wrapper for getting it.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      bd21935b
    • K
      blockjob: Introduce block_job_ratelimit_get_delay() · dee81d51
      Kevin Wolf 提交于
      This gets us rid of more direct accesses to BlockJob fields from the
      job drivers.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      dee81d51
    • K
      blockjob: Implement block_job_set_speed() centrally · 18bb6928
      Kevin Wolf 提交于
      All block job drivers support .set_speed and all of them duplicate the
      same code to implement it. Move that code to blockjob.c and remove the
      now useless callback.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      18bb6928
    • K
      blockjob: Move RateLimit to BlockJob · f05fee50
      Kevin Wolf 提交于
      Every block job has a RateLimit, and they all do the exact same thing
      with it, so it should be common infrastructure. Move the struct field
      for a start.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      f05fee50
    • K
      blockjob: Wrappers for progress counter access · 05df8a6a
      Kevin Wolf 提交于
      Block job drivers are not expected to mess with the internals of the
      BlockJob object, so provide wrapper functions for one of the cases where
      they still do it: Updating the progress counter.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      05df8a6a
    • K
      blockjob: Fix assertion in block_job_finalize() · 37aa19b6
      Kevin Wolf 提交于
      Every job gets a non-NULL job->txn on creation, but it doesn't
      necessarily keep it until it is decommissioned: Finalising a job removes
      it from its transaction. Therefore, calling 'blockdev-job-finalize' a
      second time on an already concluded job causes an assertion failure.
      
      Remove job->txn from the assertion in block_job_finalize() to fix this.
      block_job_do_finalize() still has the same assertion, but if a job is
      already removed from its transaction, block_job_apply_verb() will
      already error out before we run into that assertion.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      37aa19b6
    • J
      blockjob: expose error string via query · ab9ba614
      John Snow 提交于
      When we've reached the concluded state, we need to expose the error
      state if applicable. Add the new field.
      
      This should be sufficient for determining if a job completed
      successfully or not after concluding; if we want to discriminate
      based on how it failed more mechanically, we can always add an
      explicit return code enumeration later.
      
      I didn't bother to make it only show up if we are in the concluded
      state; I don't think it's necessary.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NJohn Snow <jsnow@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      ab9ba614
    • A
      hmp: Allow using a qdev id in block_set_io_throttle · 83592184
      Alberto Garcia 提交于
      The QMP version of this command can take a qdev ID since 7a9877a0,
      but the HMP version is still using the deprecated block device name so
      there's no way to refer to a block device added like this:
      
        -blockdev node-name=disk0,driver=qcow2,file.driver=file,file.filename=hd.qcow2
        -device virtio-blk-pci,id=virtio-blk-pci0,drive=disk0
      
      This patch works around this problem by using the specified name as a
      qdev ID if the block device name is not found.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      83592184
    • E
      block: Merge .bdrv_co_writev{,_flags} in drivers · e18a58b4
      Eric Blake 提交于
      We have too many driver callback interfaces; simplify the mess
      somewhat by merging the flags parameter of .bdrv_co_writev_flags()
      into .bdrv_co_writev().  Note that as long as a driver doesn't set
      .supported_write_flags, the flags argument will be 0 and behavior is
      identical.  Also note that the public function bdrv_co_writev() still
      lacks a flags argument; so the driver signature is thus intentionally
      slightly different.  But that's not the end of the world, nor the first
      time that the driver interface differs slightly from the public
      interface.
      
      Ideally, we should be rewriting all of these drivers to use modern
      byte-based interfaces.  But that's a more invasive patch to write
      and audit, compared to the simplification done here.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e18a58b4
    • E
      block: Drop last of the sector-based aio callbacks · edfab6a0
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Now that all drivers with aio callbacks are using the
      byte-based interfaces, we can remove the sector-based versions.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      edfab6a0
    • E
      vxhs: Switch to byte-based callbacks · 918889b2
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Make the change for the last few sector-based callbacks
      in the vxhs driver.
      
      Note that the driver was already using byte-based calls for
      performing actual I/O, so this just gets rid of a round trip
      of scaling; however, as I don't know if VxHS is tolerant of
      non-sector AIO operations, I went with the conservative approach
      of adding .bdrv_refresh_limits to override the block layer
      defaults back to the pre-patch value of 512.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      918889b2
    • E
      rbd: Switch to byte-based callbacks · e8e16d4b
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Make the change for the last few sector-based callbacks
      in the rbd driver.
      
      Note that the driver was already using byte-based calls for
      performing actual I/O, so this just gets rid of a round trip
      of scaling; however, as I don't know if RBD is tolerant of
      non-sector AIO operations, I went with the conservate approach
      of adding .bdrv_refresh_limits to override the block layer
      defaults back to the pre-patch value of 512.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e8e16d4b
    • E
      null: Switch to byte-based read/write · b3241e92
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Make the change for the last few sector-based callbacks
      in the null-co and null-aio drivers.
      
      Note that since the null driver does nothing on writes, it trivially
      supports the BDRV_REQ_FUA flag (all writes have already landed to
      the same bit-bucket without needing an extra flush call).  Also, since
      the null driver does just as well with byte-based requests, we can
      now avoid cycles wasted on read-modify-write by taking advantage of
      the block layer now defaulting the alignment to 1 instead of 512.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      b3241e92
    • E
      file-win32: Switch to byte-based callbacks · de7056a3
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Make the change for the last few sector-based callbacks
      in the file-win32 driver.
      
      Note that the driver was already using byte-based calls for
      performing actual I/O, so this just gets rid of a round trip
      of scaling; however, as I don't know if Windows is tolerant of
      non-sector AIO operations, I went with the conservative approach
      of modifying .bdrv_refresh_limits to override the block layer
      defaults back to the pre-patch value of 512.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      de7056a3
    • E
      block: Support byte-based aio callbacks · e31f6864
      Eric Blake 提交于
      We are gradually moving away from sector-based interfaces, towards
      byte-based.  Add new sector-based aio callbacks for read and write,
      to match the fact that bdrv_aio_pdiscard is already byte-based.
      
      Ideally, drivers should be converted to use coroutine callbacks
      rather than aio; but that is not quite as trivial (and if we were
      to do that conversion, the null-aio driver would disappear), so for
      the short term, converting the signature but keeping things with
      aio is easier.  However, we CAN declare that a driver that uses
      the byte-based aio interfaces now defaults to byte-based
      operations, and must explicitly provide a refresh_limits override
      to stick with larger alignments (making the alignment issues more
      obvious directly in the drivers touched in the next few patches).
      
      Once all drivers are converted, the sector-based aio callbacks will
      be removed; in the meantime, a FIXME comment is added due to a
      slight inefficiency that will be touched up as part of that later
      cleanup.
      
      Simplify some instances of 'bs->drv' into 'drv' while touching this,
      since the local variable already exists to reduce typing.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      e31f6864
    • D
      block-backend: simplify blk_get_aio_context · 7803696d
      Daniel Henrique Barboza 提交于
      blk_get_aio_context verifies if BlockDriverState bs is not NULL,
      return bdrv_get_aio_context(bs) if true or qemu_get_aio_context()
      otherwise. However, bdrv_get_aio_context from block.c already does
      this verification itself, also returning qemu_get_aio_context()
      if bs is NULL:
      
      AioContext *bdrv_get_aio_context(BlockDriverState *bs)
      {
          return bs ? bs->aio_context : qemu_get_aio_context();
      }
      
      This patch simplifies blk_get_aio_context to simply call
      bdrv_get_aio_context instead of replicating the same logic.
      Signed-off-by: NDaniel Henrique Barboza <danielhb@linux.vnet.ibm.com>
      Reviewed-by: NDarren Kenny <darren.kenny@oracle.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      7803696d