diff options
author | Luiz Capitulino <lcapitulino@redhat.com> | 2010-06-22 19:10:46 -0300 |
---|---|---|
committer | Luiz Capitulino <lcapitulino@redhat.com> | 2010-07-01 14:27:13 -0300 |
commit | 5a3e217e97cf4b270662c57fb47a94c51e6f4c34 (patch) | |
tree | c51ec4bcc03eac4b6409b9d9ae0006dd4f3b4351 /monitor.c | |
parent | d44ec6a3b52a05b49139d6e6d5a915c280f1edc4 (diff) | |
download | qemu-5a3e217e97cf4b270662c57fb47a94c51e6f4c34.tar.gz qemu-5a3e217e97cf4b270662c57fb47a94c51e6f4c34.tar.bz2 qemu-5a3e217e97cf4b270662c57fb47a94c51e6f4c34.zip |
QMP: Fix error reporting in the async API
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 <lcapitulino@redhat.com>
Diffstat (limited to 'monitor.c')
-rw-r--r-- | monitor.c | 12 |
1 files changed, 8 insertions, 4 deletions
@@ -546,10 +546,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) @@ -4239,7 +4239,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); } |