From 95f5c13fbb4272488bbb9a8a1c1f28b9cc95da9b Mon Sep 17 00:00:00 2001
From: Luiz Capitulino <lcapitulino@redhat.com>
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 <lcapitulino@redhat.com>
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 <alex.williamson@redhat.com>
RH-Acked-by: Amit Shah <amit.shah@redhat.com>
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>

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 <lcapitulino@redhat.com>
---
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 <ehabkost@redhat.com>
---
 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

