Remove upfront check for hmp - just try it cope with failure

Don't bother checking for the existance of the HMP passthrough
command. Just try to execute it, and propagate the failure.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrange 2012-09-06 16:28:53 +01:00
parent 5505cf96b0
commit 97a1f07681
4 changed files with 29 additions and 59 deletions

View File

@ -78,7 +78,6 @@ struct _qemuMonitor {
int nextSerial;
unsigned json: 1;
unsigned json_hmp: 1;
unsigned wait_greeting: 1;
};
@ -1131,7 +1130,6 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon,
qemuCapsPtr caps)
{
int ret;
int json_hmp;
VIR_DEBUG("mon=%p", mon);
if (!mon) {
@ -1145,10 +1143,9 @@ int qemuMonitorSetCapabilities(qemuMonitorPtr mon,
if (ret < 0)
goto cleanup;
ret = qemuMonitorJSONCheckCommands(mon, caps, &json_hmp);
ret = qemuMonitorJSONCheckCommands(mon, caps);
if (ret < 0)
goto cleanup;
mon->json_hmp = json_hmp > 0;
ret = qemuMonitorJSONCheckEvents(mon, caps);
if (ret < 0)
@ -1162,21 +1159,6 @@ cleanup:
}
int
qemuMonitorCheckHMP(qemuMonitorPtr mon, const char *cmd)
{
if (!mon->json || mon->json_hmp)
return 1;
if (cmd) {
VIR_DEBUG("HMP passthrough not supported by qemu process;"
" not trying HMP for command %s", cmd);
}
return 0;
}
int
qemuMonitorStartCPUs(qemuMonitorPtr mon,
virConnectPtr conn)

View File

@ -159,8 +159,6 @@ void qemuMonitorClose(qemuMonitorPtr mon);
int qemuMonitorSetCapabilities(qemuMonitorPtr mon,
qemuCapsPtr caps);
int qemuMonitorCheckHMP(qemuMonitorPtr mon, const char *cmd);
void qemuMonitorLock(qemuMonitorPtr mon);
void qemuMonitorUnlock(qemuMonitorPtr mon);

View File

@ -909,6 +909,13 @@ qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
if (!cmd || qemuMonitorJSONCommandWithFd(mon, cmd, scm_fd, &reply) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
_("Human monitor command is not available to run %s"),
cmd_str);
goto cleanup;
}
if (qemuMonitorJSONCheckError(cmd, reply))
goto cleanup;
@ -967,8 +974,7 @@ qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon)
*/
int
qemuMonitorJSONCheckCommands(qemuMonitorPtr mon,
qemuCapsPtr caps,
int *json_hmp)
qemuCapsPtr caps)
{
int ret = -1;
virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("query-commands", NULL);
@ -996,9 +1002,7 @@ qemuMonitorJSONCheckCommands(qemuMonitorPtr mon,
!(name = virJSONValueObjectGetString(entry, "name")))
goto cleanup;
if (STREQ(name, "human-monitor-command"))
*json_hmp = 1;
else if (STREQ(name, "system_wakeup"))
if (STREQ(name, "system_wakeup"))
qemuCapsSet(caps, QEMU_CAPS_WAKEUP);
else if (STREQ(name, "transaction"))
qemuCapsSet(caps, QEMU_CAPS_TRANSACTION);
@ -2183,8 +2187,7 @@ int qemuMonitorJSONSetCPU(qemuMonitorPtr mon,
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "cpu_set")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("cpu_set command not found, trying HMP");
ret = qemuMonitorTextSetCPU(mon, cpu, online);
goto cleanup;
@ -3078,8 +3081,7 @@ int qemuMonitorJSONAddDrive(qemuMonitorPtr mon,
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply) < 0))
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "drive_add")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("drive_add command not found, trying HMP");
ret = qemuMonitorTextAddDrive(mon, drivestr);
goto cleanup;
@ -3112,13 +3114,16 @@ int qemuMonitorJSONDriveDel(qemuMonitorPtr mon,
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
if (qemuMonitorCheckHMP(mon, "drive_del")) {
VIR_DEBUG("drive_del command not found, trying HMP");
ret = qemuMonitorTextDriveDel(mon, drivestr);
} else {
VIR_ERROR(_("deleting disk is not supported. "
"This may leak data if disk is reassigned"));
ret = 1;
VIR_DEBUG("drive_del command not found, trying HMP");
if ((ret = qemuMonitorTextDriveDel(mon, drivestr)) < 0) {
virErrorPtr err = virGetLastError();
if (err && err->code == VIR_ERR_OPERATION_UNSUPPORTED) {
VIR_ERROR("%s",
_("deleting disk is not supported. "
"This may leak data if disk is reassigned"));
ret = 1;
virResetLastError();;
}
}
} else if (qemuMonitorJSONHasError(reply, "DeviceNotFound")) {
/* NB: device not found errors mean the drive was
@ -3181,8 +3186,7 @@ int qemuMonitorJSONCreateSnapshot(qemuMonitorPtr mon, const char *name)
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "savevm")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("savevm command not found, trying HMP");
ret = qemuMonitorTextCreateSnapshot(mon, name);
goto cleanup;
@ -3211,8 +3215,7 @@ int qemuMonitorJSONLoadSnapshot(qemuMonitorPtr mon, const char *name)
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "loadvm")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("loadvm command not found, trying HMP");
ret = qemuMonitorTextLoadSnapshot(mon, name);
goto cleanup;
@ -3241,8 +3244,7 @@ int qemuMonitorJSONDeleteSnapshot(qemuMonitorPtr mon, const char *name)
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "delvm")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("delvm command not found, trying HMP");
ret = qemuMonitorTextDeleteSnapshot(mon, name);
goto cleanup;
@ -3287,8 +3289,7 @@ qemuMonitorJSONDiskSnapshot(qemuMonitorPtr mon, virJSONValuePtr actions,
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "snapshot_blkdev")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("blockdev-snapshot-sync command not found, trying HMP");
ret = qemuMonitorTextDiskSnapshot(mon, device, file);
goto cleanup;
@ -3341,12 +3342,6 @@ int qemuMonitorJSONArbitraryCommand(qemuMonitorPtr mon,
int ret = -1;
if (hmp) {
if (!qemuMonitorCheckHMP(mon, NULL)) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("HMP passthrough is not supported by qemu"
" process; only QMP commands can be used"));
return -1;
}
return qemuMonitorJSONHumanCommandWithFd(mon, cmd_str, -1, reply_str);
} else {
if (!(cmd = virJSONValueFromString(cmd_str)))
@ -3381,8 +3376,7 @@ int qemuMonitorJSONInjectNMI(qemuMonitorPtr mon)
if ((ret = qemuMonitorJSONCommand(mon, cmd, &reply)) < 0)
goto cleanup;
if (qemuMonitorJSONHasError(reply, "CommandNotFound") &&
qemuMonitorCheckHMP(mon, "inject-nmi")) {
if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
VIR_DEBUG("inject-nmi command not found, trying HMP");
ret = qemuMonitorTextInjectNMI(mon);
} else {
@ -3404,10 +3398,7 @@ int qemuMonitorJSONSendKey(qemuMonitorPtr mon,
* FIXME: qmp sendkey has not been implemented yet,
* and qmp API of it cannot be anticipated, so we use hmp temporary.
*/
if (qemuMonitorCheckHMP(mon, "sendkey")) {
return qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes);
} else
return -1;
return qemuMonitorTextSendKey(mon, holdtime, keycodes, nkeycodes);
}
int qemuMonitorJSONScreendump(qemuMonitorPtr mon,

View File

@ -43,8 +43,7 @@ int qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
int qemuMonitorJSONSetCapabilities(qemuMonitorPtr mon);
int qemuMonitorJSONCheckCommands(qemuMonitorPtr mon,
qemuCapsPtr caps,
int *json_hmp);
qemuCapsPtr caps);
int qemuMonitorJSONCheckEvents(qemuMonitorPtr mon,
qemuCapsPtr caps);