1. 25 2月, 2019 40 次提交
    • M
      iotests: Re-add filename filters · 250c04f5
      Max Reitz 提交于
      A previous commit removed the default filters for qmp_log with the
      intention to make them explicit; but this happened only for test 206.
      There are more tests (for more exotic image formats than qcow2) which
      require the filename filter, though.
      
      Note that 237 is still broken for Python 2.x, which is fixed in the next
      commit.
      
      Fixes: f8ca8609Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      Message-id: 20190210145736.1486-2-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      250c04f5
    • M
      iotests: Test json:{} filenames of internal BDSs · 7b14f231
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-32-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      7b14f231
    • M
      block: BDS options may lack the "driver" option · 62a01a27
      Max Reitz 提交于
      When BDSs are created by qemu itself (e.g. as filters in block jobs),
      they may not have a "driver" option in their options QDict.  When
      generating a json:{} filename, however, it must always be present.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-31-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      62a01a27
    • M
      block/null: Generate filename even with latency-ns · 1e47cb7f
      Max Reitz 提交于
      While we cannot represent the latency-ns option in a filename, it is not
      a strong option so not being able to should not stop us from generating
      a filename nonetheless.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-30-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      1e47cb7f
    • M
      block/curl: Implement bdrv_refresh_filename() · 937c007b
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-29-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      937c007b
    • M
      block/curl: Harmonize option defaults · 712b64e8
      Max Reitz 提交于
      Both of the defaults we currently have in the curl driver are named
      based on a slightly different schema, let's unify that and call both
      CURL_BLOCK_OPT_${NAME}_DEFAULT.
      
      While at it, we can add a macro for the third option for which a default
      exists, namely "sslverify".
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-28-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      712b64e8
    • M
      block/nvme: Fix bdrv_refresh_filename() · cc61b074
      Max Reitz 提交于
      Currently, nvme's bdrv_refresh_filename() is an exact copy of null's
      implementation.  However, for null, "null-co://" and "null-aio://" are
      indeed valid filenames -- for nvme, they are not, as a device address is
      still required.
      
      The correct implementation should generate a filename of the form
      "nvme://[PCI address]/[namespace]" (as the comment above
      nvme_parse_filename() describes).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-27-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      cc61b074
    • M
      block: Do not copy exact_filename from format file · fb695c74
      Max Reitz 提交于
      If a format BDS's file BDS is in turn a format BDS, we cannot simply use
      the same filename, because when opening a BDS tree based on a filename
      alone, qemu will create only one format node on top of one protocol node
      (disregarding a potential backing file).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-26-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      fb695c74
    • M
      block: Purify .bdrv_refresh_filename() · 998b3a1e
      Max Reitz 提交于
      Currently, BlockDriver.bdrv_refresh_filename() is supposed to both
      refresh the filename (BDS.exact_filename) and set BDS.full_open_options.
      Now that we have generic code in the central bdrv_refresh_filename() for
      creating BDS.full_open_options, we can drop the latter part from all
      BlockDriver.bdrv_refresh_filename() implementations.
      
      This also means that we can drop all of the existing default code for
      this from the global bdrv_refresh_filename() itself.
      
      Furthermore, we now have to call BlockDriver.bdrv_refresh_filename()
      after having set BDS.full_open_options, because the block driver's
      implementation should now be allowed to depend on BDS.full_open_options
      being set correctly.
      
      Finally, with this patch we can drop the @options parameter from
      BlockDriver.bdrv_refresh_filename(); also, add a comment on this
      function's purpose in block/block_int.h while touching its interface.
      
      This completely obsoletes blklogwrite's implementation of
      .bdrv_refresh_filename().
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-25-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      998b3a1e
    • M
      block: Generically refresh runtime options · 97e2f021
      Max Reitz 提交于
      Instead of having every block driver which implements
      bdrv_refresh_filename() copy all of the strong runtime options over to
      bs->full_open_options, implement this process generically in
      bdrv_refresh_filename().
      
      This patch only adds this new generic implementation, it does not remove
      the old functionality. This is done in a follow-up patch.
      
      With this patch, some superfluous information (that should never have
      been there) may be removed from some JSON filenames, as can be seen in
      the change to iotests 110's and 228's reference outputs.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-24-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      97e2f021
    • M
      block: Add BlockDriver.bdrv_gather_child_options · abc521a9
      Max Reitz 提交于
      Some follow-up patches will rework the way bs->full_open_options is
      refreshed in bdrv_refresh_filename(). The new implementation will remove
      the need for the block drivers' bdrv_refresh_filename() implementations
      to set bs->full_open_options; instead, it will be generic and use static
      information from each block driver.
      
      However, by implementing bdrv_gather_child_options(), block drivers will
      still be able to override the way the full_open_options of their
      children are incorporated into their own.
      
      We need to implement this function for VMDK because we have to prevent
      the generic implementation from gathering the options of all children:
      It is not possible to specify options for the extents through the
      runtime options.
      
      For quorum, the child names that would be used by the generic
      implementation and the ones that we actually (currently) want to use
      differ. See quorum_gather_child_options() for more information.
      
      Note that both of these are cases which are not ideal: In case of VMDK
      it would probably be nice to be able to specify options for all extents.
      In case of quorum, the current runtime option structure is simply broken
      and needs to be fixed (but that is left for another patch).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-23-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      abc521a9
    • M
      block: Add strong_runtime_opts to BlockDriver · 2654267c
      Max Reitz 提交于
      This new field can be set by block drivers to list the runtime options
      they accept that may influence the contents of the respective BDS. As of
      a follow-up patch, this list will be used by the common
      bdrv_refresh_filename() implementation to decide which options to put
      into BDS.full_open_options (and consequently whether a JSON filename has
      to be created), thus freeing the drivers of having to implement that
      logic themselves.
      
      Additionally, this patch adds the field to all of the block drivers that
      need it and sets it accordingly.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-22-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      2654267c
    • M
      iotests: Add quorum case to test 110 · c0625e80
      Max Reitz 提交于
      Test 110 tests relative backing filenames for complex BDS trees.  Now
      that the originally supposedly failing test passes, let us add a new
      failing test: Quorum can never work automatically (without detecting
      whether all child nodes have the same base directory, but that would be
      rather inconsistent behavior).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-21-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      c0625e80
    • M
      block: Use bdrv_dirname() for relative filenames · 8df68616
      Max Reitz 提交于
      bdrv_get_full_backing_filename_from_filename() breaks down when it comes
      to JSON filenames. Using bdrv_dirname() as the basis is better because
      since we have BDS, we can descend through the BDS tree to the protocol
      layer, which gives us a greater probability of finding a non-JSON name;
      also, bdrv_dirname() is more correct as it allows block drivers to
      override the generation of that directory name in a protocol-specific
      way.
      
      We still need to keep bdrv_get_full_backing_filename_from_filename(),
      though, because it has valid callers which need it during image creation
      when no BDS is available yet.
      
      This makes a test case in qemu-iotest 110, which was supposed to fail,
      work. That is actually good, but we need to change the reference output
      (and the comment in 110) accordingly.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-20-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      8df68616
    • M
      block/nfs: Implement bdrv_dirname() · 0dcbc54a
      Max Reitz 提交于
      While the basic idea is obvious and could be handled by the default
      bdrv_dirname() implementation, we cannot generate a directory name if
      the gid or uid are set, so we have to explicitly return NULL in those
      cases.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-19-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      0dcbc54a
    • M
      block/nbd: Make bdrv_dirname() return NULL · 8a6239c0
      Max Reitz 提交于
      The generic bdrv_dirname() implementation would be able to generate some
      form of directory name for many NBD nodes, but it would be always wrong.
      Therefore, we have to explicitly make it an error (until NBD has some
      form of specification for export paths, if it ever will).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-id: 20190201192935.18394-18-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      8a6239c0
    • M
      quorum: Make bdrv_dirname() return NULL · f3037bd2
      Max Reitz 提交于
      While the common implementation for bdrv_dirname() should return NULL
      for quorum BDSs already (because they do not have a file node and their
      exact_filename field should be empty), there is no reason not to make
      that explicit.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-17-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      f3037bd2
    • M
      blkverify: Make bdrv_dirname() return NULL · 27953572
      Max Reitz 提交于
      blkverify's BDSs have a file BDS, but we do not want this to be
      preferred over the raw node. There is no way to decide between the two
      (and not really a reason to, either), so just return NULL in blkverify's
      implementation of bdrv_dirname().
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-16-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      27953572
    • M
      block: Add bdrv_dirname() · 1e89d0f9
      Max Reitz 提交于
      This function may be implemented by block drivers to derive a directory
      name from a BDS. Concatenating this g_free()-able string with a relative
      filename must result in a valid (not necessarily existing) filename, so
      this is a function that should generally be not implemented by format
      drivers, because this is protocol-specific.
      
      If a BDS's driver does not implement this function, bdrv_dirname() will
      fall through to the BDS's file if it exists. If it does not, the
      exact_filename field will be used to generate a directory name.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-15-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      1e89d0f9
    • M
      block: Fix bdrv_find_backing_image() · 2d9158ce
      Max Reitz 提交于
      bdrv_find_backing_image() should use bdrv_get_full_backing_filename() or
      bdrv_make_absolute_filename() instead of trying to do what those
      functions do by itself.
      
      path_combine_deprecated() can now be dropped, so let's do that.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-14-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      2d9158ce
    • M
      block: Add bdrv_make_absolute_filename() · 9f4793d8
      Max Reitz 提交于
      This is a general function for making a filename that is relative to a
      certain BDS absolute.
      
      It calls bdrv_get_full_backing_filename_from_filename() for now, but
      that will be changed in a follow-up patch.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-13-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      9f4793d8
    • M
      block: bdrv_get_full_backing_filename's ret. val. · 6b6833c1
      Max Reitz 提交于
      Make bdrv_get_full_backing_filename() return an allocated string instead
      of placing the result in a caller-provided buffer.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-12-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      6b6833c1
    • M
      block: bdrv_get_full_backing_filename_from_...'s ret. val. · 645ae7d8
      Max Reitz 提交于
      Make bdrv_get_full_backing_filename_from_filename() return an allocated
      string instead of placing the result in a caller-provided buffer.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-11-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      645ae7d8
    • M
      block: Make path_combine() return the path · 009b03aa
      Max Reitz 提交于
      Besides being safe for arbitrary path lengths, after some follow-up
      patches all callers will want a freshly allocated buffer anyway.
      
      In the meantime, path_combine_deprecated() is added which has the same
      interface as path_combine() had before this patch. All callers to that
      function will be converted in follow-up patches.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Message-id: 20190201192935.18394-10-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      009b03aa
    • M
      iotests: Add test for backing file overrides · 0f62cd82
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-9-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      0f62cd82
    • M
      iotests.py: Add node_info() · ef7afd63
      Max Reitz 提交于
      This function queries a node; since we cannot do that right now, it
      executes query-named-block-nodes and returns the matching node's object.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Message-id: 20190201192935.18394-8-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      ef7afd63
    • M
      iotests.py: Add filter_imgfmt() · f2ea0b20
      Max Reitz 提交于
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-7-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      f2ea0b20
    • M
      block: Respect backing bs in bdrv_refresh_filename · 90993623
      Max Reitz 提交于
      Basically, bdrv_refresh_filename() should respect all children of a
      BlockDriverState. However, generally those children are driver-specific,
      so this function cannot handle the general case. On the other hand,
      there are only few drivers which use other children than @file and
      @backing (that being vmdk, quorum, and blkverify).
      
      Most block drivers only use @file and/or @backing (if they use any
      children at all). Both can be implemented directly in
      bdrv_refresh_filename.
      
      The user overriding the file's filename is already handled, however, the
      user overriding the backing file is not. If this is done, opening the
      BDS with the plain filename of its file will not be correct, so we may
      not set bs->exact_filename in that case.
      
      iotest 051 contains test cases for overriding the backing file, and so
      its output changes with this patch applied.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-6-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      90993623
    • M
      block: Add BDS.auto_backing_file · 998c2019
      Max Reitz 提交于
      If the backing file is overridden, this most probably does change the
      guest-visible data of a BDS.  Therefore, we will need to consider this
      in bdrv_refresh_filename().
      
      To see whether it has been overridden, we might want to compare
      bs->backing_file and bs->backing->bs->filename.  However,
      bs->backing_file is changed by bdrv_set_backing_hd() (which is just used
      to change the backing child at runtime, without modifying the image
      header), so bs->backing_file most of the time simply contains a copy of
      bs->backing->bs->filename anyway, so it is useless for such a
      comparison.
      
      This patch adds an auto_backing_file BDS field which contains the
      backing file path as indicated by the image header, which is not changed
      by bdrv_set_backing_hd().
      
      Because of bdrv_refresh_filename() magic, however, a BDS's filename may
      differ from what has been specified during bdrv_open().  Then, the
      comparison between bs->auto_backing_file and bs->backing->bs->filename
      may fail even though bs->backing was opened from bs->auto_backing_file.
      To mitigate this, we can copy the real BDS's filename (after the whole
      bdrv_open() and bdrv_refresh_filename() process) into
      bs->auto_backing_file, if we know the former has been opened based on
      the latter.  This is only possible if no options modifying the backing
      file's behavior have been specified, though.  To simplify things, this
      patch only copies the filename from the backing file if no options have
      been specified for it at all.
      
      Furthermore, there are cases where an overlay is created by qemu which
      already contains a BDS's filename (e.g. in blockdev-snapshot-sync).  We
      do not need to worry about updating the overlay's bs->auto_backing_file
      there, because we actually wrote a post-bdrv_refresh_filename() filename
      into the image header.
      
      So all in all, there will be false negatives where (as of a future
      patch) bdrv_refresh_filename() will assume that the backing file differs
      from what was specified in the image header, even though it really does
      not.  However, these cases should be limited to where (1) the user
      actually did override something in the backing chain (e.g. by specifying
      options for the backing file), or (2) the user executed a QMP command to
      change some node's backing file (e.g. change-backing-file or
      block-commit with @backing-file given) where the given filename does not
      happen to coincide with qemu's idea of the backing BDS's filename.
      
      Then again, (1) really is limited to -drive.  With -blockdev or
      blockdev-add, you have to adhere to the schema, so a user cannot give
      partial "unimportant" options (e.g. by just setting backing.node-name
      and leaving the rest to the image header).  Therefore, trying to fix
      this would mean trying to fix something for -drive only.
      
      To improve on (2), we would need a full infrastructure to "canonicalize"
      an arbitrary filename (+ options), so it can be compared against
      another.  That seems a bit over the top, considering that filenames
      nowadays are there mostly for the user's entertainment.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-5-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      998c2019
    • M
      block: Skip implicit nodes for filename info · bb808d5f
      Max Reitz 提交于
      bdrv_refresh_filename() should simply skip all implicit nodes.  They are
      supposed to be invisible to the user, so they should not appear in
      filename information.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-4-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      bb808d5f
    • M
      block: Use children list in bdrv_refresh_filename · e24518e3
      Max Reitz 提交于
      bdrv_refresh_filename() should invoke itself recursively on all
      children, not just on file.
      
      With that change, we can remove the manual invocations in blkverify,
      quorum, commit, mirror, and blklogwrites.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Reviewed-by: NAlberto Garcia <berto@igalia.com>
      Message-id: 20190201192935.18394-3-mreitz@redhat.com
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      e24518e3
    • M
      block: Use bdrv_refresh_filename() to pull · f30c66ba
      Max Reitz 提交于
      Before this patch, bdrv_refresh_filename() is used in a pushing manner:
      Whenever the BDS graph is modified, the parents of the modified edges
      are supposed to be updated (recursively upwards).  However, that is
      nonviable, considering that we want child changes not to concern
      parents.
      
      Also, in the long run we want a pull model anyway: Here, we would have a
      bdrv_filename() function which returns a BDS's filename, freshly
      constructed.
      
      This patch is an intermediate step.  It adds bdrv_refresh_filename()
      calls before every place a BDS.filename value is used.  The only
      exceptions are protocol drivers that use their own filename, which
      clearly would not profit from refreshing that filename before.
      
      Also, bdrv_get_encrypted_filename() is removed along the way (as a user
      of BDS.filename), since it is completely unused.
      
      In turn, all of the calls to bdrv_refresh_filename() before this patch
      are removed, because we no longer have to call this function on graph
      changes.
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Message-id: 20190201192935.18394-2-mreitz@redhat.com
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      f30c66ba
    • T
      block/nvme: Remove QEMU_PACKED from naturally aligned NVMeRegs struct · 83c68e14
      Thomas Huth 提交于
      The QEMU_PACKED is causing a compiler warning/error with GCC 9:
      
        CC      block/nvme.o
      block/nvme.c: In function ‘nvme_create_queue_pair’:
      block/nvme.c:209:22: error: taking address of packed member of
       ‘struct <anonymous>’ may result in an unaligned pointer value
       [-Werror=address-of-packed-member]
        209 |     q->sq.doorbell = &s->regs->doorbells[idx * 2 * s->doorbell_scale];
      
      All members of the struct are naturally aligned, so there should
      not be the need for QEMU_PACKED here, and the following QEMU_BUILD_BUG_ON
      also ensures that there is no padding. Thus simply remove the QEMU_PACKED
      here.
      
      Buglink: https://bugs.launchpad.net/qemu/+bug/1817525Reported-by: NSatheesh Rajendran <sathnaga@linux.vnet.ibm.com>
      Signed-off-by: NThomas Huth <thuth@redhat.com>
      Reviewed-by: NPeter Maydell <peter.maydell@linaro.org>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      83c68e14
    • A
      qcow2: Assert that L2 table offsets fit in the L1 table · c1c43990
      Alberto Garcia 提交于
      L1 table entries have a field to store the offset of an L2 table.
      The rest of the bits of the entry are currently reserved except from
      bit 63, which stores the COPIED flag.
      
      The offset is always taken from the entry using L1E_OFFSET_MASK to
      ensure that we only use the bits that belong to that field.
      
      While that mask is used every time we read from the L1 table, it is
      never used when we write to it. Due to the limits set elsewhere in the
      code QEMU can never produce L2 table offsets that don't fit in that
      field so any such offset when allocating an L2 table would indicate a
      bug in QEMU.
      Signed-off-by: NAlberto Garcia <berto@igalia.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      c1c43990
    • V
      tests: add test-bdrv-graph-mod · 2dbfadf6
      Vladimir Sementsov-Ogievskiy 提交于
      Add two tests of node graph modification.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      2dbfadf6
    • V
      block: fix bdrv_check_perm for non-tree subgraph · f962e961
      Vladimir Sementsov-Ogievskiy 提交于
      bdrv_check_perm in it's recursion checks each node in context of new
      permissions for one parent, because of nature of DFS. It works well,
      while children subgraph of top-most updated node is a tree, i.e. it
      doesn't have any kind of loops. But if we have a loop (not oriented,
      of course), i.e. we have two different ways from top-node to some
      child-node, then bdrv_check_perm will do wrong thing:
      
        top
        | \
        |  |
        v  v
        A  B
        |  |
        v  v
        node
      
      It will once check new permissions of node in context of new A
      permissions and old B permissions and once visa-versa. It's a wrong way
      and may lead to corruption of permission system. We may start with
      no-permissions and all-shared for both A->node and B->node relations
      and finish up with non shared write permission for both ways.
      
      The following commit will add a test, which shows this bug.
      
      To fix this situation, let's really set BdrvChild permissions during
      bdrv_check_perm procedure. And we are happy here, as check-perm is
      already written in transaction manner, so we just need to restore
      backed-up permissions in _abort.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      f962e961
    • V
      block: improve should_update_child · 2f30b7c3
      Vladimir Sementsov-Ogievskiy 提交于
      As it already said in the comment, we don't want to create loops in
      parent->child relations. So, when we try to append @to to @c, we should
      check that @c is not in @to children subtree, and we should check it
      recursively, not only the first level. The patch provides BFS-based
      search, to check the relations.
      
      This is needed for further fleecing-hook filter usage: we need to
      append it to source, when the hook is already a parent of target, and
      source may be in a backing chain of target (fleecing-scheme). So, on
      appending, the hook should not became a child (direct or through
      children subtree) of the target.
      Signed-off-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      2f30b7c3
    • K
      aio-posix: Assert that aio_poll() is always called in home thread · 0dc165c1
      Kevin Wolf 提交于
      aio_poll() has an existing assertion that the function is only called
      from the AioContext's home thread if blocking is allowed.
      
      This is not enough, some handlers make assumptions about the thread they
      run in. Extend the assertion to non-blocking calls, too.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      0dc165c1
    • K
      block: Use normal drain for bdrv_set_aio_context() · d70d5954
      Kevin Wolf 提交于
      Now that bdrv_set_aio_context() works inside drained sections, it can
      also use the real drain function instead of open coding something
      similar.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      d70d5954
    • K
      test-bdrv-drain: AioContext switch in drained section · 247d2737
      Kevin Wolf 提交于
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      247d2737