qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: kwolf@redhat.com
Subject: [Qemu-devel] [PULL 07/19] block: make bdrv_swap rebuild the bs graph node list field.
Date: Fri,  7 Mar 2014 14:32:55 +0100	[thread overview]
Message-ID: <1394199187-9576-8-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1394199187-9576-1-git-send-email-kwolf@redhat.com>

From: Benoît Canet <benoit.canet@irqsave.net>

Moving only the node_name one field could lead to some inconsitencies where a
node_name was defined on a bs which was not registered in the graph node list.

bdrv_swap between a named node bs and a non named node bs would lead to this.

bdrv_make_anon would then crash because it would try to remove the bs from the
graph node list while it is not in it.

This patch remove named node bses from the graph node list before doing the swap
then insert them back.

Signed-off-by: Benoit Canet <benoit@irqsave.net>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
 block.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/block.c b/block.c
index f01b91c..7330a87 100644
--- a/block.c
+++ b/block.c
@@ -1847,11 +1847,6 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
     pstrcpy(bs_dest->device_name, sizeof(bs_dest->device_name),
             bs_src->device_name);
     bs_dest->device_list = bs_src->device_list;
-
-    /* keep the same entry in graph_bdrv_states
-     * We do want to swap name but don't want to swap linked list entries
-     */
-    bs_dest->node_list   = bs_src->node_list;
 }
 
 /*
@@ -1870,6 +1865,17 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
 {
     BlockDriverState tmp;
 
+    /* The code needs to swap the node_name but simply swapping node_list won't
+     * work so first remove the nodes from the graph list, do the swap then
+     * insert them back if needed.
+     */
+    if (bs_new->node_name[0] != '\0') {
+        QTAILQ_REMOVE(&graph_bdrv_states, bs_new, node_list);
+    }
+    if (bs_old->node_name[0] != '\0') {
+        QTAILQ_REMOVE(&graph_bdrv_states, bs_old, node_list);
+    }
+
     /* bs_new must be anonymous and shouldn't have anything fancy enabled */
     assert(bs_new->device_name[0] == '\0');
     assert(QLIST_EMPTY(&bs_new->dirty_bitmaps));
@@ -1898,6 +1904,14 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
     assert(bs_new->io_limits_enabled == false);
     assert(!throttle_have_timer(&bs_new->throttle_state));
 
+    /* insert the nodes back into the graph node list if needed */
+    if (bs_new->node_name[0] != '\0') {
+        QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_new, node_list);
+    }
+    if (bs_old->node_name[0] != '\0') {
+        QTAILQ_INSERT_TAIL(&graph_bdrv_states, bs_old, node_list);
+    }
+
     bdrv_rebind(bs_new);
     bdrv_rebind(bs_old);
 }
-- 
1.8.1.4

  parent reply	other threads:[~2014-03-07 13:33 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-07 13:32 [Qemu-devel] [PULL 00/19] Block patches Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 01/19] gluster: Change licence to GPLv2+ Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 02/19] gluster: Remove unused defines and header include Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 03/19] qemu-img convert: Fix progress output Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 04/19] qemu-iotests: Test progress output for conversion Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 05/19] iscsi: Use bs->sg for everything else than disks Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 06/19] block: Fix bs->request_alignment assertion for bs->sg=1 Kevin Wolf
2014-03-07 13:32 ` Kevin Wolf [this message]
2014-03-07 13:32 ` [Qemu-devel] [PULL 08/19] block: mirror - remove code cruft that has no function Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 09/19] block: Keep "filename" option after parsing Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 10/19] block/raw-posix: Implement bdrv_parse_filename() Kevin Wolf
2014-03-07 13:32 ` [Qemu-devel] [PULL 11/19] block/raw-posix: Strip "file:" prefix on creation Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 12/19] block/raw-win32: Implement bdrv_parse_filename() Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 13/19] block/raw-win32: Strip "file:" prefix on creation Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 14/19] blockdev: Fail blockdev-add with encrypted images Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 15/19] blockdev: Fix NULL pointer dereference in blockdev-add Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 16/19] qemu-iotests: Test a few blockdev-add error cases Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 17/19] block: Fix error path segfault in bdrv_open() Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 18/19] hw/ide/ahci.h: Avoid shifting left into sign bit Kevin Wolf
2014-03-07 13:33 ` [Qemu-devel] [PULL 19/19] block: qemu-iotests 085 - live snapshots tests Kevin Wolf
2014-03-08 12:40 ` [Qemu-devel] [PULL 00/19] Block patches Peter Maydell

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=1394199187-9576-8-git-send-email-kwolf@redhat.com \
    --to=kwolf@redhat.com \
    --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).