diff options
Diffstat (limited to 'net/ipv6/ip6mr.c')
| -rw-r--r-- | net/ipv6/ip6mr.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 34b682617f50..312e0ff47339 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
| @@ -252,7 +252,7 @@ static int __net_init ip6mr_rules_init(struct net *net) | |||
| 252 | return 0; | 252 | return 0; |
| 253 | 253 | ||
| 254 | err2: | 254 | err2: |
| 255 | kfree(mrt); | 255 | ip6mr_free_table(mrt); |
| 256 | err1: | 256 | err1: |
| 257 | fib_rules_unregister(ops); | 257 | fib_rules_unregister(ops); |
| 258 | return err; | 258 | return err; |
| @@ -267,8 +267,8 @@ static void __net_exit ip6mr_rules_exit(struct net *net) | |||
| 267 | list_del(&mrt->list); | 267 | list_del(&mrt->list); |
| 268 | ip6mr_free_table(mrt); | 268 | ip6mr_free_table(mrt); |
| 269 | } | 269 | } |
| 270 | rtnl_unlock(); | ||
| 271 | fib_rules_unregister(net->ipv6.mr6_rules_ops); | 270 | fib_rules_unregister(net->ipv6.mr6_rules_ops); |
| 271 | rtnl_unlock(); | ||
| 272 | } | 272 | } |
| 273 | #else | 273 | #else |
| 274 | #define ip6mr_for_each_table(mrt, net) \ | 274 | #define ip6mr_for_each_table(mrt, net) \ |
| @@ -336,7 +336,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id) | |||
| 336 | 336 | ||
| 337 | static void ip6mr_free_table(struct mr6_table *mrt) | 337 | static void ip6mr_free_table(struct mr6_table *mrt) |
| 338 | { | 338 | { |
| 339 | del_timer(&mrt->ipmr_expire_timer); | 339 | del_timer_sync(&mrt->ipmr_expire_timer); |
| 340 | mroute_clean_tables(mrt); | 340 | mroute_clean_tables(mrt); |
| 341 | kfree(mrt); | 341 | kfree(mrt); |
| 342 | } | 342 | } |
