}
static void __net_exit ip6mr_rules_exit(struct net *net)
+{
+ fib_rules_unregister(net->ipv6.mr6_rules_ops);
+}
+
+static void __net_exit ip6mr_rules_exit_rtnl(struct net *net)
{
struct mr_table *mrt, *next;
list_del_rcu(&mrt->list);
ip6mr_free_table(mrt);
}
- fib_rules_unregister(net->ipv6.mr6_rules_ops);
}
static int ip6mr_rules_dump(struct net *net, struct notifier_block *nb,
}
static void __net_exit ip6mr_rules_exit(struct net *net)
+{
+}
+
+static void __net_exit ip6mr_rules_exit_rtnl(struct net *net)
{
struct mr_table *mrt = rcu_dereference_protected(net->ipv6.mrt6, 1);
remove_proc_entry("ip6_mr_vif", net->proc_net);
proc_vif_fail:
rtnl_lock();
- ip6mr_rules_exit(net);
+ ip6mr_rules_exit_rtnl(net);
rtnl_unlock();
+ ip6mr_rules_exit(net);
#endif
ip6mr_rules_fail:
ip6mr_notifier_exit(net);
remove_proc_entry("ip6_mr_cache", net->proc_net);
remove_proc_entry("ip6_mr_vif", net->proc_net);
#endif
+ ip6mr_rules_exit(net);
ip6mr_notifier_exit(net);
}
rtnl_lock();
list_for_each_entry(net, net_list, exit_list)
- ip6mr_rules_exit(net);
+ ip6mr_rules_exit_rtnl(net);
rtnl_unlock();
}