[libvirt] [PATCH] qemu: nicer error message if live disk snapshot unsupported
Osier Yang
jyang at redhat.com
Tue Dec 4 15:10:18 UTC 2012
On 2012年12月04日 05:33, Eric Blake wrote:
> Without this patch, attempts to create a disk snapshot when qemu
> is too old results in a cryptic message:
>
> virsh # snapshot-create 23 --disk-only
> error: operation failed: Failed to take snapshot: unknown command: 'snapshot_blkdev'
>
> Now it reports:
>
> virsh # snapshot-create 23 --disk-only
> error: unsupported configuration: live disk snapshot not supported with this QEMU binary
>
> All versions of qemu that support live disk snapshot also support
> QMP (basically upstream qemu 1.1 and later, and backport to RHEL 6.2).
>
> * src/qemu/qemu_capabilities.h (QEMU_CAPS_DISK_SNAPSHOT): New
> capability.
> * src/qemu/qemu_capabilities.c (qemuCaps): Track it.
> (qemuCapsProbeQMPCommands): Set it.
> * src/qemu/qemu_driver.c (qemuDomainSnapshotCreateDiskActive): Use
> it.
> * src/qemu/qemu_monitor.c (qemuMonitorDiskSnapshot): Simplify.
> * src/qemu/qemu_monitor_json.c (qemuMonitorJSONDiskSnapshot):
> Likewise.
> * src/qemu/qemu_monitor_text.h (qemuMonitorTextDiskSnapshot):
> Delete.
> * src/qemu/qemu_monitor_text.c (qemuMonitorTextDiskSnapshot):
> Likewise.
> ---
> src/qemu/qemu_capabilities.c | 3 +++
> src/qemu/qemu_capabilities.h | 1 +
> src/qemu/qemu_driver.c | 5 +++++
> src/qemu/qemu_monitor.c | 13 ++++---------
> src/qemu/qemu_monitor_json.c | 6 ------
> src/qemu/qemu_monitor_text.c | 37 -------------------------------------
> src/qemu/qemu_monitor_text.h | 4 ----
> 7 files changed, 13 insertions(+), 56 deletions(-)
>
> diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
> index 6e34cdf..668935e 100644
> --- a/src/qemu/qemu_capabilities.c
> +++ b/src/qemu/qemu_capabilities.c
> @@ -193,6 +193,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
> "drive-mirror", /* 115 */
> "usb-redir.bootindex",
> "usb-host.bootindex",
> + "blockdev-snapshot-sync",
> );
>
> struct _qemuCaps {
> @@ -1948,6 +1949,8 @@ qemuCapsProbeQMPCommands(qemuCapsPtr caps,
> qemuCapsSet(caps, QEMU_CAPS_VNC);
> else if (STREQ(name, "drive-mirror"))
> qemuCapsSet(caps, QEMU_CAPS_DRIVE_MIRROR);
> + else if (STREQ(name, "blockdev-snapshot-sync"))
> + qemuCapsSet(caps, QEMU_CAPS_DISK_SNAPSHOT);
> VIR_FREE(name);
> }
> VIR_FREE(commands);
> diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
> index f420c43..3da8672 100644
> --- a/src/qemu/qemu_capabilities.h
> +++ b/src/qemu/qemu_capabilities.h
> @@ -155,6 +155,7 @@ enum qemuCapsFlags {
> QEMU_CAPS_DRIVE_MIRROR = 115, /* drive-mirror monitor command */
> QEMU_CAPS_USB_REDIR_BOOTINDEX = 116, /* usb-redir.bootindex */
> QEMU_CAPS_USB_HOST_BOOTINDEX = 117, /* usb-host.bootindex */
> + QEMU_CAPS_DISK_SNAPSHOT = 118, /* blockdev-snapshot-sync command */
>
> QEMU_CAPS_LAST, /* this must always be the last item */
> };
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8e838cd..fbacd8b 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -11230,6 +11230,11 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr driver,
> virReportOOMError();
> goto cleanup;
> }
> + } else if (!qemuCapsGet(priv->caps, QEMU_CAPS_DISK_SNAPSHOT)) {
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
Shouldn't this be VIR_ERR_OPERATION_INVALID instead? As it's not
related with config.
> + _("live disk snapshot not supported with this "
> + "QEMU binary"));
> + goto cleanup;
> }
>
> /* No way to roll back if first disk succeeds but later disks
> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
> index f85bb76..543f714 100644
> --- a/src/qemu/qemu_monitor.c
> +++ b/src/qemu/qemu_monitor.c
> @@ -2769,17 +2769,12 @@ qemuMonitorDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
> return -1;
> }
>
> - if (mon->json) {
> + if (mon->json)
> ret = qemuMonitorJSONDiskSnapshot(mon, actions, device, file, format,
> reuse);
> - } else {
> - if (actions || STRNEQ(format, "qcow2") || reuse) {
> - virReportError(VIR_ERR_INVALID_ARG, "%s",
> - _("text monitor lacks several snapshot features"));
> - return -1;
> - }
> - ret = qemuMonitorTextDiskSnapshot(mon, device, file);
> - }
> + else
> + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
Likewise.
ACK otherwise.
Osier
More information about the libvir-list
mailing list