qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
	qemu-devel@nongnu.org, qemu-block@nongnu.org
Subject: Re: [PATCH v7 35/47] commit: Deal with filters
Date: Thu, 20 Aug 2020 15:47:45 +0200	[thread overview]
Message-ID: <20200820134745.GE99531@linux.fritz.box> (raw)
In-Reply-To: <fe136446-ac29-67de-faf4-125145970fd1@redhat.com>

[-- Attachment #1: Type: text/plain, Size: 12640 bytes --]

Am 20.08.2020 um 13:27 hat Max Reitz geschrieben:
> On 19.08.20 19:58, Kevin Wolf wrote:
> > Am 25.06.2020 um 17:22 hat Max Reitz geschrieben:
> >> This includes some permission limiting (for example, we only need to
> >> take the RESIZE permission if the base is smaller than the top).
> >>
> >> Signed-off-by: Max Reitz <mreitz@redhat.com>
> >> ---
> >>  block/block-backend.c          |  9 +++-
> >>  block/commit.c                 | 96 +++++++++++++++++++++++++---------
> >>  block/monitor/block-hmp-cmds.c |  2 +-
> >>  blockdev.c                     |  4 +-
> >>  4 files changed, 81 insertions(+), 30 deletions(-)
> >>
> >> diff --git a/block/block-backend.c b/block/block-backend.c
> >> index 6936b25c83..7f2c7dbccc 100644
> >> --- a/block/block-backend.c
> >> +++ b/block/block-backend.c
> >> @@ -2271,8 +2271,13 @@ int blk_commit_all(void)
> >>          AioContext *aio_context = blk_get_aio_context(blk);
> >>  
> >>          aio_context_acquire(aio_context);
> >> -        if (blk_is_inserted(blk) && blk->root->bs->backing) {
> >> -            int ret = bdrv_commit(blk->root->bs);
> > 
> > The old code didn't try to commit nodes that don't have a backing file.
> > 
> >> +        if (blk_is_inserted(blk)) {
> >> +            BlockDriverState *non_filter;
> >> +            int ret;
> >> +
> >> +            /* Legacy function, so skip implicit filters */
> >> +            non_filter = bdrv_skip_implicit_filters(blk->root->bs);
> >> +            ret = bdrv_commit(non_filter);
> > 
> > The new one tries unconditionally. For nodes without a backing file,
> > bdrv_commit() will return -ENOTSUP, so the whole function fails.
> 
> :(
> 
> Hm.  Should I fix it by checking for
> bdrv_cow_bs(bdrv_skip_implicit_filters())?  Or bdrv_backing_chain_next()
> and change the bdrv_skip_implicit_filters() to a bdrv_skip_filters()?  I
> feel like that would make even more sense.

I agree that bdrv_skip_filters() makes more sense. If I have a qcow2
image and an explicit throttle filter on top, there is no reason to skip
this image.

bdrv_backing_chain_next() or bdrv_cow_bs() should be the same in a
boolean context, so I'd vote for bdrv_cow_bs() because it has less work
to do to get the same result.

> > (First real bug at patch 35. I almost thought I wouldn't find any!)
> 
> :)
> 
> >>              if (ret < 0) {
> >>                  aio_context_release(aio_context);
> >>                  return ret;
> >> diff --git a/block/commit.c b/block/commit.c
> >> index 7732d02dfe..4122b6736d 100644
> >> --- a/block/commit.c
> >> +++ b/block/commit.c
> >> @@ -37,6 +37,7 @@ typedef struct CommitBlockJob {
> >>      BlockBackend *top;
> >>      BlockBackend *base;
> >>      BlockDriverState *base_bs;
> >> +    BlockDriverState *base_overlay;
> >>      BlockdevOnError on_error;
> >>      bool base_read_only;
> >>      bool chain_frozen;
> > 
> > Hm, again this mysterious base_overlay. I know that stream introduced it
> > to avoid freezing the link to base, but commit doesn't seem to do that.
> > 
> > Is it to avoid using the block status of filter drivers between
> > base_overlay and base?
> 
> Yes.
> 
> > If so, I guess that goes back to the question I
> > raised earlier in this series: What is the block status supposed to tell
> > for filter nodes?
> 
> Honestly, I would really like to get away without having to answer that
> question in this series.  Intuitively, I feel like falling through to
> the next data-bearing layer is not something most callers want.  But I’d
> rather investigate that question separately from this series (even
> though that likely means we’ll never do it), and just treat it as it is
> in this series.

Well, I'm asking the question because not having the answer makes us
jump through hoops in this series to accomodate a behaviour it probably
shouldn't even have. (Because I agree that filters should probably keep
DATA clear, i.e. they are never the layer that defines the content.)

Additional node references (i.e. references that are not edges in the
graph) always make the design more complicated and require us to
consider more things like what happens on graph changes. So it's a
question of maintainability.

> > But anyway, in contrast to mirror, commit actually freezes the chain
> > between commit_top_bs and base, so it should be safe at least.
> > 
> >> @@ -89,7 +90,7 @@ static void commit_abort(Job *job)
> >>       * XXX Can (or should) we somehow keep 'consistent read' blocked even
> >>       * after the failed/cancelled commit job is gone? If we already wrote
> >>       * something to base, the intermediate images aren't valid any more. */
> >> -    bdrv_replace_node(s->commit_top_bs, backing_bs(s->commit_top_bs),
> >> +    bdrv_replace_node(s->commit_top_bs, s->commit_top_bs->backing->bs,
> >>                        &error_abort);
> >>  
> >>      bdrv_unref(s->commit_top_bs);
> >> @@ -153,7 +154,7 @@ static int coroutine_fn commit_run(Job *job, Error **errp)
> >>              break;
> >>          }
> >>          /* Copy if allocated above the base */
> >> -        ret = bdrv_is_allocated_above(blk_bs(s->top), blk_bs(s->base), false,
> >> +        ret = bdrv_is_allocated_above(blk_bs(s->top), s->base_overlay, true,
> >>                                        offset, COMMIT_BUFFER_SIZE, &n);
> >>          copy = (ret == 1);
> >>          trace_commit_one_iteration(s, offset, n, ret);
> >> @@ -253,15 +254,35 @@ void commit_start(const char *job_id, BlockDriverState *bs,
> >>      CommitBlockJob *s;
> >>      BlockDriverState *iter;
> >>      BlockDriverState *commit_top_bs = NULL;
> >> +    BlockDriverState *filtered_base;
> >>      Error *local_err = NULL;
> >> +    int64_t base_size, top_size;
> >> +    uint64_t perms, iter_shared_perms;
> >>      int ret;
> >>  
> >>      assert(top != bs);
> >> -    if (top == base) {
> >> +    if (bdrv_skip_filters(top) == bdrv_skip_filters(base)) {
> >>          error_setg(errp, "Invalid files for merge: top and base are the same");
> >>          return;
> >>      }
> >>  
> >> +    base_size = bdrv_getlength(base);
> >> +    if (base_size < 0) {
> >> +        error_setg_errno(errp, -base_size, "Could not inquire base image size");
> >> +        return;
> >> +    }
> >> +
> >> +    top_size = bdrv_getlength(top);
> >> +    if (top_size < 0) {
> >> +        error_setg_errno(errp, -top_size, "Could not inquire top image size");
> >> +        return;
> >> +    }
> >> +
> >> +    perms = BLK_PERM_CONSISTENT_READ | BLK_PERM_WRITE;
> >> +    if (base_size < top_size) {
> >> +        perms |= BLK_PERM_RESIZE;
> >> +    }
> > 
> > base_perms would indicate which permissions these are (particularly
> > because it's not the next thing that requires permissions, but only used
> > further down the function).
> 
> %s/\<perms\>/base_perms/?  Sure.

Sorry, I admit this wasn't phrased very clearly. But yes, renaming the
variable this way is what I meant.

> >>      s = block_job_create(job_id, &commit_job_driver, NULL, bs, 0, BLK_PERM_ALL,
> >>                           speed, creation_flags, NULL, NULL, errp);
> >>      if (!s) {
> >> @@ -301,17 +322,43 @@ void commit_start(const char *job_id, BlockDriverState *bs,
> >>  
> >>      s->commit_top_bs = commit_top_bs;
> >>  
> >> -    /* Block all nodes between top and base, because they will
> >> -     * disappear from the chain after this operation. */
> >> -    assert(bdrv_chain_contains(top, base));
> >> -    for (iter = top; iter != base; iter = backing_bs(iter)) {
> >> -        /* XXX BLK_PERM_WRITE needs to be allowed so we don't block ourselves
> >> -         * at s->base (if writes are blocked for a node, they are also blocked
> >> -         * for its backing file). The other options would be a second filter
> >> -         * driver above s->base. */
> >> +    /*
> >> +     * Block all nodes between top and base, because they will
> >> +     * disappear from the chain after this operation.
> >> +     * Note that this assumes that the user is fine with removing all
> >> +     * nodes (including R/W filters) between top and base.  Assuring
> >> +     * this is the responsibility of the interface (i.e. whoever calls
> >> +     * commit_start()).
> >> +     */
> >> +    s->base_overlay = bdrv_find_overlay(top, base);
> >> +    assert(s->base_overlay);
> >> +
> >> +    /*
> >> +     * The topmost node with
> >> +     * bdrv_skip_filters(filtered_base) == bdrv_skip_filters(base)
> >> +     */
> >> +    filtered_base = bdrv_cow_bs(s->base_overlay);
> >> +    assert(bdrv_skip_filters(filtered_base) == bdrv_skip_filters(base));
> >> +
> >> +    /*
> >> +     * XXX BLK_PERM_WRITE needs to be allowed so we don't block ourselves
> >> +     * at s->base (if writes are blocked for a node, they are also blocked
> >> +     * for its backing file). The other options would be a second filter
> >> +     * driver above s->base.
> >> +     */
> >> +    iter_shared_perms = BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE;
> >> +
> >> +    for (iter = top; iter != base; iter = bdrv_filter_or_cow_bs(iter)) {
> >> +        if (iter == filtered_base) {
> >> +            /*
> >> +             * From here on, all nodes are filters on the base.  This
> >> +             * allows us to share BLK_PERM_CONSISTENT_READ.
> >> +             */
> >> +            iter_shared_perms |= BLK_PERM_CONSISTENT_READ;
> >> +        }
> >> +
> >>          ret = block_job_add_bdrv(&s->common, "intermediate node", iter, 0,
> >> -                                 BLK_PERM_WRITE_UNCHANGED | BLK_PERM_WRITE,
> >> -                                 errp);
> >> +                                 iter_shared_perms, errp);
> >>          if (ret < 0) {
> >>              goto fail;
> >>          }
> >> @@ -328,9 +375,7 @@ void commit_start(const char *job_id, BlockDriverState *bs,
> >>      }
> >>  
> >>      s->base = blk_new(s->common.job.aio_context,
> >> -                      BLK_PERM_CONSISTENT_READ
> >> -                      | BLK_PERM_WRITE
> >> -                      | BLK_PERM_RESIZE,
> >> +                      perms,
> >>                        BLK_PERM_CONSISTENT_READ
> >>                        | BLK_PERM_GRAPH_MOD
> >>                        | BLK_PERM_WRITE_UNCHANGED);
> >> @@ -398,19 +443,22 @@ int bdrv_commit(BlockDriverState *bs)
> >>      if (!drv)
> >>          return -ENOMEDIUM;
> >>  
> >> -    if (!bs->backing) {
> >> +    backing_file_bs = bdrv_cow_bs(bs);
> >> +
> >> +    if (!backing_file_bs) {
> >>          return -ENOTSUP;
> >>      }
> >>  
> >>      if (bdrv_op_is_blocked(bs, BLOCK_OP_TYPE_COMMIT_SOURCE, NULL) ||
> >> -        bdrv_op_is_blocked(bs->backing->bs, BLOCK_OP_TYPE_COMMIT_TARGET, NULL)) {
> >> +        bdrv_op_is_blocked(backing_file_bs, BLOCK_OP_TYPE_COMMIT_TARGET, NULL))
> >> +    {
> >>          return -EBUSY;
> >>      }
> >>  
> >> -    ro = bs->backing->bs->read_only;
> >> +    ro = backing_file_bs->read_only;
> >>  
> >>      if (ro) {
> >> -        if (bdrv_reopen_set_read_only(bs->backing->bs, false, NULL)) {
> >> +        if (bdrv_reopen_set_read_only(backing_file_bs, false, NULL)) {
> >>              return -EACCES;
> >>          }
> >>      }
> >> @@ -428,8 +476,6 @@ int bdrv_commit(BlockDriverState *bs)
> >>      }
> >>  
> >>      /* Insert commit_top block node above backing, so we can write to it */
> >> -    backing_file_bs = backing_bs(bs);
> >> -
> >>      commit_top_bs = bdrv_new_open_driver(&bdrv_commit_top, NULL, BDRV_O_RDWR,
> >>                                           &local_err);
> >>      if (commit_top_bs == NULL) {
> >> @@ -515,15 +561,13 @@ ro_cleanup:
> >>      qemu_vfree(buf);
> >>  
> >>      blk_unref(backing);
> >> -    if (backing_file_bs) {
> >> -        bdrv_set_backing_hd(bs, backing_file_bs, &error_abort);
> >> -    }
> >> +    bdrv_set_backing_hd(bs, backing_file_bs, &error_abort);
> > 
> > This means that bdrv_set_backing_hd() is now called to undo a change
> > that hasn't even been made yet. This fails (with &error_abort) if the
> > backing chain is frozen.
> > 
> > On the other hand, the other bdrv_set_backing_hd() calls in the same
> > function would fail the same way.
> 
> True. :)
> 
> Still, maybe there’s an op blocker from a concurrent job, so we go to
> the failure path and then we’d abort here.  So better to guard it by
> checking whether bdrv_cow_bs(bs) != backing_file_bs.

Certainly can't hurt.

Kevin

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

  reply	other threads:[~2020-08-20 13:48 UTC|newest]

Thread overview: 173+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-25 15:21 [PATCH v7 00/47] block: Deal with filters Max Reitz
2020-06-25 15:21 ` [PATCH v7 01/47] block: Add child access functions Max Reitz
2020-07-08 17:22   ` Andrey Shinkevich
2020-07-13  9:06   ` Vladimir Sementsov-Ogievskiy
2020-07-16 14:46     ` Max Reitz
2020-07-28 16:09     ` Christophe de Dinechin
2020-08-07  9:33       ` Vladimir Sementsov-Ogievskiy
2020-07-13  9:57   ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 02/47] block: Add chain helper functions Max Reitz
2020-07-08 17:20   ` Andrey Shinkevich
2020-07-09  8:24     ` Max Reitz
2020-07-09  9:07       ` Andrey Shinkevich
2020-07-13 10:18   ` Vladimir Sementsov-Ogievskiy
2020-07-16 14:50     ` Max Reitz
2020-07-16 15:24       ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 03/47] block: bdrv_cow_child() for bdrv_has_zero_init() Max Reitz
2020-07-08 17:23   ` Andrey Shinkevich
2020-08-07  9:37   ` Vladimir Sementsov-Ogievskiy
2020-06-25 15:21 ` [PATCH v7 04/47] block: bdrv_set_backing_hd() is about bs->backing Max Reitz
2020-07-08 17:24   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 05/47] block: Include filters when freezing backing chain Max Reitz
2020-07-08 17:25   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 06/47] block: Drop bdrv_is_encrypted() Max Reitz
2020-07-08 17:41   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 07/47] block: Add bdrv_supports_compressed_writes() Max Reitz
2020-07-08 17:48   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 08/47] throttle: Support compressed writes Max Reitz
2020-07-08 17:52   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 09/47] copy-on-read: " Max Reitz
2020-07-08 17:54   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 10/47] mirror-top: " Max Reitz
2020-07-08 17:58   ` Andrey Shinkevich
2020-08-18 10:27   ` Kevin Wolf
2020-08-19 15:35     ` Max Reitz
2020-08-19 16:00       ` Kevin Wolf
2020-06-25 15:21 ` [PATCH v7 11/47] backup-top: " Max Reitz
2020-07-08 17:59   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 12/47] block: Use bdrv_filter_(bs|child) where obvious Max Reitz
2020-07-08 18:24   ` Andrey Shinkevich
2020-07-09  8:59     ` Max Reitz
2020-07-09  9:11       ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 13/47] block: Use CAFs in block status functions Max Reitz
2020-07-08 19:13   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 14/47] stream: Deal with filters Max Reitz
2020-07-09 14:52   ` Andrey Shinkevich
2020-07-09 15:27     ` Andrey Shinkevich
2020-07-10 15:24     ` Max Reitz
2020-07-10 17:41       ` Andrey Shinkevich
2020-07-16 14:59         ` Max Reitz
2020-08-07 10:29           ` Vladimir Sementsov-Ogievskiy
2020-08-10  8:12             ` Max Reitz
2020-08-10 11:04               ` Vladimir Sementsov-Ogievskiy
2020-08-14 15:18                 ` Andrey Shinkevich
2020-08-18 20:45                 ` Andrey Shinkevich
2020-08-19 12:39                 ` Max Reitz
2020-08-19 13:18                   ` Vladimir Sementsov-Ogievskiy
2020-07-09 15:13   ` Andrey Shinkevich
2020-07-10 15:27     ` Max Reitz
2020-08-18 14:28   ` Kevin Wolf
2020-08-19 14:47     ` Max Reitz
2020-08-19 15:16       ` Kevin Wolf
2020-08-20  8:31         ` Max Reitz
2020-08-20  9:22           ` Max Reitz
2020-08-20 10:49             ` Vladimir Sementsov-Ogievskiy
2020-08-20 11:43               ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 15/47] block: Use CAFs when working with backing chains Max Reitz
2020-07-10 15:28   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 16/47] block: Use bdrv_cow_child() in bdrv_co_truncate() Max Reitz
2020-07-10 15:54   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 17/47] block: Re-evaluate backing file handling in reopen Max Reitz
2020-07-10 19:42   ` Andrey Shinkevich
2020-07-16 15:04     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 18/47] block: Flush all children in generic code Max Reitz
2020-07-14 12:52   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 19/47] vmdk: Drop vmdk_co_flush() Max Reitz
2020-07-14 14:52   ` Andrey Shinkevich
2020-07-16 15:08     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 20/47] block: Iterate over children in refresh_limits Max Reitz
2020-07-14 18:37   ` Andrey Shinkevich
2020-07-16 15:14     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 21/47] block: Use CAFs in bdrv_refresh_filename() Max Reitz
2020-07-15 12:52   ` Andrey Shinkevich
2020-07-15 12:58     ` Andrey Shinkevich
2020-07-16 15:21     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 22/47] block: Use CAF in bdrv_co_rw_vmstate() Max Reitz
2020-07-15 13:39   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 23/47] block/snapshot: Fix fallback Max Reitz
2020-07-15 21:22   ` Andrey Shinkevich
2020-07-15 22:18     ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 24/47] block: Use CAFs for debug breakpoints Max Reitz
2020-07-15 21:43   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 25/47] block: Def. impl.s for get_allocated_file_size Max Reitz
2020-07-15 22:56   ` Andrey Shinkevich
2020-08-19 10:57   ` Kevin Wolf
2020-08-19 15:53     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 26/47] block: Improve get_allocated_file_size's default Max Reitz
2020-07-20 15:12   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 27/47] blkverify: Use bdrv_sum_allocated_file_size() Max Reitz
2020-07-20 15:10   ` Andrey Shinkevich
2020-08-19 10:46   ` Kevin Wolf
2020-08-19 15:50     ` Max Reitz
2020-06-25 15:21 ` [PATCH v7 28/47] block/null: Implement bdrv_get_allocated_file_size Max Reitz
2020-07-20 15:10   ` Andrey Shinkevich
2020-07-24  8:58     ` Max Reitz
2020-07-24  9:49       ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 29/47] blockdev: Use CAF in external_snapshot_prepare() Max Reitz
2020-07-20 16:08   ` Andrey Shinkevich
2020-07-24  9:23     ` Max Reitz
2020-07-24 10:37       ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 30/47] block: Report data child for query-blockstats Max Reitz
2020-07-21 11:48   ` Andrey Shinkevich
2020-06-25 15:21 ` [PATCH v7 31/47] block: Use child access functions for QAPI queries Max Reitz
2020-07-21 12:30   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 32/47] block-copy: Use CAF to find sync=top base Max Reitz
2020-07-21 12:42   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 33/47] mirror: Deal with filters Max Reitz
2020-07-22 18:31   ` Andrey Shinkevich
2020-07-24  9:49     ` Max Reitz
2020-07-24 10:27       ` Andrey Shinkevich
2020-08-19 16:50   ` Kevin Wolf
2020-08-20 10:28     ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 34/47] backup: " Max Reitz
2020-07-23 15:51   ` Andrey Shinkevich
2020-07-24  9:55     ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 35/47] commit: " Max Reitz
2020-07-23 17:15   ` Andrey Shinkevich
2020-07-24 10:36     ` Andrey Shinkevich
2020-08-19 17:58   ` Kevin Wolf
2020-08-20 11:27     ` Max Reitz
2020-08-20 13:47       ` Kevin Wolf [this message]
2020-06-25 15:22 ` [PATCH v7 36/47] nbd: Use CAF when looking for dirty bitmap Max Reitz
2020-07-23 17:21   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 37/47] qemu-img: Use child access functions Max Reitz
2020-07-24 15:51   ` Andrey Shinkevich
2020-08-21 15:29   ` Kevin Wolf
2020-08-24 12:42     ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 38/47] block: Drop backing_bs() Max Reitz
2020-07-24 15:55   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 39/47] blockdev: Fix active commit choice Max Reitz
2020-08-21 15:50   ` Kevin Wolf
2020-08-24 13:18     ` Max Reitz
2020-08-24 14:07       ` Kevin Wolf
2020-08-24 14:41         ` Max Reitz
2020-08-24 15:06           ` Kevin Wolf
2020-06-25 15:22 ` [PATCH v7 40/47] block: Inline bdrv_co_block_status_from_*() Max Reitz
2020-07-24 18:00   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 41/47] block: Leave BDS.backing_file constant Max Reitz
2020-07-27 12:27   ` Andrey Shinkevich
2020-07-28 14:10     ` Max Reitz
2020-08-24 13:14   ` Kevin Wolf
2020-08-24 14:29     ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 42/47] iotests: Test that qcow2's data-file is flushed Max Reitz
2020-07-27 13:28   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 43/47] iotests: Let complete_and_wait() work with commit Max Reitz
2020-07-27 13:35   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 44/47] iotests: Add filter commit test cases Max Reitz
2020-07-27 17:45   ` Andrey Shinkevich
2020-07-28 14:00     ` Max Reitz
2020-06-25 15:22 ` [PATCH v7 45/47] iotests: Add filter mirror " Max Reitz
2020-08-02 11:05   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 46/47] iotests: Add test for commit in sub directory Max Reitz
2020-08-02 12:13   ` Andrey Shinkevich
2020-06-25 15:22 ` [PATCH v7 47/47] iotests: Test committing to overridden backing Max Reitz
2020-08-02 11:43   ` Andrey Shinkevich
2020-07-08 17:20 ` [PATCH v7 00/47] block: Deal with filters Andrey Shinkevich
2020-07-08 17:32   ` Eric Blake
2020-07-08 19:46     ` Andrey Shinkevich
2020-07-08 20:37       ` Eric Blake
2020-07-09  8:19         ` Max Reitz
2020-07-08 20:47   ` Eric Blake
2020-07-09  8:20     ` Max Reitz
2020-07-09  9:04       ` Andrey Shinkevich
2020-08-24 15:15 ` Kevin Wolf

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=20200820134745.GE99531@linux.fritz.box \
    --to=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=vsementsov@virtuozzo.com \
    /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).