forked from Minki/linux
nexthops: Move code from remove_nexthop_from_groups to remove_nh_grp_entry
Move nh_grp dereference and check for removing nexthop group due to
all members gone into remove_nh_grp_entry.
Fixes: 430a049190
("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>
This commit is contained in:
parent
963bdfc75c
commit
ac21753a5c
@ -694,17 +694,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) {
|
||||
@ -728,7 +732,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,
|
||||
@ -736,17 +744,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)
|
||||
|
Loading…
Reference in New Issue
Block a user