From: Kevin Wolf <kwolf@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: berto@igalia.com, qemu-block@nongnu.org, jcody@redhat.com,
qemu-devel@nongnu.org, armbru@redhat.com, stefanha@redhat.com
Subject: Re: [Qemu-devel] [PATCH 15/16] block: Add and use bdrv_replace_in_backing_chain()
Date: Tue, 29 Sep 2015 17:22:35 +0200 [thread overview]
Message-ID: <20150929152235.GL3930@noname.str.redhat.com> (raw)
In-Reply-To: <5602DC99.5040204@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 3709 bytes --]
Am 23.09.2015 um 19:08 hat Max Reitz geschrieben:
> On 17.09.2015 15:48, Kevin Wolf wrote:
> > This cleans up the mess we left behind in the mirror code after the
> > previous patch. Instead of using bdrv_swap(), just change pointers.
> >
> > The interface change of the mirror job that callers must consider is
> > that after job completion, their local BDS pointers still point to the
> > same node now. qemu-img must change its code accordingly (which makes it
> > easier to understand); the other callers stays unchanged because after
> > completion they don't do anything with the BDS, but just with the job,
> > and the job is still owned by the source BDS.
> >
> > Signed-off-by: Kevin Wolf <kwolf@redhat.com>
> > ---
> > block.c | 32 +++++++++++++++++++++++++++++++-
> > block/mirror.c | 23 +++++++----------------
> > include/block/block.h | 4 +++-
> > qemu-img.c | 16 ++++++++--------
> > 4 files changed, 49 insertions(+), 26 deletions(-)
> >
> > diff --git a/block.c b/block.c
> > index 98fc17c..7c21659 100644
> > --- a/block.c
> > +++ b/block.c
> > @@ -1095,7 +1095,7 @@ static BdrvChild *bdrv_attach_child(BlockDriverState *parent_bs,
> > return child;
> > }
> >
> > -void bdrv_detach_child(BdrvChild *child)
> > +static void bdrv_detach_child(BdrvChild *child)
> > {
> > QLIST_REMOVE(child, next);
> > QLIST_REMOVE(child, next_parent);
> > @@ -2228,6 +2228,36 @@ void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
> > bdrv_unref(bs_new);
> > }
> >
> > +void bdrv_replace_in_backing_chain(BlockDriverState *old, BlockDriverState *new)
> > +{
> > + assert(!bdrv_requests_pending(old));
> > + assert(!bdrv_requests_pending(new));
> > +
> > + bdrv_ref(old);
> > +
> > + if (old->blk) {
> > + /* As long as these fields aren't in BlockBackend, but in the top-level
> > + * BlockDriverState, it's not possible for a BDS to have two BBs.
> > + *
> > + * We really want to copy the fields from old to new, but we go for a
> > + * swap instead so that pointers aren't duplicated and cause trouble.
> > + * (Also, bdrv_swap() used to do the same.) */
> > + assert(!new->blk);
> > + swap_feature_fields(old, new);
> > + }
> > + change_parent_backing_link(old, new);
> > +
> > + /* Change backing files if a previously independent node is added to the
> > + * chain. For active commit, we replace top by its own (indirect) backing
> > + * file and don't do anything here so we don't build a loop. */
> > + if (new->backing == NULL && !bdrv_chain_contains(backing_bs(old), new)) {
> > + bdrv_set_backing_hd(new, backing_bs(old));
> > + bdrv_set_backing_hd(old, NULL);
>
> Wouldn't we want @old to keep its backing file?
Would we? The operation I had in mind was: Given a backing file chain,
one node in that chain and an independent node, replace the node in the
chain. That is:
A <- B <- C <- D
X
becomes
A <- X <- C <- D
B
Of course, you could define a different operation, but this seemed to be
the obvious one that the mirror completion needs.
> Then bdrv_append() would basically be a special case of this function,
> with it additionally decrementing the refcount of @bs_new.
Hm, less duplication sounds nice, but as long as the current way is
technically correct, can we leave this for a cleanup on top?
Kevin
> Max
>
> > + }
> > +
> > + bdrv_unref(old);
> > +}
> > +
> > static void bdrv_delete(BlockDriverState *bs)
> > {
> > assert(!bs->job);
>
[-- Attachment #2: Type: application/pgp-signature, Size: 836 bytes --]
next prev parent reply other threads:[~2015-09-29 15:23 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-09-17 13:48 [Qemu-devel] [PATCH 00/16] block: Get rid of bdrv_swap() Kevin Wolf
2015-09-17 13:48 ` [Qemu-devel] [PATCH 01/16] block: Introduce BDS.file_child Kevin Wolf
2015-09-22 17:14 ` Max Reitz
2015-09-22 17:17 ` Max Reitz
2015-09-23 14:26 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 02/16] vmdk: Use BdrvChild instead of BDS for references to extents Kevin Wolf
2015-09-22 17:45 ` Max Reitz
2015-09-23 13:23 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 03/16] blkverify: Convert s->test_file to BdrvChild Kevin Wolf
2015-09-22 17:51 ` Max Reitz
2015-09-23 13:01 ` Alberto Garcia
2015-09-23 13:58 ` Kevin Wolf
2015-09-23 14:05 ` Alberto Garcia
2015-09-23 14:11 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 04/16] quorum: Convert " Kevin Wolf
2015-09-22 17:57 ` Max Reitz
2015-09-23 12:48 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 05/16] block: Convert bs->file " Kevin Wolf
2015-09-22 18:36 ` Max Reitz
2015-09-23 13:13 ` Kevin Wolf
2015-09-23 14:54 ` Alberto Garcia
2015-09-25 14:09 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 06/16] block: Remove bdrv_open_image() Kevin Wolf
2015-09-22 18:38 ` Max Reitz
2015-09-23 13:10 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 07/16] block: Convert bs->backing_hd to BdrvChild Kevin Wolf
2015-09-22 19:21 ` Max Reitz
2015-09-17 13:48 ` [Qemu-devel] [PATCH 08/16] block: Manage backing file references in bdrv_set_backing_hd() Kevin Wolf
2015-09-23 15:22 ` Max Reitz
2015-09-28 12:29 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 09/16] block: Split bdrv_move_feature_fields() Kevin Wolf
2015-09-23 16:36 ` Max Reitz
2015-09-29 13:37 ` Kevin Wolf
2015-09-30 14:51 ` Max Reitz
2015-09-17 13:48 ` [Qemu-devel] [PATCH 10/16] block/io: Make bdrv_requests_pending() public Kevin Wolf
2015-09-23 15:40 ` Max Reitz
2015-09-29 12:29 ` Kevin Wolf
2015-09-28 12:32 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 11/16] block-backend: Add blk_set_bs() Kevin Wolf
2015-09-23 15:46 ` Max Reitz
2015-09-23 15:51 ` Kevin Wolf
2015-09-17 13:48 ` [Qemu-devel] [PATCH 12/16] block: Introduce parents list Kevin Wolf
2015-09-23 16:39 ` Max Reitz
2015-09-28 13:09 ` Alberto Garcia
2015-09-29 12:21 ` Kevin Wolf
2015-09-29 14:00 ` Alberto Garcia
2015-09-17 13:48 ` [Qemu-devel] [PATCH 13/16] block: Implement bdrv_append() without bdrv_swap() Kevin Wolf
2015-09-18 11:45 ` Alberto Garcia
2015-09-18 12:24 ` Kevin Wolf
2015-09-18 13:31 ` Alberto Garcia
2015-09-18 14:23 ` Kevin Wolf
2015-09-23 16:36 ` Max Reitz
2015-09-29 13:51 ` Kevin Wolf
2015-09-30 14:45 ` Max Reitz
2015-09-30 15:33 ` Kevin Wolf
2015-09-17 13:48 ` [Qemu-devel] [PATCH 14/16] blockjob: Store device name at job creation Kevin Wolf
2015-09-23 16:46 ` Max Reitz
2015-09-17 13:48 ` [Qemu-devel] [PATCH 15/16] block: Add and use bdrv_replace_in_backing_chain() Kevin Wolf
2015-09-23 17:08 ` Max Reitz
2015-09-29 15:22 ` Kevin Wolf [this message]
2015-09-30 14:50 ` Max Reitz
2015-09-30 14:50 ` Max Reitz
2015-09-17 13:48 ` [Qemu-devel] [PATCH 16/16] block: Remove bdrv_swap() Kevin Wolf
2015-09-23 17:09 ` Max Reitz
2015-09-28 13:24 ` Alberto Garcia
2015-09-18 11:03 ` [Qemu-devel] [PATCH 00/16] block: Get rid of bdrv_swap() Alberto Garcia
2015-09-22 10:07 ` Kevin Wolf
2015-09-24 18:32 ` Alberto Garcia
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=20150929152235.GL3930@noname.str.redhat.com \
--to=kwolf@redhat.com \
--cc=armbru@redhat.com \
--cc=berto@igalia.com \
--cc=jcody@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.