提交 89241fe0 编写于 作者: J Jiri Denemark

qemu: Fallback to HMP for snapshot commands

qemu driver in libvirt gained support for creating domain snapshots
almost a year ago in libvirt 0.8.0. Since then we enabled QMP support
for qemu >= 0.13.0 but QMP equivalents of {save,load,del}vm commands are
not implemented in current qemu (0.14.0) so the domain snapshot support
is not very useful.

This patch detects when the appropriate QMP command is not implemented
and tries to use human-monitor-command (aka HMP passthrough) to run
it's HMP equivalent.
上级 b3c6ec03
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include <string.h> #include <string.h>
#include <sys/time.h> #include <sys/time.h>
#include "qemu_monitor_text.h"
#include "qemu_monitor_json.h" #include "qemu_monitor_json.h"
#include "qemu_command.h" #include "qemu_command.h"
#include "memory.h" #include "memory.h"
...@@ -2451,11 +2452,18 @@ int qemuMonitorJSONCreateSnapshot(qemuMonitorPtr mon, const char *name) ...@@ -2451,11 +2452,18 @@ int qemuMonitorJSONCreateSnapshot(qemuMonitorPtr mon, const char *name)
if (!cmd) if (!cmd)
return -1; return -1;
ret = qemuMonitorJSONCommand(mon, cmd, &reply); if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (ret == 0) if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
ret = qemuMonitorJSONCheckError(cmd, reply); VIR_DEBUG0("savevm command not found, trying HMP");
ret = qemuMonitorTextCreateSnapshot(mon, name);
goto cleanup;
}
ret = qemuMonitorJSONCheckError(cmd, reply);
cleanup:
virJSONValueFree(cmd); virJSONValueFree(cmd);
virJSONValueFree(reply); virJSONValueFree(reply);
return ret; return ret;
...@@ -2473,11 +2481,18 @@ int qemuMonitorJSONLoadSnapshot(qemuMonitorPtr mon, const char *name) ...@@ -2473,11 +2481,18 @@ int qemuMonitorJSONLoadSnapshot(qemuMonitorPtr mon, const char *name)
if (!cmd) if (!cmd)
return -1; return -1;
ret = qemuMonitorJSONCommand(mon, cmd, &reply); if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (ret == 0) if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
ret = qemuMonitorJSONCheckError(cmd, reply); VIR_DEBUG0("loadvm command not found, trying HMP");
ret = qemuMonitorTextLoadSnapshot(mon, name);
goto cleanup;
}
ret = qemuMonitorJSONCheckError(cmd, reply);
cleanup:
virJSONValueFree(cmd); virJSONValueFree(cmd);
virJSONValueFree(reply); virJSONValueFree(reply);
return ret; return ret;
...@@ -2495,11 +2510,18 @@ int qemuMonitorJSONDeleteSnapshot(qemuMonitorPtr mon, const char *name) ...@@ -2495,11 +2510,18 @@ int qemuMonitorJSONDeleteSnapshot(qemuMonitorPtr mon, const char *name)
if (!cmd) if (!cmd)
return -1; return -1;
ret = qemuMonitorJSONCommand(mon, cmd, &reply); if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (ret == 0) if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
ret = qemuMonitorJSONCheckError(cmd, reply); VIR_DEBUG0("delvm command not found, trying HMP");
ret = qemuMonitorTextDeleteSnapshot(mon, name);
goto cleanup;
}
ret = qemuMonitorJSONCheckError(cmd, reply);
cleanup:
virJSONValueFree(cmd); virJSONValueFree(cmd);
virJSONValueFree(reply); virJSONValueFree(reply);
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册