From: Jeff Cody <jcody@redhat.com>
To: Max Reitz <mreitz@redhat.com>
Cc: kwolf@redhat.com, qemu-devel@nongnu.org, qemu-block@nongnu.org,
qemu-stable@nongnu.org
Subject: Re: [Qemu-devel] [Qemu-block] [PATCH 1/2] block: change parent backing link when *tqe_prev == NULL
Date: Mon, 1 Feb 2016 20:29:49 -0500 [thread overview]
Message-ID: <20160202012949.GA5658@localhost.localdomain> (raw)
In-Reply-To: <56AFD166.9000904@redhat.com>
On Mon, Feb 01, 2016 at 10:43:02PM +0100, Max Reitz wrote:
> On 30.01.2016 06:17, Jeff Cody wrote:
> > In change_parent_backing_link(), we only inserted the new
> > BlockDriverState entry into the device_list if the tqe_prev pointer was
> > NULL. However, we must also allow insertion when the BDS pointed
> > to by the tqe_prev pointer is NULL as well.
> >
> > This fixes a bug with external snapshots, and live active layer commits.
> >
> > After a live snapshot occurs, the active layer and the base layer both
> > have a non-NULL tqe_prev field in the device_list, although the base
> > node's tqe_prev field points to a NULL entry.
> >
> > Once the active commit is finished, bdrv_replace_in_backing_chain() is
> > called to set the base node as the new active node, and remove the
> > node that was the prior active layer from the device_list.
> >
> > If we only check against the tqe_prev pointer field and not the entity
> > it is pointing to, then we fail to insert base image into the device
> > list. The previous active layer is still removed from the device_list,
> > leaving an empty device_list queue.
> >
> > With an empty device_list queue, odd behavior occurs - such as not
> > allowing any more live snapshots.
> >
> > This commit fixes this issue, by checking for a NULL tqe_prev entity
> > in the devices_list.
> >
> > Signed-off-by: Jeff Cody <jcody@redhat.com>
> > ---
> > block.c | 2 +-
> > 1 file changed, 1 insertion(+), 1 deletion(-)
> >
> > diff --git a/block.c b/block.c
> > index 5709d3d..0b8526b 100644
> > --- a/block.c
> > +++ b/block.c
> > @@ -2272,7 +2272,7 @@ static void change_parent_backing_link(BlockDriverState *from,
> > }
> > if (from->blk) {
> > blk_set_bs(from->blk, to);
> > - if (!to->device_list.tqe_prev) {
> > + if (!to->device_list.tqe_prev || !*to->device_list.tqe_prev) {
>
> I'm not sure this is the right fix; bdrv_make_anon() clearly states that
> we do want device_list.tqe_prev to be NULL if and only if the BDS is not
> part of the device list. So this should not be happening.
>
Good point. This also screams for a helper function to remove a BDS
from the device_list, to enforce this behavior (we remove a BDS from
the device_list is 3 spots, and this time it was missed in one of
them). Hopefully that will help prevent future errors.
> > QTAILQ_INSERT_BEFORE(from, to, device_list);
> > }
> > QTAILQ_REMOVE(&bdrv_states, from, device_list);
>
> Inserting a from->device_list.tqe_prev = NULL; here makes the iotest
> happy and looks like the better fix to me.
>
> Max
>
Thanks!
-Jeff
next prev parent reply other threads:[~2016-02-02 1:29 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-01-30 5:17 [Qemu-devel] [PATCH 0/2] Active commit regression fix Jeff Cody
2016-01-30 5:17 ` [Qemu-devel] [PATCH 1/2] block: change parent backing link when *tqe_prev == NULL Jeff Cody
2016-02-01 21:43 ` [Qemu-devel] [Qemu-block] " Max Reitz
2016-02-02 1:29 ` Jeff Cody [this message]
2016-01-30 5:17 ` [Qemu-devel] [PATCH 2/2] block: qemu-iotests - add test for snapshot, commit, snapshot bug Jeff Cody
2016-02-01 20:35 ` [Qemu-devel] [PATCH 0/2] Active commit regression fix Eric Blake
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=20160202012949.GA5658@localhost.localdomain \
--to=jcody@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-stable@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 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.