From 95f5c13fbb4272488bbb9a8a1c1f28b9cc95da9b Mon Sep 17 00:00:00 2001 From: Luiz Capitulino Date: Wed, 23 Jun 2010 18:48:26 -0300 Subject: [PATCH 2/4] QMP: Fix error reporting in the async API RH-Author: Luiz Capitulino Message-id: <1277318907-23590-3-git-send-email-lcapitulino@redhat.com> Patchwork-id: 10152 O-Subject: [PATCH 2/3] QMP: Fix error reporting in the async API Bugzilla: 587382 RH-Acked-by: Alex Williamson RH-Acked-by: Amit Shah RH-Acked-by: Kevin Wolf Bugzilla: 587382 Upstream: Submitted, but not merged yet The current asynchronous command API doesn't return a QMP response when the async command fails. This is easy to reproduce with the balloon command (the sole async command we have so far): run qemu w/o the '-balloon virtio' option and try to issue the balloon command via QMP: no response will be sent to the client. This commit fixes the problem by making qmp_async_cmd_handler() return the handler's error code and then calling monitor_protocol_emitter() if the handler has returned an error. Signed-off-by: Luiz Capitulino --- PS: In addition to this fix, I've submitted another patch upstream which also fixes the error message. But as I'm not sure if the second patch is good, I'm sending only this one. monitor.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) Signed-off-by: Eduardo Habkost --- monitor.c | 12 ++++++++---- 1 files changed, 8 insertions(+), 4 deletions(-) diff --git a/monitor.c b/monitor.c index 91d09dd..a95ef4e 100644 --- a/monitor.c +++ b/monitor.c @@ -569,10 +569,10 @@ static void qmp_monitor_complete(void *opaque, QObject *ret_data) monitor_protocol_emitter(opaque, ret_data); } -static void qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd, - const QDict *params) +static int qmp_async_cmd_handler(Monitor *mon, const mon_cmd_t *cmd, + const QDict *params) { - cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon); + return cmd->mhandler.cmd_async(mon, params, qmp_monitor_complete, mon); } static void qmp_async_info_handler(Monitor *mon, const mon_cmd_t *cmd) @@ -4540,7 +4540,11 @@ static void handle_qmp_command(JSONMessageParser *parser, QList *tokens) } if (monitor_handler_is_async(cmd)) { - qmp_async_cmd_handler(mon, cmd, args); + err = qmp_async_cmd_handler(mon, cmd, args); + if (err) { + /* emit the error response */ + goto err_out; + } } else { monitor_call_handler(mon, cmd, args); } -- 1.7.0.3