diff mbox

block: bdrv_append() fixes

Message ID 888ccd7cf8f0c8ad69a34fb28785744abe85df8f.1332880179.git.jcody@redhat.com
State New
Headers show

Commit Message

Jeff Cody March 27, 2012, 8:30 p.m. UTC
A few fixups for bdrv_append():

The new bs (bs_new) passed into bdrv_append() should be anonymous.  Rather
than call bdrv_make_anon() to enforce this, use an assert to catch when a caller
is passing in a bs_new that is not anonymous.

Also, the new top layer should have its backing_format reflect the original
top's format.

And last, after the swap of bs contents, the device_name will have been copied
down. This needs to be cleared to reflect the anonymity of the bs that was
pushed down.

Signed-off-by: Jeff Cody <jcody@redhat.com>
---
 block.c |   13 +++++++++++--
 1 files changed, 11 insertions(+), 2 deletions(-)

Comments

Kevin Wolf April 3, 2012, 11:24 a.m. UTC | #1
Am 27.03.2012 22:30, schrieb Jeff Cody:
> A few fixups for bdrv_append():
> 
> The new bs (bs_new) passed into bdrv_append() should be anonymous.  Rather
> than call bdrv_make_anon() to enforce this, use an assert to catch when a caller
> is passing in a bs_new that is not anonymous.
> 
> Also, the new top layer should have its backing_format reflect the original
> top's format.
> 
> And last, after the swap of bs contents, the device_name will have been copied
> down. This needs to be cleared to reflect the anonymity of the bs that was
> pushed down.
> 
> Signed-off-by: Jeff Cody <jcody@redhat.com>

Thanks, applied to the block branch.

Kevin
diff mbox

Patch

diff --git a/block.c b/block.c
index b88ee90..c971e28 100644
--- a/block.c
+++ b/block.c
@@ -889,14 +889,16 @@  void bdrv_make_anon(BlockDriverState *bs)
  * This will modify the BlockDriverState fields, and swap contents
  * between bs_new and bs_top. Both bs_new and bs_top are modified.
  *
+ * bs_new is required to be anonymous.
+ *
  * This function does not create any image files.
  */
 void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
 {
     BlockDriverState tmp;
 
-    /* the new bs must not be in bdrv_states */
-    bdrv_make_anon(bs_new);
+    /* bs_new must be anonymous */
+    assert(bs_new->device_name[0] == '\0');
 
     tmp = *bs_new;
 
@@ -941,11 +943,18 @@  void bdrv_append(BlockDriverState *bs_new, BlockDriverState *bs_top)
      * swapping bs_new and bs_top contents. */
     tmp.backing_hd = bs_new;
     pstrcpy(tmp.backing_file, sizeof(tmp.backing_file), bs_top->filename);
+    bdrv_get_format(bs_top, tmp.backing_format, sizeof(tmp.backing_format));
 
     /* swap contents of the fixed new bs and the current top */
     *bs_new = *bs_top;
     *bs_top = tmp;
 
+    /* device_name[] was carried over from the old bs_top.  bs_new
+     * shouldn't be in bdrv_states, so we need to make device_name[]
+     * reflect the anonymity of bs_new
+     */
+    bs_new->device_name[0] = '\0';
+
     /* clear the copied fields in the new backing file */
     bdrv_detach_dev(bs_new, bs_new->dev);