rtnetlink: Move nesting cancellation rollback to proper function
authorGal Pressman <gal@nvidia.com>
Sun, 16 Jul 2023 07:24:40 +0000 (10:24 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 18 Jul 2023 13:14:05 +0000 (15:14 +0200)
Make rtnl_fill_vf() cancel the vfinfo attribute on error instead of the
inner rtnl_fill_vfinfo(), as it is the function that starts it.

Signed-off-by: Gal Pressman <gal@nvidia.com>
Link: https://lore.kernel.org/r/20230716072440.2372567-1-gal@nvidia.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/core/rtnetlink.c

index 3ad4e03..70838d7 100644 (file)
@@ -1273,7 +1273,6 @@ static noinline_for_stack int rtnl_fill_stats(struct sk_buff *skb,
 static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
                                               struct net_device *dev,
                                               int vfs_num,
-                                              struct nlattr *vfinfo,
                                               u32 ext_filter_mask)
 {
        struct ifla_vf_rss_query_en vf_rss_query_en;
@@ -1343,7 +1342,7 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
        vf_trust.setting = ivi.trusted;
        vf = nla_nest_start_noflag(skb, IFLA_VF_INFO);
        if (!vf)
-               goto nla_put_vfinfo_failure;
+               return -EMSGSIZE;
        if (nla_put(skb, IFLA_VF_MAC, sizeof(vf_mac), &vf_mac) ||
            nla_put(skb, IFLA_VF_BROADCAST, sizeof(vf_broadcast), &vf_broadcast) ||
            nla_put(skb, IFLA_VF_VLAN, sizeof(vf_vlan), &vf_vlan) ||
@@ -1414,8 +1413,6 @@ static noinline_for_stack int rtnl_fill_vfinfo(struct sk_buff *skb,
 
 nla_put_vf_failure:
        nla_nest_cancel(skb, vf);
-nla_put_vfinfo_failure:
-       nla_nest_cancel(skb, vfinfo);
        return -EMSGSIZE;
 }
 
@@ -1441,8 +1438,10 @@ static noinline_for_stack int rtnl_fill_vf(struct sk_buff *skb,
                return -EMSGSIZE;
 
        for (i = 0; i < num_vfs; i++) {
-               if (rtnl_fill_vfinfo(skb, dev, i, vfinfo, ext_filter_mask))
+               if (rtnl_fill_vfinfo(skb, dev, i, ext_filter_mask)) {
+                       nla_nest_cancel(skb, vfinfo);
                        return -EMSGSIZE;
+               }
        }
 
        nla_nest_end(skb, vfinfo);