[libvirt] [PATCHv2] snapshot: detect when qemu lacks disk-snapshot support

Dave Allan dallan at redhat.com
Tue Oct 18 23:31:57 UTC 2011


On Tue, Oct 18, 2011 at 04:04:57PM -0600, Eric Blake wrote:
> Noticed when testing new libvirt against old qemu that lacked the
> snapshot_blkdev HMP command.  Libvirt was mistakenly treating the
> command as successful, and re-writing the domain XML to use the
> just-created 0-byte file, rendering the domain broken on restart.
> 
> * src/qemu/qemu_monitor_text.c (qemuMonitorTextDiskSnapshot):
> Notice another possible error message.
> * src/qemu/qemu_driver.c
> (qemuDomainSnapshotCreateSingleDiskActive): Don't keep 0-byte file
> on failure.
> ---
> 
> v2: clean up on failure
> 
>  src/qemu/qemu_driver.c       |    2 +-
>  src/qemu/qemu_monitor_text.c |    3 ++-
>  2 files changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index f833655..84ef4dd 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -9027,7 +9027,6 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>              VIR_WARN("Unable to release lock on %s", source);
>          goto cleanup;
>      }
> -    need_unlink = false;
> 
>      disk->src = origsrc;
>      origsrc = NULL;
> @@ -9041,6 +9040,7 @@ qemuDomainSnapshotCreateSingleDiskActive(struct qemud_driver *driver,
>          goto cleanup;
> 
>      /* Update vm in place to match changes.  */
> +    need_unlink = false;
>      VIR_FREE(disk->src);
>      disk->src = source;
>      source = NULL;
> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
> index 2f31d99..4774df9 100644
> --- a/src/qemu/qemu_monitor_text.c
> +++ b/src/qemu/qemu_monitor_text.c
> @@ -3064,7 +3064,8 @@ qemuMonitorTextDiskSnapshot(qemuMonitorPtr mon, const char *device,
>          goto cleanup;
>      }
> 
> -    if (strstr(reply, "error while creating qcow2") != NULL) {
> +    if (strstr(reply, "error while creating qcow2") != NULL ||
> +        strstr(reply, "unknown command:") != NULL) {
>          qemuReportError(VIR_ERR_OPERATION_FAILED,
>                          _("Failed to take snapshot: %s"), reply);
>          goto cleanup;
> -- 
> 1.7.4.4
> 
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

ACK, snapshot still works correctly when qemu does support it, and
after review with Eric, I think the code looks good.

Dave




More information about the libvir-list mailing list