diff options
author | David S. Miller <davem@davemloft.net> | 2015-04-06 21:52:19 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-04-06 22:34:15 -0400 |
commit | c85d6975ef923cffdd56de3e0e6aba0977282cff (patch) | |
tree | cb497deea01827951809c9c7c0f1c22780c146be /net/ipv6 | |
parent | 60302ff631f0f3eac0ec592e128b776f0676b397 (diff) | |
parent | f22e6e847115abc3a0e2ad7bb18d243d42275af1 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
drivers/net/ethernet/mellanox/mlx4/cmd.c
net/core/fib_rules.c
net/ipv4/fib_frontend.c
The fib_rules.c and fib_frontend.c conflicts were locking adjustments
in 'net' overlapping addition and removal of code in 'net-next'.
The mlx4 conflict was a bug fix in 'net' happening in the same
place a constant was being replaced with a more suitable macro.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/fib6_rules.c | 2 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 3 | ||||
-rw-r--r-- | net/ipv6/ip6mr.c | 4 |
3 files changed, 6 insertions, 3 deletions
diff --git a/net/ipv6/fib6_rules.c b/net/ipv6/fib6_rules.c index 61fb184b818d..2367a16eae58 100644 --- a/net/ipv6/fib6_rules.c +++ b/net/ipv6/fib6_rules.c | |||
@@ -315,7 +315,9 @@ out_fib6_rules_ops: | |||
315 | 315 | ||
316 | static void __net_exit fib6_rules_net_exit(struct net *net) | 316 | static void __net_exit fib6_rules_net_exit(struct net *net) |
317 | { | 317 | { |
318 | rtnl_lock(); | ||
318 | fib_rules_unregister(net->ipv6.fib6_rules_ops); | 319 | fib_rules_unregister(net->ipv6.fib6_rules_ops); |
320 | rtnl_unlock(); | ||
319 | } | 321 | } |
320 | 322 | ||
321 | static struct pernet_operations fib6_rules_net_ops = { | 323 | static struct pernet_operations fib6_rules_net_ops = { |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 84c58da10f5c..654f245aa930 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -542,7 +542,8 @@ int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) | |||
542 | { | 542 | { |
543 | struct sk_buff *frag; | 543 | struct sk_buff *frag; |
544 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); | 544 | struct rt6_info *rt = (struct rt6_info *)skb_dst(skb); |
545 | struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; | 545 | struct ipv6_pinfo *np = skb->sk && !dev_recursion_level() ? |
546 | inet6_sk(skb->sk) : NULL; | ||
546 | struct ipv6hdr *tmp_hdr; | 547 | struct ipv6hdr *tmp_hdr; |
547 | struct frag_hdr *fh; | 548 | struct frag_hdr *fh; |
548 | unsigned int mtu, hlen, left, len; | 549 | unsigned int mtu, hlen, left, len; |
diff --git a/net/ipv6/ip6mr.c b/net/ipv6/ip6mr.c index 26456037bdfc..8493a22e74eb 100644 --- a/net/ipv6/ip6mr.c +++ b/net/ipv6/ip6mr.c | |||
@@ -265,8 +265,8 @@ static void __net_exit ip6mr_rules_exit(struct net *net) | |||
265 | list_del(&mrt->list); | 265 | list_del(&mrt->list); |
266 | ip6mr_free_table(mrt); | 266 | ip6mr_free_table(mrt); |
267 | } | 267 | } |
268 | rtnl_unlock(); | ||
269 | fib_rules_unregister(net->ipv6.mr6_rules_ops); | 268 | fib_rules_unregister(net->ipv6.mr6_rules_ops); |
269 | rtnl_unlock(); | ||
270 | } | 270 | } |
271 | #else | 271 | #else |
272 | #define ip6mr_for_each_table(mrt, net) \ | 272 | #define ip6mr_for_each_table(mrt, net) \ |
@@ -334,7 +334,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id) | |||
334 | 334 | ||
335 | static void ip6mr_free_table(struct mr6_table *mrt) | 335 | static void ip6mr_free_table(struct mr6_table *mrt) |
336 | { | 336 | { |
337 | del_timer(&mrt->ipmr_expire_timer); | 337 | del_timer_sync(&mrt->ipmr_expire_timer); |
338 | mroute_clean_tables(mrt); | 338 | mroute_clean_tables(mrt); |
339 | kfree(mrt); | 339 | kfree(mrt); |
340 | } | 340 | } |