
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!