qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, peter.maydell@linaro.org, qemu-devel@nongnu.org
Subject: [PULL 49/64] qemu-img: Use child access functions
Date: Mon,  7 Sep 2020 13:09:21 +0200	[thread overview]
Message-ID: <20200907110936.261684-50-kwolf@redhat.com> (raw)
In-Reply-To: <20200907110936.261684-1-kwolf@redhat.com>

From: Max Reitz <mreitz@redhat.com>

This changes iotest 204's output, because blkdebug on top of a COW node
used to make qemu-img map disregard the rest of the backing chain (the
backing chain was broken by the filter).  With this patch, the
allocation in the base image is reported correctly.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 qemu-img.c                 | 43 +++++++++++++++++++++++---------------
 tests/qemu-iotests/204.out |  1 +
 2 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/qemu-img.c b/qemu-img.c
index eb2fc1f862..d0b1c97562 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -1085,7 +1085,7 @@ static int img_commit(int argc, char **argv)
         /* This is different from QMP, which by default uses the deepest file in
          * the backing chain (i.e., the very base); however, the traditional
          * behavior of qemu-img commit is using the immediate backing file. */
-        base_bs = backing_bs(bs);
+        base_bs = bdrv_backing_chain_next(bs);
         if (!base_bs) {
             error_setg(&local_err, "Image does not have a backing file");
             goto done;
@@ -1732,18 +1732,20 @@ static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
     if (s->sector_next_status <= sector_num) {
         uint64_t offset = (sector_num - src_cur_offset) * BDRV_SECTOR_SIZE;
         int64_t count;
+        BlockDriverState *src_bs = blk_bs(s->src[src_cur]);
+        BlockDriverState *base;
+
+        if (s->target_has_backing) {
+            base = bdrv_cow_bs(bdrv_skip_filters(src_bs));
+        } else {
+            base = NULL;
+        }
 
         do {
             count = n * BDRV_SECTOR_SIZE;
 
-            if (s->target_has_backing) {
-                ret = bdrv_block_status(blk_bs(s->src[src_cur]), offset,
-                                        count, &count, NULL, NULL);
-            } else {
-                ret = bdrv_block_status_above(blk_bs(s->src[src_cur]), NULL,
-                                              offset, count, &count, NULL,
-                                              NULL);
-            }
+            ret = bdrv_block_status_above(src_bs, base, offset, count, &count,
+                                          NULL, NULL);
 
             if (ret < 0) {
                 if (s->salvage) {
@@ -2665,7 +2667,8 @@ static int img_convert(int argc, char **argv)
          * s.target_backing_sectors has to be negative, which it will
          * be automatically).  The backing file length is used only
          * for optimizations, so such a case is not fatal. */
-        s.target_backing_sectors = bdrv_nb_sectors(out_bs->backing->bs);
+        s.target_backing_sectors =
+            bdrv_nb_sectors(bdrv_backing_chain_next(out_bs));
     } else {
         s.target_backing_sectors = -1;
     }
@@ -3035,6 +3038,7 @@ static int get_block_status(BlockDriverState *bs, int64_t offset,
 
     depth = 0;
     for (;;) {
+        bs = bdrv_skip_filters(bs);
         ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file);
         if (ret < 0) {
             return ret;
@@ -3043,7 +3047,7 @@ static int get_block_status(BlockDriverState *bs, int64_t offset,
         if (ret & (BDRV_BLOCK_ZERO|BDRV_BLOCK_DATA)) {
             break;
         }
-        bs = backing_bs(bs);
+        bs = bdrv_cow_bs(bs);
         if (bs == NULL) {
             ret = 0;
             break;
@@ -3425,6 +3429,7 @@ static int img_rebase(int argc, char **argv)
     uint8_t *buf_old = NULL;
     uint8_t *buf_new = NULL;
     BlockDriverState *bs = NULL, *prefix_chain_bs = NULL;
+    BlockDriverState *unfiltered_bs;
     char *filename;
     const char *fmt, *cache, *src_cache, *out_basefmt, *out_baseimg;
     int c, flags, src_flags, ret;
@@ -3559,6 +3564,8 @@ static int img_rebase(int argc, char **argv)
     }
     bs = blk_bs(blk);
 
+    unfiltered_bs = bdrv_skip_filters(bs);
+
     if (out_basefmt != NULL) {
         if (bdrv_find_format(out_basefmt) == NULL) {
             error_report("Invalid format name: '%s'", out_basefmt);
@@ -3570,7 +3577,7 @@ static int img_rebase(int argc, char **argv)
     /* For safe rebasing we need to compare old and new backing file */
     if (!unsafe) {
         QDict *options = NULL;
-        BlockDriverState *base_bs = backing_bs(bs);
+        BlockDriverState *base_bs = bdrv_cow_bs(unfiltered_bs);
 
         if (base_bs) {
             blk_old_backing = blk_new(qemu_get_aio_context(),
@@ -3711,7 +3718,7 @@ static int img_rebase(int argc, char **argv)
             n = MIN(IO_BUF_SIZE, size - offset);
 
             /* If the cluster is allocated, we don't need to take action */
-            ret = bdrv_is_allocated(bs, offset, n, &n);
+            ret = bdrv_is_allocated(unfiltered_bs, offset, n, &n);
             if (ret < 0) {
                 error_report("error while reading image metadata: %s",
                              strerror(-ret));
@@ -3726,8 +3733,9 @@ static int img_rebase(int argc, char **argv)
                  * If cluster wasn't changed since prefix_chain, we don't need
                  * to take action
                  */
-                ret = bdrv_is_allocated_above(backing_bs(bs), prefix_chain_bs,
-                                              false, offset, n, &n);
+                ret = bdrv_is_allocated_above(bdrv_cow_bs(unfiltered_bs),
+                                              prefix_chain_bs, false,
+                                              offset, n, &n);
                 if (ret < 0) {
                     error_report("error while reading image metadata: %s",
                                  strerror(-ret));
@@ -3805,9 +3813,10 @@ static int img_rebase(int argc, char **argv)
      * doesn't change when we switch the backing file.
      */
     if (out_baseimg && *out_baseimg) {
-        ret = bdrv_change_backing_file(bs, out_baseimg, out_basefmt, true);
+        ret = bdrv_change_backing_file(unfiltered_bs, out_baseimg, out_basefmt,
+                                       true);
     } else {
-        ret = bdrv_change_backing_file(bs, NULL, NULL, false);
+        ret = bdrv_change_backing_file(unfiltered_bs, NULL, NULL, false);
     }
 
     if (ret == -ENOSPC) {
diff --git a/tests/qemu-iotests/204.out b/tests/qemu-iotests/204.out
index 457f72df8f..4d903d20ea 100644
--- a/tests/qemu-iotests/204.out
+++ b/tests/qemu-iotests/204.out
@@ -59,5 +59,6 @@ Offset          Length          File
 0x900000        0x2400000       TEST_DIR/t.IMGFMT
 0x3c00000       0x1100000       TEST_DIR/t.IMGFMT
 0x6a00000       0x400000        TEST_DIR/t.IMGFMT
+0x6e00000       0x1200000       TEST_DIR/t.IMGFMT.base
 No errors were found on the image.
 *** done
-- 
2.25.4



  parent reply	other threads:[~2020-09-07 11:30 UTC|newest]

Thread overview: 72+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-07 11:08 [PULL 00/64] Block layer patches Kevin Wolf
2020-09-07 11:08 ` [PULL 01/64] block: Raise an error when backing file parameter is an empty string Kevin Wolf
2020-09-07 11:08 ` [PULL 02/64] block/nvme: Replace magic value by SCALE_MS definition Kevin Wolf
2020-09-07 11:08 ` [PULL 03/64] block/nvme: Avoid further processing if trace event not enabled Kevin Wolf
2020-09-07 11:08 ` [PULL 04/64] block/nvme: Let nvme_create_queue_pair() fail gracefully Kevin Wolf
2020-09-07 11:08 ` [PULL 05/64] block/nvme: Define INDEX macros to ease code review Kevin Wolf
2020-09-07 11:08 ` [PULL 06/64] block/nvme: Improve error message when IO queue creation failed Kevin Wolf
2020-09-07 11:08 ` [PULL 07/64] block/nvme: Use common error path in nvme_add_io_queue() Kevin Wolf
2020-09-07 11:08 ` [PULL 08/64] block/nvme: Rename local variable Kevin Wolf
2020-09-07 11:08 ` [PULL 09/64] block/nvme: Use union of NvmeIdCtrl / NvmeIdNs structures Kevin Wolf
2020-09-07 11:08 ` [PULL 10/64] block/nvme: Replace qemu_try_blockalign0 by qemu_try_blockalign/memset Kevin Wolf
2020-09-07 11:08 ` [PULL 11/64] block/nvme: Replace qemu_try_blockalign(bs) by qemu_try_memalign(pg_sz) Kevin Wolf
2020-09-07 11:08 ` [PULL 12/64] block/nvme: Simplify nvme_init_queue() arguments Kevin Wolf
2020-09-07 11:08 ` [PULL 13/64] block/nvme: Replace BDRV_POLL_WHILE by AIO_WAIT_WHILE Kevin Wolf
2020-09-07 11:08 ` [PULL 14/64] block/nvme: Simplify nvme_create_queue_pair() arguments Kevin Wolf
2020-09-07 11:08 ` [PULL 15/64] block/nvme: Extract nvme_poll_queue() Kevin Wolf
2020-09-07 11:08 ` [PULL 16/64] block/nvme: Use an array of EventNotifier Kevin Wolf
2020-09-07 11:08 ` [PULL 17/64] block: Add child access functions Kevin Wolf
2020-09-07 11:08 ` [PULL 18/64] block: Add chain helper functions Kevin Wolf
2020-09-07 11:08 ` [PULL 19/64] block: bdrv_cow_child() for bdrv_has_zero_init() Kevin Wolf
2020-09-07 11:08 ` [PULL 20/64] block: bdrv_set_backing_hd() is about bs->backing Kevin Wolf
2020-09-07 11:08 ` [PULL 21/64] block: Include filters when freezing backing chain Kevin Wolf
2020-09-07 11:08 ` [PULL 22/64] block: Drop bdrv_is_encrypted() Kevin Wolf
2020-09-07 11:08 ` [PULL 23/64] block: Add bdrv_supports_compressed_writes() Kevin Wolf
2020-09-07 11:08 ` [PULL 24/64] throttle: Support compressed writes Kevin Wolf
2020-09-07 11:08 ` [PULL 25/64] copy-on-read: " Kevin Wolf
2020-09-07 11:08 ` [PULL 26/64] block: Use bdrv_filter_(bs|child) where obvious Kevin Wolf
2020-09-07 11:08 ` [PULL 27/64] block: Use CAFs in block status functions Kevin Wolf
2020-09-07 11:09 ` [PULL 28/64] stream: Deal with filters Kevin Wolf
2020-09-07 11:09 ` [PULL 29/64] block: Use CAFs when working with backing chains Kevin Wolf
2020-09-07 11:09 ` [PULL 30/64] block: Use bdrv_cow_child() in bdrv_co_truncate() Kevin Wolf
2020-09-07 11:09 ` [PULL 31/64] block: Re-evaluate backing file handling in reopen Kevin Wolf
2020-09-07 11:09 ` [PULL 32/64] block: Flush all children in generic code Kevin Wolf
2020-09-07 11:09 ` [PULL 33/64] vmdk: Drop vmdk_co_flush() Kevin Wolf
2020-09-07 11:09 ` [PULL 34/64] block: Iterate over children in refresh_limits Kevin Wolf
2020-09-07 11:09 ` [PULL 35/64] block: Use CAFs in bdrv_refresh_filename() Kevin Wolf
2020-09-07 11:09 ` [PULL 36/64] block: Use CAF in bdrv_co_rw_vmstate() Kevin Wolf
2020-09-07 11:09 ` [PULL 37/64] block/snapshot: Fix fallback Kevin Wolf
2021-04-30 22:30   ` Peter Maydell
2021-05-03  9:40     ` Kevin Wolf
2021-05-03  9:45       ` Max Reitz
2021-05-03 10:17         ` Kevin Wolf
2020-09-07 11:09 ` [PULL 38/64] block: Use CAFs for debug breakpoints Kevin Wolf
2020-09-07 11:09 ` [PULL 39/64] block: Improve get_allocated_file_size's default Kevin Wolf
2020-09-07 11:09 ` [PULL 40/64] block/null: Implement bdrv_get_allocated_file_size Kevin Wolf
2020-09-07 11:09 ` [PULL 41/64] blockdev: Use CAF in external_snapshot_prepare() Kevin Wolf
2020-09-07 11:09 ` [PULL 42/64] block: Report data child for query-blockstats Kevin Wolf
2020-09-07 11:09 ` [PULL 43/64] block: Use child access functions for QAPI queries Kevin Wolf
2020-09-07 11:09 ` [PULL 44/64] block-copy: Use CAF to find sync=top base Kevin Wolf
2020-09-07 11:09 ` [PULL 45/64] mirror: Deal with filters Kevin Wolf
2020-09-07 11:09 ` [PULL 46/64] backup: " Kevin Wolf
2020-09-07 11:09 ` [PULL 47/64] commit: " Kevin Wolf
2020-09-07 11:09 ` [PULL 48/64] nbd: Use CAF when looking for dirty bitmap Kevin Wolf
2020-09-07 11:09 ` Kevin Wolf [this message]
2020-09-07 11:09 ` [PULL 50/64] block: Drop backing_bs() Kevin Wolf
2020-09-07 11:09 ` [PULL 51/64] blockdev: Fix active commit choice Kevin Wolf
2020-09-07 11:09 ` [PULL 52/64] block: Inline bdrv_co_block_status_from_*() Kevin Wolf
2020-09-07 11:09 ` [PULL 53/64] block: Leave BDS.backing_{file,format} constant Kevin Wolf
2020-09-07 11:09 ` [PULL 54/64] iotests: Test that qcow2's data-file is flushed Kevin Wolf
2020-09-07 11:09 ` [PULL 55/64] iotests: Let complete_and_wait() work with commit Kevin Wolf
2020-09-07 11:09 ` [PULL 56/64] iotests: Add filter commit test cases Kevin Wolf
2020-09-07 11:09 ` [PULL 57/64] iotests: Add filter mirror " Kevin Wolf
2020-09-07 11:09 ` [PULL 58/64] iotests: Add test for commit in sub directory Kevin Wolf
2020-09-07 11:09 ` [PULL 59/64] iotests: Test committing to overridden backing Kevin Wolf
2020-09-07 11:09 ` [PULL 60/64] iotests: Allow running from different directory Kevin Wolf
2020-09-07 11:09 ` [PULL 61/64] file-win32: Fix "locking" option Kevin Wolf
2020-09-07 11:09 ` [PULL 62/64] block/nvme: Group controller registers in NVMeRegs structure Kevin Wolf
2020-09-07 11:09 ` [PULL 63/64] block/nvme: Use generic NvmeBar structure Kevin Wolf
2020-09-07 11:09 ` [PULL 64/64] block/nvme: Pair doorbell registers Kevin Wolf
2020-09-07 20:22 ` [PULL 00/64] Block layer patches Peter Maydell
2020-09-08  7:01   ` Kevin Wolf
2020-09-08  9:01     ` Max Reitz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200907110936.261684-50-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).