qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: Max Reitz <mreitz@redhat.com>,
	"qemu-block@nongnu.org" <qemu-block@nongnu.org>
Cc: Kevin Wolf <kwolf@redhat.com>,
	"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v5 30/42] qemu-img: Use child access functions
Date: Wed, 19 Jun 2019 09:18:01 +0000	[thread overview]
Message-ID: <5fb4108f-eb50-d076-4e1a-d59de96ef3a7@virtuozzo.com> (raw)
In-Reply-To: <20190612221004.2317-31-mreitz@redhat.com>

13.06.2019 1:09, Max Reitz wrote:
> 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                 | 36 ++++++++++++++++++++----------------
>   tests/qemu-iotests/204.out |  1 +
>   2 files changed, 21 insertions(+), 16 deletions(-)
> 
> diff --git a/qemu-img.c b/qemu-img.c
> index 07b6e2a808..7bfa6e5d40 100644
> --- a/qemu-img.c
> +++ b/qemu-img.c
> @@ -992,7 +992,7 @@ static int img_commit(int argc, char **argv)
>       if (!blk) {
>           return 1;
>       }
> -    bs = blk_bs(blk);
> +    bs = bdrv_skip_implicit_filters(blk_bs(blk));

if filename is json, describing explicit filter over normal node, bs will be
explicit filter ...

