]> Git Repo - qemu.git/commitdiff
block: Split bdrv_move_feature_fields()
authorKevin Wolf <[email protected]>
Thu, 17 Sep 2015 10:33:26 +0000 (12:33 +0200)
committerKevin Wolf <[email protected]>
Fri, 16 Oct 2015 13:34:29 +0000 (15:34 +0200)
After bdrv_swap(), some fields must be moved back to their original BDS
to compensate for the effects that a swap of the contents of the objects
has while keeping the old addresses. Other fields must be moved back
because they should logically be moved and must stay on top

When replacing bdrv_swap() with operations changing the pointers in the
parents, we only need the latter and must avoid swapping the former.
Split the function accordingly.

Signed-off-by: Kevin Wolf <[email protected]>
Reviewed-by: Max Reitz <[email protected]>
Reviewed-by: Fam Zheng <[email protected]>
Reviewed-by: Alberto Garcia <[email protected]>
Reviewed-by: Stefan Hajnoczi <[email protected]>
block.c

diff --git a/block.c b/block.c
index a9c7ea600cfd80fda57f04eb5c249db746dfc2f5..a2d6238b82de3226dde35c2484e601af88878a62 100644 (file)
--- a/block.c
+++ b/block.c
@@ -1985,6 +1985,8 @@ static void bdrv_rebind(BlockDriverState *bs)
     }
 }
 
+/* Fields that need to stay with the top-level BDS, no matter whether the
+ * address of the top-level BDS stays the same or not. */
 static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
                                      BlockDriverState *bs_src)
 {
@@ -2020,7 +2022,13 @@ static void bdrv_move_feature_fields(BlockDriverState *bs_dest,
 
     /* dirty bitmap */
     bs_dest->dirty_bitmaps      = bs_src->dirty_bitmaps;
+}
 
+/* Fields that only need to be swapped if the contents of BDSes is swapped
+ * rather than pointers being changed in the parents. */
+static void bdrv_move_reference_fields(BlockDriverState *bs_dest,
+                                       BlockDriverState *bs_src)
+{
     /* reference count */
     bs_dest->refcnt             = bs_src->refcnt;
 
@@ -2091,6 +2099,10 @@ void bdrv_swap(BlockDriverState *bs_new, BlockDriverState *bs_old)
     bdrv_move_feature_fields(bs_old, bs_new);
     bdrv_move_feature_fields(bs_new, &tmp);
 
+    bdrv_move_reference_fields(&tmp, bs_old);
+    bdrv_move_reference_fields(bs_old, bs_new);
+    bdrv_move_reference_fields(bs_new, &tmp);
+
     /* bs_new must remain unattached */
     assert(!bs_new->blk);
 
This page took 0.033748 seconds and 4 git commands to generate.