]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
nexthops: Move code from remove_nexthop_from_groups to remove_nh_grp_entry
authorDavid Ahern <dsahern@gmail.com>
Tue, 26 May 2020 18:56:14 +0000 (12:56 -0600)
committerMarcelo Henrique Cerri <marcelo.cerri@canonical.com>
Mon, 22 Jun 2020 20:23:43 +0000 (17:23 -0300)
BugLink: https://bugs.launchpad.net/bugs/1881927
commit ac21753a5c2c9a6a2019997481a2ac12bbde48c8 upstream.

Move nh_grp dereference and check for removing nexthop group due to
all members gone into remove_nh_grp_entry.

Fixes: 430a049190de ("nexthop: Add support for nexthop groups")
Signed-off-by: David Ahern <dsahern@gmail.com>
Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Khalid Elmously <khalid.elmously@canonical.com>
net/ipv4/nexthop.c

index 4d1531c4780ce87b559d87fe7529f0f0055ad584..27fb18cbf062254fa7f4c00ad32657d36994ce3d 100644 (file)
@@ -695,17 +695,21 @@ static void nh_group_rebalance(struct nh_group *nhg)
        }
 }
 
-static void remove_nh_grp_entry(struct nh_grp_entry *nhge,
-                               struct nh_group *nhg,
+static void remove_nh_grp_entry(struct net *net, struct nh_grp_entry *nhge,
                                struct nl_info *nlinfo)
 {
+       struct nexthop *nhp = nhge->nh_parent;
        struct nexthop *nh = nhge->nh;
        struct nh_grp_entry *nhges;
+       struct nh_group *nhg;
        bool found = false;
        int i;
 
        WARN_ON(!nh);
 
+       list_del(&nhge->nh_list);
+
+       nhg = rtnl_dereference(nhp->nh_grp);
        nhges = nhg->nh_entries;
        for (i = 0; i < nhg->num_nh; ++i) {
                if (found) {
@@ -729,7 +733,11 @@ static void remove_nh_grp_entry(struct nh_grp_entry *nhge,
        nexthop_put(nh);
 
        if (nlinfo)
-               nexthop_notify(RTM_NEWNEXTHOP, nhge->nh_parent, nlinfo);
+               nexthop_notify(RTM_NEWNEXTHOP, nhp, nlinfo);
+
+       /* if this group has no more entries then remove it */
+       if (!nhg->num_nh)
+               remove_nexthop(net, nhp, nlinfo);
 }
 
 static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh,
@@ -737,17 +745,8 @@ static void remove_nexthop_from_groups(struct net *net, struct nexthop *nh,
 {
        struct nh_grp_entry *nhge, *tmp;
 
-       list_for_each_entry_safe(nhge, tmp, &nh->grp_list, nh_list) {
-               struct nh_group *nhg;
-
-               list_del(&nhge->nh_list);
-               nhg = rtnl_dereference(nhge->nh_parent->nh_grp);
-               remove_nh_grp_entry(nhge, nhg, nlinfo);
-
-               /* if this group has no more entries then remove it */
-               if (!nhg->num_nh)
-                       remove_nexthop(net, nhge->nh_parent, nlinfo);
-       }
+       list_for_each_entry_safe(nhge, tmp, &nh->grp_list, nh_list)
+               remove_nh_grp_entry(net, nhge, nlinfo);
 }
 
 static void remove_nexthop_group(struct nexthop *nh, struct nl_info *nlinfo)