>   
>       qemu_progress_init(progress, 1.f);
>       qemu_progress_print(0.f, 100);
> @@ -1009,7 +1009,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_filtered_cow_bs(bs);
>           if (!base_bs) {

and here we'll fail.

>               error_setg(&local_err, "Image does not have a backing file");
>               goto done;
> @@ -1626,19 +1626,18 @@ static int convert_iteration_sectors(ImgConvertState *s, int64_t sector_num)
>   
>       if (s->sector_next_status <= sector_num) {
>           int64_t count = n * BDRV_SECTOR_SIZE;
> +        BlockDriverState *src_bs = blk_bs(s->src[src_cur]);
> +        BlockDriverState *base;
>   
>           if (s->target_has_backing) {
> -
> -            ret = bdrv_block_status(blk_bs(s->src[src_cur]),
> -                                    (sector_num - src_cur_offset) *
> -                                    BDRV_SECTOR_SIZE,
> -                                    count, &count, NULL, NULL);
> +            base = bdrv_backing_chain_next(src_bs);

As you described in another patch, will not we here get allocated in base as allocated, because of
counting filters above base?

Hmm. I now think, why filters don't report everything as unallocated, would not it be more correct
than fallthrough to child?

>           } else {
> -            ret = bdrv_block_status_above(blk_bs(s->src[src_cur]), NULL,
> -                                          (sector_num - src_cur_offset) *
> -                                          BDRV_SECTOR_SIZE,
> -                                          count, &count, NULL, NULL);
> +            base = NULL;
>           }
> +        ret = bdrv_block_status_above(src_bs, base,
> +                                      (sector_num - src_cur_offset) *
> +                                      BDRV_SECTOR_SIZE,
> +                                      count, &count, NULL, NULL);
>           if (ret < 0) {
>               error_report("error while reading block status of sector %" PRId64
>                            ": %s", sector_num, strerror(-ret));
> @@ -2439,7 +2438,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_filtered_cow_bs(out_bs));
>       } else {
>           s.target_backing_sectors = -1;
>       }
> @@ -2802,6 +2802,7 @@ static int get_block_status(BlockDriverState *bs, int64_t offset,
>   
>       depth = 0;
>       for (;;) {
> +        bs = bdrv_skip_rw_filters(bs);
>           ret = bdrv_block_status(bs, offset, bytes, &bytes, &map, &file);
>           if (ret < 0) {
>               return ret;
> @@ -2810,7 +2811,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_filtered_cow_bs(bs);
>           if (bs == NULL) {
>               ret = 0;
>               break;
> @@ -2949,7 +2950,7 @@ static int img_map(int argc, char **argv)
>       if (!blk) {
>           return 1;
>       }
> -    bs = blk_bs(blk);
> +    bs = bdrv_skip_implicit_filters(blk_bs(blk));

Hmm, another thought about implicit filters, how they could be here in qemu-img? If implicit are only
job filters. Do you prepared it for implicit COR? But we discussed with Kevin that we'd better deprecate
copy-on-read option..

So, if implicit filters are for compatibility, we'll have them only in block-jobs. So, seems no reason to support
them in qemu-img.

Also, in block-jobs, we can abandon creating implicit filters above any filter nodes, as well as abandon creating any
filter nodes above implicit filters. This will still support old scenarios, but gives very simple and well defined scope
of using implicit filters and how to work with them. What do you think?

>   
>       if (output_format == OFORMAT_HUMAN) {
>           printf("%-16s%-16s%-16s%s\n", "Offset", "Length", "Mapped to", "File");
> @@ -3165,6 +3166,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;
> @@ -3299,6 +3301,8 @@ static int img_rebase(int argc, char **argv)
>       }
>       bs = blk_bs(blk);
>   
> +    unfiltered_bs = bdrv_skip_rw_filters(bs);
> +
>       if (out_basefmt != NULL) {
>           if (bdrv_find_format(out_basefmt) == NULL) {
>               error_report("Invalid format name: '%s'", out_basefmt);
> @@ -3310,7 +3314,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_filtered_cow_bs(unfiltered_bs);
>   
>           if (base_bs) {
>               blk_old_backing = blk_new(qemu_get_aio_context(),
> @@ -3463,7 +3467,7 @@ 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,
> +                ret = bdrv_is_allocated_above(unfiltered_bs, prefix_chain_bs,
>                                                 offset, n, &n);
>                   if (ret < 0) {
>                       error_report("error while reading image metadata: %s",
> diff --git a/tests/qemu-iotests/204.out b/tests/qemu-iotests/204.out
> index f3a10fbe90..684774d763 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
> 


-- 
Best regards,
Vladimir

  reply	other threads:[~2019-06-19  9:19 UTC|newest]

Thread overview: 113+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-12 22:09 [Qemu-devel] [PATCH v5 00/42] block: Deal with filters Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 01/42] block: Mark commit and mirror as filter drivers Max Reitz
2019-06-13 10:47   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 02/42] copy-on-read: Support compressed writes Max Reitz
2019-06-13 10:49   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 03/42] throttle: " Max Reitz
2019-06-13 10:51   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 04/42] block: Add child access functions Max Reitz
2019-06-13 12:15   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 05/42] block: Add chain helper functions Max Reitz
2019-06-13 12:26   ` Vladimir Sementsov-Ogievskiy
2019-06-13 12:33     ` Max Reitz
2019-06-13 12:39       ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 06/42] qcow2: Implement .bdrv_storage_child() Max Reitz
2019-06-13 12:27   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 07/42] block: *filtered_cow_child() for *has_zero_init() Max Reitz
2019-06-13 12:34   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 08/42] block: bdrv_set_backing_hd() is about bs->backing Max Reitz
2019-06-13 12:40   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 09/42] block: Include filters when freezing backing chain Max Reitz
2019-06-13 13:04   ` Vladimir Sementsov-Ogievskiy
2019-06-13 14:05     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 10/42] block: Use CAF in bdrv_is_encrypted() Max Reitz
2019-06-13 13:16   ` Vladimir Sementsov-Ogievskiy
2019-06-13 14:15     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 11/42] block: Add bdrv_supports_compressed_writes() Max Reitz
2019-06-13 13:29   ` Vladimir Sementsov-Ogievskiy
2019-06-13 14:19     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 12/42] block: Use bdrv_filtered_rw* where obvious Max Reitz
2019-06-13 13:37   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 13/42] block: Use CAFs in block status functions Max Reitz
2019-06-14 12:07   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 14/42] block: Use CAFs when working with backing chains Max Reitz
2019-06-14 13:26   ` Vladimir Sementsov-Ogievskiy
2019-06-14 13:50     ` Max Reitz
2019-06-14 14:31       ` Vladimir Sementsov-Ogievskiy
2019-06-14 16:02         ` Max Reitz
2019-06-14 16:39           ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 15/42] block: Re-evaluate backing file handling in reopen Max Reitz
2019-06-14 13:42   ` Vladimir Sementsov-Ogievskiy
2019-06-14 15:52     ` Max Reitz
2019-06-14 16:43       ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 16/42] block: Use child access functions when flushing Max Reitz
2019-06-14 14:01   ` Vladimir Sementsov-Ogievskiy
2019-06-14 15:55     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 17/42] block: Use CAFs in bdrv_refresh_limits() Max Reitz
2019-06-14 15:04   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 18/42] block: Use CAFs in bdrv_refresh_filename() Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 19/42] block: Use CAF in bdrv_co_rw_vmstate() Max Reitz
2019-06-14 15:14   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 20/42] block/snapshot: Fall back to storage child Max Reitz
2019-06-14 15:22   ` Vladimir Sementsov-Ogievskiy
2019-06-14 16:10     ` Max Reitz
2019-06-14 16:47       ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 21/42] block: Use CAFs for debug breakpoints Max Reitz
2019-06-14 15:29   ` Vladimir Sementsov-Ogievskiy
2019-06-14 16:12     ` Max Reitz
2019-06-14 20:28       ` Eric Blake
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 22/42] block: Use CAFs in bdrv_get_allocated_file_size() Max Reitz
2019-06-12 22:17   ` Max Reitz
2019-06-14 15:41   ` Vladimir Sementsov-Ogievskiy
2019-06-14 16:15     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 23/42] blockdev: Use CAF in external_snapshot_prepare() Max Reitz
2019-06-14 15:46   ` Vladimir Sementsov-Ogievskiy
2019-06-14 16:20     ` Max Reitz
2019-06-14 16:58       ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 24/42] block: Use child access functions for QAPI queries Max Reitz
2019-06-18 12:06   ` Vladimir Sementsov-Ogievskiy
2019-06-18 14:22     ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 25/42] mirror: Deal with filters Max Reitz
2019-06-18 13:12   ` Vladimir Sementsov-Ogievskiy
2019-06-18 14:47     ` Max Reitz
2019-06-18 14:55       ` Vladimir Sementsov-Ogievskiy
2019-06-18 15:20         ` Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 26/42] backup: " Max Reitz
2019-06-18 13:45   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 27/42] commit: " Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 28/42] stream: " Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 29/42] nbd: Use CAF when looking for dirty bitmap Max Reitz
2019-06-18 13:58   ` Vladimir Sementsov-Ogievskiy
2019-06-18 14:48   ` Eric Blake
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 30/42] qemu-img: Use child access functions Max Reitz
2019-06-19  9:18   ` Vladimir Sementsov-Ogievskiy [this message]
2019-06-19 15:49     ` Max Reitz
2019-06-21 13:15       ` Vladimir Sementsov-Ogievskiy
2019-07-24  9:54         ` Vladimir Sementsov-Ogievskiy
2019-07-25 16:34           ` Max Reitz
2019-07-26 13:44             ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 31/42] block: Drop backing_bs() Max Reitz
2019-06-19  9:18   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 32/42] block: Make bdrv_get_cumulative_perm() public Max Reitz
2019-06-19  9:19   ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 33/42] blockdev: Fix active commit choice Max Reitz
2019-06-19  9:31   ` Vladimir Sementsov-Ogievskiy
2019-06-19 15:59     ` Max Reitz
2019-06-21 13:26       ` Vladimir Sementsov-Ogievskiy
2019-07-24  9:54         ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 34/42] block: Inline bdrv_co_block_status_from_*() Max Reitz
2019-06-19  9:34   ` Vladimir Sementsov-Ogievskiy
2019-06-19 16:01     ` Max Reitz
2019-06-19 16:07     ` Max Reitz
2019-06-21 13:39   ` Vladimir Sementsov-Ogievskiy
2019-07-24  9:54     ` Vladimir Sementsov-Ogievskiy
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 35/42] block: Fix check_to_replace_node() Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 36/42] iotests: Add tests for mirror @replaces loops Max Reitz
2019-06-12 22:09 ` [Qemu-devel] [PATCH v5 37/42] block: Leave BDS.backing_file constant Max Reitz
2019-06-12 22:10 ` [Qemu-devel] [PATCH v5 38/42] iotests: Let complete_and_wait() work with commit Max Reitz
2019-06-12 22:10 ` [Qemu-devel] [PATCH v5 39/42] iotests: Add filter commit test cases Max Reitz
2019-06-12 22:10 ` [Qemu-devel] [PATCH v5 40/42] iotests: Add filter mirror " Max Reitz
2019-06-12 22:10 ` [Qemu-devel] [PATCH v5 41/42] iotests: Add test for commit in sub directory Max Reitz
2019-06-12 22:10 ` [Qemu-devel] [PATCH v5 42/42] iotests: Test committing to overridden backing Max Reitz
2019-06-13 15:28 ` [Qemu-devel] [PATCH v5 00/42] block: Deal with filters Vladimir Sementsov-Ogievskiy
2019-06-13 16:12   ` 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=5fb4108f-eb50-d076-4e1a-d59de96ef3a7@virtuozzo.com \
    --to=vsementsov@virtuozzo.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --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).