mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
net: move fib_rules_unregister() under rtnl lock
We have to hold rtnl lock for fib_rules_unregister()
otherwise the following race could happen:
fib_rules_unregister(): fib_nl_delrule():
... ...
... ops = lookup_rules_ops();
list_del_rcu(&ops->list);
list_for_each_entry(ops->rules) {
fib_rules_cleanup_ops(ops); ...
list_del_rcu(); list_del_rcu();
}
Note, net->rules_mod_lock is actually not needed at all,
either upper layer netns code or rtnl lock guarantees
we are safe.
Cc: Alexander Duyck <[email protected]>
Cc: Thomas Graf <[email protected]>
Signed-off-by: Cong Wang <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
ed785309c9
commit
419df12fb5
6 changed files with 8 additions and 5 deletions
|
|
@ -322,7 +322,9 @@ out_fib6_rules_ops:
|
|||
|
||||
static void __net_exit fib6_rules_net_exit(struct net *net)
|
||||
{
|
||||
rtnl_lock();
|
||||
fib_rules_unregister(net->ipv6.fib6_rules_ops);
|
||||
rtnl_unlock();
|
||||
}
|
||||
|
||||
static struct pernet_operations fib6_rules_net_ops = {
|
||||
|
|
|
|||
|
|
@ -267,8 +267,8 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
|
|||
list_del(&mrt->list);
|
||||
ip6mr_free_table(mrt);
|
||||
}
|
||||
rtnl_unlock();
|
||||
fib_rules_unregister(net->ipv6.mr6_rules_ops);
|
||||
rtnl_unlock();
|
||||
}
|
||||
#else
|
||||
#define ip6mr_for_each_table(mrt, net) \
|
||||
|
|
|
|||
Loading…
Reference in a new issue