1. 18 4月, 2019 1 次提交
    • C
      log: Make glib logging go through QEMU · f5852efa
      Christophe Fergeau 提交于
      This commit adds a error_init() helper which calls
      g_log_set_default_handler() so that glib logs (g_log, g_warning, ...)
      are handled similarly to other QEMU logs. This means they will get a
      timestamp if timestamps are enabled, and they will go through the
      HMP monitor if one is configured.
      
      This commit also adds a call to error_init() to the binaries
      installed by QEMU. Since error_init() also calls error_set_progname(),
      this means that *-linux-user, *-bsd-user and qemu-pr-helper messages
      output with error_report, info_report, ... will slightly change: they
      will be prefixed by the binary name.
      
      glib debug messages are enabled through G_MESSAGES_DEBUG similarly to
      the glib default log handler.
      
      At the moment, this change will mostly impact SPICE logging if your
      spice version is >= 0.14.1. With older spice versions, this is not going
      to work as expected, but will not have any ill effect, so this call is
      not conditional on the SPICE version.
      Signed-off-by: NChristophe Fergeau <cfergeau@redhat.com>
      Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
      Message-Id: <20190131164614.19209-3-cfergeau@redhat.com>
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      Signed-off-by: NMarkus Armbruster <armbru@redhat.com>
      f5852efa
  2. 02 4月, 2019 1 次提交
    • N
      qemu-img: Enable BDRV_REQ_MAY_UNMAP in convert · a3d6ae22
      Nir Soffer 提交于
      With Kevin's "block: Fix slow pre-zeroing in qemu-img convert"[1]
      (commit c9fdcf20, 'qemu-img: Use BDRV_REQ_NO_FALLBACK for
      pre-zeroing') we skip the pre zero step called like this:
      
          blk_make_zero(s->target, BDRV_REQ_MAY_UNMAP | BDRV_REQ_NO_FALLBACK)
      
      And we write zeroes later using:
      
          blk_co_pwrite_zeroes(s->target,
                               sector_num << BDRV_SECTOR_BITS,
                               n << BDRV_SECTOR_BITS, 0);
      
      Since we use flags=0, this is translated to NBD_CMD_WRITE_ZEROES with
      NBD_CMD_FLAG_NO_HOLE flag, which cause the NBD server to allocated space
      instead of punching a hole.
      
      Here is an example failure:
      
      $ dd if=/dev/urandom of=src.img bs=1M count=5
      $ truncate -s 50m src.img
      $ truncate -s 50m dst.img
      $ nbdkit -f -v -e '' -U nbd.sock file file=dst.img
      
      $ ./qemu-img convert -n src.img nbd:unix:nbd.sock
      
      We can see in nbdkit log that it received the NBD_CMD_FLAG_NO_HOLE
      (may_trim=0):
      
      nbdkit: file[1]: debug: newstyle negotiation: flags: export 0x4d
      nbdkit: file[1]: debug: pwrite count=2097152 offset=0
      nbdkit: file[1]: debug: pwrite count=2097152 offset=2097152
      nbdkit: file[1]: debug: pwrite count=1048576 offset=4194304
      nbdkit: file[1]: debug: zero count=33554432 offset=5242880 may_trim=0
      nbdkit: file[1]: debug: zero count=13631488 offset=38797312 may_trim=0
      nbdkit: file[1]: debug: flush
      
      And the image became fully allocated:
      
      $ qemu-img info dst.img
      virtual size: 50M (52428800 bytes)
      disk size: 50M
      
      With this change we see that nbdkit did not receive the
      NBD_CMD_FLAG_NO_HOLE (may_trim=1):
      
      nbdkit: file[1]: debug: newstyle negotiation: flags: export 0x4d
      nbdkit: file[1]: debug: pwrite count=2097152 offset=0
      nbdkit: file[1]: debug: pwrite count=2097152 offset=2097152
      nbdkit: file[1]: debug: pwrite count=1048576 offset=4194304
      nbdkit: file[1]: debug: zero count=33554432 offset=5242880 may_trim=1
      nbdkit: file[1]: debug: zero count=13631488 offset=38797312 may_trim=1
      nbdkit: file[1]: debug: flush
      
      And the file is sparse as expected:
      
      $ qemu-img info dst.img
      virtual size: 50M (52428800 bytes)
      disk size: 5.0M
      
      [1] http://lists.nongnu.org/archive/html/qemu-block/2019-03/msg00761.htmlSigned-off-by: NNir Soffer <nsoffer@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      a3d6ae22
  3. 30 3月, 2019 2 次提交
    • E
      qemu-img: Gracefully shutdown when map can't finish · 30065d14
      Eric Blake 提交于
      Trying 'qemu-img map -f raw nbd://localhost:10809' causes the
      NBD server to output a scary message:
      
      qemu-nbd: Disconnect client, due to: Failed to read request: Unexpected end-of-file before all bytes were read
      
      This is because the NBD client, being remote, has no way to expose a
      human-readable map (the --output=json data is fine, however). But
      because we exit(1) right after the message, causing the client to
      bypass all block cleanup, the server sees the abrupt exit and warns,
      whereas it would be silent had the client had a chance to send
      NBD_CMD_DISC. Other protocols may have similar cleanup issues, where
      failure to blk_unref() could cause unintended effects.
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20190326184043.7544-1-eblake@redhat.com>
      Reviewed-by: NJohn Snow <jsnow@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      30065d14
    • E
      qemu-img: Report bdrv_block_status failures · 2058c2ad
      Eric Blake 提交于
      If bdrv_block_status_above() fails, we are aborting the convert
      process but failing to print an error message.  Broken in commit
      690c7301 (v2.4) when rewriting convert's logic.
      
      Discovered when teaching nbdkit to support NBD_CMD_BLOCK_STATUS, and
      accidentally violating the protocol by returning more than one extent
      in spite of qemu asking for NBD_CMD_FLAG_REQ_ONE.  The qemu NBD code
      should probably handle the server's non-compliance more gracefully
      than failing with EINVAL, but qemu-img shouldn't be silently
      squelching any block status failures. It doesn't help that qemu 3.1
      masks the qemu-img bug with extra noise that the nbd code is dumping
      to stderr (that noise was cleaned up in d8b4bad8).
      Reported-by: NRichard W.M. Jones <rjones@redhat.com>
      Signed-off-by: NEric Blake <eblake@redhat.com>
      Message-Id: <20190323212639.579-2-eblake@redhat.com>
      Reviewed-by: NKevin Wolf <kwolf@redhat.com>
      Reviewed-by: NVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
      2058c2ad
  4. 26 3月, 2019 1 次提交
    • K
      qemu-img: Use BDRV_REQ_NO_FALLBACK for pre-zeroing · c9fdcf20
      Kevin Wolf 提交于
      If qemu-img convert sees that the target image isn't zero-initialised
      yet, it tries to do an efficient zero write for the whole image first
      to save the overhead of repeated explicit zero writes during the
      conversion. Obviously, this provides only an advantage if the
      pre-zeroing is actually efficient. Otherwise, we can end up writing
      zeroes slowly while zeroing out the whole image, and then overwrite the
      same blocks again with real data, potentially doubling the written data.
      
      Pass BDRV_REQ_NO_FALLBACK to blk_make_zero() to avoid this case. If we
      can't efficiently zero out, we'll instead write explicit zeroes only if
      there is no data to be written to a block.
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      Acked-by: NEric Blake <eblake@redhat.com>
      c9fdcf20
  5. 08 3月, 2019 1 次提交
    • A
      block: iterate_format with account of whitelisting · 9ac404c5
      Andrey Shinkevich 提交于
      bdrv_iterate_format (which is currently only used for printing out the
      formats supported by the block layer) doesn't take format whitelisting
      into account.
      
      This creates a problem for tests: they enumerate supported formats to
      decide which tests to enable, but then discover that QEMU doesn't let
      them actually use some of those formats.
      
      To avoid that, exclude formats that are not whitelisted from
      enumeration, if whitelisting is in use.  Since we have separate
      whitelists for r/w and r/o, take this a parameter to
      bdrv_iterate_format, and print two lists of supported formats (r/w and
      r/o) in main qemu.
      Signed-off-by: NRoman Kagan <rkagan@virtuozzo.com>
      Signed-off-by: NAndrey Shinkevich <andrey.shinkevich@virtuozzo.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      9ac404c5
  6. 25 2月, 2019 4 次提交
    • 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: 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
    • D
      qemu-img: fix error reporting for -object · 334c43e2
      Daniel P. Berrangé 提交于
      Error reporting for user_creatable_add_opts_foreach was changed so that
      it no longer called 'error_report_err' in:
      
        commit 7e1e0c11
        Author: Markus Armbruster <armbru@redhat.com>
        Date:   Wed Oct 17 10:26:43 2018 +0200
      
          qom: Clean up error reporting in user_creatable_add_opts_foreach()
      
      Some callers were updated to pass in "&error_fatal" but all the ones in
      qemu-img were left passing NULL. As a result all errors went to
      /dev/null instead of being reported to the user.
      Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
      Reviewed-by: NPhilippe Mathieu-Daudé <philmd@redhat.com>
      Reviewed-by: NMarkus Armbruster <armbru@redhat.com>
      Reviewed-by: NStefano Garzarella <sgarzare@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      334c43e2
    • D
      block/snapshot: remove bdrv_snapshot_delete_by_id_or_name · 8c04093c
      Daniel Henrique Barboza 提交于
      After the previous patch, the only instance of this function left
      is inside qemu-img.c.
      
      qemu-img is using it inside the 'img_snapshot' function to delete
      snapshots in the SNAPSHOT_DELETE case, based on a "snapshot_name"
      string that refers to the tag, not ID, of the QEMUSnapshotInfo struct.
      This can be verified by checking the SNAPSHOT_CREATE case that
      comes shortly before SNAPSHOT_DELETE. In that case, the same
      "snapshot_name" variable is being strcpy to the 'name' field
      of the QEMUSnapshotInfo struct sn:
      
      pstrcpy(sn.name, sizeof(sn.name), snapshot_name);
      
      Based on that, it is unlikely that "snapshot_name" might contain
      an "id" in SNAPSHOT_DELETE.
      
      This patch changes SNAPSHOT_DELETE to use snapshot_find() and
      snapshot_delete() instead of bdrv_snapshot_delete_by_id_or_name.
      After that, there is no instances left of bdrv_snapshot_delete_by_id_or_name
      in the code, so it is safe to remove it entirely.
      Suggested-by: NMurilo Opsfelder Araujo <muriloo@linux.ibm.com>
      Signed-off-by: NDaniel Henrique Barboza <danielhb413@gmail.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8c04093c
  7. 22 2月, 2019 1 次提交
  8. 31 1月, 2019 1 次提交
    • R
      qemu-io: Add generic function for reinitializing optind. · d339d766
      Richard W.M. Jones 提交于
      On FreeBSD 11.2:
      
        $ nbdkit memory size=1M --run './qemu-io -f raw -c "aio_write 0 512" $nbd'
        Parsing error: non-numeric argument, or extraneous/unrecognized suffix -- aio_write
      
      After main option parsing, we reinitialize optind so we can parse each
      command.  However reinitializing optind to 0 does not work on FreeBSD.
      What happens when you do this is optind remains 0 after the option
      parsing loop, and the result is we try to parse argv[optind] ==
      argv[0] == "aio_write" as if it was the first parameter.
      
      The FreeBSD manual page says:
      
        In order to use getopt() to evaluate multiple sets of arguments, or to
        evaluate a single set of arguments multiple times, the variable optreset
        must be set to 1 before the second and each additional set of calls to
        getopt(), and the variable optind must be reinitialized.
      
      (From the rest of the man page it is clear that optind must be
      reinitialized to 1).
      
      The glibc man page says:
      
        A program that scans multiple argument vectors,  or  rescans  the  same
        vector  more than once, and wants to make use of GNU extensions such as
        '+' and '-' at  the  start  of  optstring,  or  changes  the  value  of
        POSIXLY_CORRECT  between scans, must reinitialize getopt() by resetting
        optind to 0, rather than the traditional value of 1.  (Resetting  to  0
        forces  the  invocation  of  an  internal  initialization  routine that
        rechecks POSIXLY_CORRECT and checks for GNU extensions in optstring.)
      
      This commit introduces an OS-portability function called
      qemu_reset_optind which provides a way of resetting optind that works
      on FreeBSD and platforms that use optreset, while keeping it the same
      as now on other platforms.
      
      Note that the qemu codebase sets optind in many other places, but in
      those other places it's setting a local variable and not using getopt.
      This change is only needed in places where we are using getopt and the
      associated global variable optind.
      Signed-off-by: NRichard W.M. Jones <rjones@redhat.com>
      Message-id: 20190118101114.11759-2-rjones@redhat.com
      Reviewed-by: NDaniel P. Berrangé <berrange@redhat.com>
      Reviewed-by: NEric Blake <eblake@redhat.com>
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      d339d766
  9. 21 11月, 2018 2 次提交
  10. 13 11月, 2018 1 次提交
  11. 05 11月, 2018 1 次提交
    • M
      option: Make option help nicer to read · 63898712
      Max Reitz 提交于
      This adds some whitespace into the option help (including indentation)
      and puts angle brackets around the type names.  Furthermore, the list
      name is no longer printed as part of every line, but only once in
      advance, and only if the caller did not print a caption already.
      
      This patch also restores the description alignment we had before commit
      9cbef9d6, just at 24 instead of 16 characters like we used to.
      This increase is because now we have the type and two spaces of
      indentation before the description, and with a usual type name length of
      three chracters, this sums up to eight additional characters -- which
      means that we now need 24 characters to get the same amount of padding
      for most options.  Also, 24 is a third of 80, which makes it kind of a
      round number in terminal terms.
      
      Finally, this patch amends the reference output of iotest 082 to match
      the changes (and thus makes it pass again).
      Signed-off-by: NMax Reitz <mreitz@redhat.com>
      Reviewed-by: NMarc-André Lureau <marcandre.lureau@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      63898712
  12. 15 8月, 2018 1 次提交
    • D
      qemu-img: fix regression copying secrets during convert · 8d65a3cc
      Daniel P. Berrangé 提交于
      When the convert command is creating an output file that needs
      secrets, we need to ensure those secrets are passed to both the
      blk_new_open and bdrv_create API calls.
      
      This is done by qemu-img extracting all opts matching the name
      suffix "key-secret". Unfortunately the code doing this was run after the
      call to bdrv_create(), which meant the QemuOpts it was extracting
      secrets from was now empty.
      
      Previously this worked by luks as a bug meant the "key-secret"
      parameters were not purged from the QemuOpts. This bug was fixed in
      
        commit b76b4f60
        Author: Kevin Wolf <kwolf@redhat.com>
        Date:   Thu Jan 11 16:18:08 2018 +0100
      
          qcow2: Use visitor for options in qcow2_create()
      
      Exposing the latent bug in qemu-img. This fix simply moves the copying
      of secrets to before the bdrv_create() call.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NDaniel P. Berrangé <berrange@redhat.com>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8d65a3cc
  13. 30 7月, 2018 1 次提交
  14. 23 7月, 2018 1 次提交
    • P
      qemu-img: avoid overflow of min_sparse parameter · 6360ab27
      Peter Lieven 提交于
      the min_sparse convert parameter can overflow (e.g. -S 1024G)
      in the conversion from int64_t to int resulting in a negative
      min_sparse parameter. Avoid this by limiting the valid parameters
      to sane values. In fact anything exceeding the convert buffer size
      is also pointless. While at it also forbid values that are non
      multiple of 512 to avoid undesired behaviour. For instance, values
      between 1 and 511 were legal, but resulted in full allocation.
      
      Cc: qemu-stable@nongnu.org
      Signed-off-by: NPeter Lieven <pl@kamp.de>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      6360ab27
  15. 13 7月, 2018 1 次提交
    • P
      qemu-img: align result of is_allocated_sectors · 8dcd3c9b
      Peter Lieven 提交于
      We currently don't enforce that the sparse segments we detect during convert are
      aligned. This leads to unnecessary and costly read-modify-write cycles either
      internally in Qemu or in the background on the storage device as nearly all
      modern filesystems or hardware have a 4k alignment internally.
      
      This patch modifies is_allocated_sectors so that its *pnum result will always
      end at an alignment boundary. This way all requests will end at an alignment
      boundary. The start of all requests will also be aligned as long as the results
      of get_block_status do not lead to an unaligned offset.
      
      The number of RMW cycles when converting an example image [1] to a raw device that
      has 4k sector size is about 4600 4k read requests to perform a total of about 15000
      write requests. With this path the additional 4600 read requests are eliminated while
      the number of total write requests stays constant.
      
      [1] https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-amd64-disk1.vmdkSigned-off-by: NPeter Lieven <pl@kamp.de>
      Signed-off-by: NKevin Wolf <kwolf@redhat.com>
      8dcd3c9b
  16. 10 7月, 2018 1 次提交
  17. 05 7月, 2018 1 次提交
  18. 15 6月, 2018 1 次提交
  19. 11 6月, 2018 8 次提交
  20. 01 6月, 2018 1 次提交
  21. 23 5月, 2018 7 次提交
  22. 20 5月, 2018 1 次提交