[libvirt] [PATCH] util: fix botched check for new netlink request filters

Laine Stump laine at laine.org
Fri Dec 21 21:19:34 UTC 2012


On 12/21/2012 04:00 PM, Eric Blake wrote:
> On 12/21/2012 01:48 PM, Laine Stump wrote:
>> This is an adjustment to the fix for
>>
>>   https://bugzilla.redhat.com/show_bug.cgi?id=889319
>>
>> to account for two bonehead mistakes I made.
>>
>> commit ac2797cf2af2fd0e64c58a48409a8175d24d6f86 attempted to fix a
>> problem with netlink in newer kernels requiring an extra attribute
>> with a filter flag set in order to receive an IFLA_VFINFO_LIST from
>> netlink. Unfortunately, the #ifdef that protected against compiling it
>> in on systems without the new flag went a bit too far, assuring that
>> the new code would *never* be compiled.
>>
>> The first problem was that, while some IFLA_* enum values are also
>> not, so checking to see if it's #defined is not a valid method of
> Grammar.  Did you miss a word somewhere in there?

Yes :-)

>
> <rant>Why do the kernel developers behave so inconsistently? I much
> prefer interfaces where an enum value is ALSO added as a define to
> itself, to make it easy to probe which features are available in the
> current set of headers.</rant>

The really frustrating part is the *some of* the enum values in this set
have #defines, and some of them don't.

>
>> determining whether or not to add the attribute. Fortunately, the flag
>> that is being set (RTEXT_FILTER_VF) *is* #defined, and it is never
>> present if IFLA_EXT_MASK isn't, so it's sufficient to just check for
>> that flag.
> My bad in the first review for not actually looking up the kernel
> headers for those values.
>
>> And to top it off, due to the code not actually compiling when I
>> thought it did, I didn't realize that I'd been given the wrong arglist
>> to nla_put() - you can't just send a const value to nla_put, you have
>> to send it a pointer to memory containing what you want to add to the
>> message, along with the length of that memory.
>>
>> This time I've actually sent the patch over to the other machine
>> that's expriencing the problem, applied it to the branch being used
> s/expriencing/experiencing/

Right.

>
>> (0.10.2) and verified that it works properly, i.e. it does fix the
>> problem it's supposed to fix. :-/
>> ---
>>  src/util/virnetdev.c | 8 ++++++--
>>  1 file changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/util/virnetdev.c b/src/util/virnetdev.c
>> index e5a0d6d..898e77a 100644
>> --- a/src/util/virnetdev.c
>> +++ b/src/util/virnetdev.c
>> @@ -1275,13 +1275,17 @@ virNetDevLinkDump(const char *ifname, int ifindex,
>>              goto buffer_too_small;
>>      }
>>  
>> -# if defined(IFLA_EXT_MASK) && defined(RTEXT_FILTER_VF)
>> +# if defined(RTEXT_FILTER_VF)
> Now that you are down to one term, it might be simpler to write:
>
> # ifdef RTEXT_FILTER_VF

Okay.

>
>>      /* if this filter exists in the kernel's netlink implementation,
>>       * we need to set it, otherwise the response message will not
>>       * contain the IFLA_VFINFO_LIST that we're looking for.
>>       */
>> -    if (nla_put(nl_msg, IFLA_EXT_MASK, RTEXT_FILTER_VF) < 0)
>> +    {
>> +    uint32_t ifla_ext_mask = RTEXT_FILTER_VF;
>> +
>> +    if (nla_put(nl_msg, IFLA_EXT_MASK, sizeof(ifla_ext_mask), &ifla_ext_mask) < 0)
>>         goto buffer_too_small;
>> +    }
> Thanks to the extra {} scoping, you need to indent the body four more
> spaces (and probably wrap a long line).

Ah, right. I forgot to set libvirt indent style on the buffer, and am
not used to extra braces like this, so didn't even notice that the
indentation was wrong.
>
>>  # endif
>>  
>>      if (virNetlinkCommand(nl_msg, recvbuf, &recvbuflen,
>>
> ACK with those things fixed.
>

Okay, I've fixed those and pushed.

Thanks for the last minute review!




More information about the libvir-list mailing list