]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
util: add missing error log messages when failing to get netlink VFINFO
authorLaine Stump <laine@laine.org>
Thu, 20 Dec 2012 19:52:41 +0000 (14:52 -0500)
committerLaine Stump <laine@laine.org>
Tue, 8 Jan 2013 17:22:16 +0000 (12:22 -0500)
This patch fixes the lack of error messages when libvirt fails to find
VFINFO in a returned netlinke response message.

https://bugzilla.redhat.com/show_bug.cgi?id=827519#c10 is an example
of the error message that was previously logged when the
IFLA_VFINFO_LIST object was missing from the netlink response. The
reason for this failure is detailed in

   https://bugzilla.redhat.com/show_bug.cgi?id=889319

Even though that root problem has been fixed, the experience of
finding the root cause shows us how important it is to properly log an
error message in these cases. This patch *seems* to replace the entire
function, but really most of the changes are due to moving code that
was previously inside an if() statement out to the top level of the
function (the original if() was reversed and made to log an error and
return).
(cherry picked from commit 846770e5ff959f7819e2c32857598cb88e2e2f0e)

src/util/virnetdev.c

index 205fd93541c9c03be552d935a382eb7d764cb83c..f5f4562969f23b357e018448eac1ca15c3dc3f75 100644 (file)
@@ -1465,53 +1465,55 @@ static int
 virNetDevParseVfConfig(struct nlattr **tb, int32_t vf, virMacAddrPtr mac,
                        int *vlanid)
 {
-    const char *msg = NULL;
     int rc = -1;
+    struct ifla_vf_mac *vf_mac;
+    struct ifla_vf_vlan *vf_vlan;
+    struct nlattr *tb_vf_info = {NULL, };
+    struct nlattr *tb_vf[IFLA_VF_MAX+1];
+    int found = 0;
+    int rem;
+
+    if (!tb[IFLA_VFINFO_LIST]) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("missing IFLA_VF_INFO in netlink response"));
+        goto cleanup;
+    }
 
-    if (tb[IFLA_VFINFO_LIST]) {
-        struct ifla_vf_mac *vf_mac;
-        struct ifla_vf_vlan *vf_vlan;
-        struct nlattr *tb_vf_info = {NULL, };
-        struct nlattr *tb_vf[IFLA_VF_MAX+1];
-        int found = 0;
-        int rem;
-
-        nla_for_each_nested(tb_vf_info, tb[IFLA_VFINFO_LIST], rem) {
-            if (nla_type(tb_vf_info) != IFLA_VF_INFO)
-                continue;
-
-            if (nla_parse_nested(tb_vf, IFLA_VF_MAX, tb_vf_info,
-                                 ifla_vf_policy)) {
-                msg = _("error parsing IFLA_VF_INFO");
-                goto cleanup;
-            }
+    nla_for_each_nested(tb_vf_info, tb[IFLA_VFINFO_LIST], rem) {
+        if (nla_type(tb_vf_info) != IFLA_VF_INFO)
+            continue;
 
-            if (tb[IFLA_VF_MAC]) {
-                vf_mac = RTA_DATA(tb_vf[IFLA_VF_MAC]);
-                if (vf_mac && vf_mac->vf == vf)  {
-                    virMacAddrSetRaw(mac, vf_mac->mac);
-                    found = 1;
-                }
-            }
+        if (nla_parse_nested(tb_vf, IFLA_VF_MAX, tb_vf_info,
+                             ifla_vf_policy)) {
+            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                           _("error parsing IFLA_VF_INFO"));
+            goto cleanup;
+        }
 
-            if (tb[IFLA_VF_VLAN]) {
-                vf_vlan = RTA_DATA(tb_vf[IFLA_VF_VLAN]);
-                if (vf_vlan && vf_vlan->vf == vf)  {
-                    *vlanid = vf_vlan->vlan;
-                    found = 1;
-                }
+        if (tb[IFLA_VF_MAC]) {
+            vf_mac = RTA_DATA(tb_vf[IFLA_VF_MAC]);
+            if (vf_mac && vf_mac->vf == vf)  {
+                virMacAddrSetRaw(mac, vf_mac->mac);
+                found = 1;
             }
-            if (found) {
-                rc = 0;
-                break;
+        }
+
+        if (tb[IFLA_VF_VLAN]) {
+            vf_vlan = RTA_DATA(tb_vf[IFLA_VF_VLAN]);
+            if (vf_vlan && vf_vlan->vf == vf)  {
+                *vlanid = vf_vlan->vlan;
+                found = 1;
             }
         }
+        if (found) {
+            rc = 0;
+            goto cleanup;
+        }
     }
-
+    virReportError(VIR_ERR_INTERNAL_ERROR,
+                   _("couldn't find IFLA_VF_INFO for VF %d "
+                     "in netlink response"), vf);
 cleanup:
-    if (msg)
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", msg);
-
     return rc;
 }