qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v4 07/28] qmp: Clean up how we enforce capabilit


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH v4 07/28] qmp: Clean up how we enforce capability negotiation
Date: Fri, 03 Mar 2017 20:45:05 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.1 (gnu/linux)

Eric Blake <address@hidden> writes:

> On 03/03/2017 06:32 AM, Markus Armbruster wrote:
>> To enforce capability negotiation before normal operation,
>> handle_qmp_command() inspects every command before it's handed off to
>> qmp_dispatch().  This is a bit of a layering violation, and results in
>> duplicated code.
>> 
>> Before capability negotiation (!cur_mon->in_command_mode), we fail
>> commands other than "qmp_capabilities".  This is what enforces
>> capability negotiation.
>> 
>> Afterwards, we fail command "qmp_capabilities".
>> 
>> Clean this up as follows.
>> 
>> The obvious place to fail a command is the command itself, so move the
>> "afterwards" check to qmp_qmp_capabilities().
>> 
>> We do the "before" check in every other command, but that would be
>> bothersome.  Instead, start with an alternate list of commant that
>
> s/commant/commands/

Fixed.

>> contains only "qmp_capabilities".  Switch to the full list in
>> qmp_qmp_capabilities().
>> 
>> Additionally, replace the generic human-readable error message for
>> CommandNotFound by one that reminds the user to run qmp_capabilities.
>> Without that, we'd regress commit 2d5a834.
>> 
>> Signed-off-by: Markus Armbruster <address@hidden>
>> ---
>>  monitor.c | 76 
>> +++++++++++++++++++++++++++++++++++----------------------------
>>  1 file changed, 42 insertions(+), 34 deletions(-)
>> 
>
>> @@ -3786,11 +3785,20 @@ static void handle_qmp_command(JSONMessageParser 
>> *parser, GQueue *tokens)
>>      cmd_name = qdict_get_str(qdict, "execute");
>>      trace_handle_qmp_command(mon, cmd_name);
>>  
>> -    if (invalid_qmp_mode(mon, cmd_name, &err)) {
>> -        goto err_out;
>> -    }
>> +    rsp = qmp_dispatch(cur_mon->qmp.commands, req);
>>  
>> -    rsp = qmp_dispatch(&qmp_commands, req);
>> +    qdict = qdict_get_qdict(qobject_to_qdict(rsp), "error");
>> +    if (qdict) {
>> +        if (mon->qmp.commands == &qmp_cap_negotiation_commands
>> +            && !g_strcmp0(qdict_get_try_str(qdict, "class"),
>> +                    QapiErrorClass_lookup[ERROR_CLASS_COMMAND_NOT_FOUND])) {
>
> Could join these two 'if' into one, for less {}, but that's cosmetic.

Or maybe get reshuffle so that qdict_get_qdict() is called only when
needed:

    if (mon->qmp.commands == &qmp_cap_negotiation_commands) {
        qdict = qdict_get_qdict(qobject_to_qdict(rsp), "error");
        if (qdict
            && !g_strcmp0(qdict_get_try_str(qdict, "class"),
                    QapiErrorClass_lookup[ERROR_CLASS_COMMAND_NOT_FOUND])) {
            /* Provide a more useful error message */

> Reviewed-by: Eric Blake <address@hidden>

Thanks!



reply via email to

[Prev in Thread] Current Thread [Next in Thread]