diff options
author | Max Reitz <mreitz@redhat.com> | 2013-11-25 20:28:55 +0100 |
---|---|---|
committer | Anthony Liguori <aliguori@amazon.com> | 2013-11-27 07:53:32 -0800 |
commit | 117e0c82881f05d88902d4059a3171bc6cd02df0 (patch) | |
tree | 8551830fe05d70186c5aa81b12073901a77b86d5 | |
parent | 7457fe9541b5162f285454947448d553a5d5a531 (diff) |
block/drive-mirror: Reuse backing HD for sync=none
For "none" sync mode in "absolute-paths" mode, the current image should
be used as the backing file for the newly created image.
The current behavior is:
a) If the image to be mirrored has a backing file, use that (which is
wrong, since the operations recorded by "none" are applied to the
image itself, not to its backing file).
b) If the image to be mirrored lacks a backing file, the target doesn't
have one either (which is not really wrong, but not really right,
either; "none" records a set of operations executed on the image
file, therefore having no backing file to apply these operations on
seems rather pointless).
For a, this is clearly a bugfix. For b, it is still a bugfix, although
it might break existing API - but since that case crashed qemu just
three weeks ago (before 1452686495922b81d6cf43edf025c1aef15965c0), we
can safely assume there is no such API relying on that case yet.
Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-id: 1385407736-13941-2-git-send-email-mreitz@redhat.com
Signed-off-by: Anthony Liguori <aliguori@amazon.com>
-rw-r--r-- | blockdev.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/blockdev.c b/blockdev.c index 330aa4a3a4..44755e1a5d 100644 --- a/blockdev.c +++ b/blockdev.c @@ -2021,6 +2021,9 @@ void qmp_drive_mirror(const char *device, const char *target, if (!source && sync == MIRROR_SYNC_MODE_TOP) { sync = MIRROR_SYNC_MODE_FULL; } + if (sync == MIRROR_SYNC_MODE_NONE) { + source = bs; + } size = bdrv_getlength(bs); if (size < 0) { |