diff options
| author | David S. Miller <davem@davemloft.net> | 2014-06-04 02:32:12 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-06-04 02:32:12 -0400 |
| commit | c99f7abf0e69987e4add567e155e042cb1f2a20b (patch) | |
| tree | d23898dc30ed25c1dae9bb6325041027d412397a /net/xfrm | |
| parent | 92ff71b8fe9cd9c673615fc6f3870af7376d7c84 (diff) | |
| parent | d8b0426af5b67973585712c9af36b86f6ea97815 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
include/net/inetpeer.h
net/ipv6/output_core.c
Changes in net were fixing bugs in code removed in net-next.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
| -rw-r--r-- | net/xfrm/xfrm_user.c | 36 |
1 files changed, 25 insertions, 11 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index fd9a16a6d1de..412d9dc3a873 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c | |||
| @@ -947,6 +947,20 @@ static struct sk_buff *xfrm_state_netlink(struct sk_buff *in_skb, | |||
| 947 | return skb; | 947 | return skb; |
| 948 | } | 948 | } |
| 949 | 949 | ||
| 950 | /* A wrapper for nlmsg_multicast() checking that nlsk is still available. | ||
| 951 | * Must be called with RCU read lock. | ||
| 952 | */ | ||
| 953 | static inline int xfrm_nlmsg_multicast(struct net *net, struct sk_buff *skb, | ||
| 954 | u32 pid, unsigned int group) | ||
| 955 | { | ||
| 956 | struct sock *nlsk = rcu_dereference(net->xfrm.nlsk); | ||
| 957 | |||
| 958 | if (nlsk) | ||
| 959 | return nlmsg_multicast(nlsk, skb, pid, group, GFP_ATOMIC); | ||
| 960 | else | ||
| 961 | return -1; | ||
| 962 | } | ||
| 963 | |||
| 950 | static inline size_t xfrm_spdinfo_msgsize(void) | 964 | static inline size_t xfrm_spdinfo_msgsize(void) |
| 951 | { | 965 | { |
| 952 | return NLMSG_ALIGN(4) | 966 | return NLMSG_ALIGN(4) |
| @@ -2228,7 +2242,7 @@ static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, | |||
| 2228 | if (build_migrate(skb, m, num_migrate, k, sel, dir, type) < 0) | 2242 | if (build_migrate(skb, m, num_migrate, k, sel, dir, type) < 0) |
| 2229 | BUG(); | 2243 | BUG(); |
| 2230 | 2244 | ||
| 2231 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_MIGRATE, GFP_ATOMIC); | 2245 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_MIGRATE); |
| 2232 | } | 2246 | } |
| 2233 | #else | 2247 | #else |
| 2234 | static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, | 2248 | static int xfrm_send_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, |
| @@ -2419,7 +2433,7 @@ static int xfrm_exp_state_notify(struct xfrm_state *x, const struct km_event *c) | |||
| 2419 | return -EMSGSIZE; | 2433 | return -EMSGSIZE; |
| 2420 | } | 2434 | } |
| 2421 | 2435 | ||
| 2422 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_EXPIRE, GFP_ATOMIC); | 2436 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_EXPIRE); |
| 2423 | } | 2437 | } |
| 2424 | 2438 | ||
| 2425 | static int xfrm_aevent_state_notify(struct xfrm_state *x, const struct km_event *c) | 2439 | static int xfrm_aevent_state_notify(struct xfrm_state *x, const struct km_event *c) |
| @@ -2434,7 +2448,7 @@ static int xfrm_aevent_state_notify(struct xfrm_state *x, const struct km_event | |||
| 2434 | if (build_aevent(skb, x, c) < 0) | 2448 | if (build_aevent(skb, x, c) < 0) |
| 2435 | BUG(); | 2449 | BUG(); |
| 2436 | 2450 | ||
| 2437 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_AEVENTS, GFP_ATOMIC); | 2451 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_AEVENTS); |
| 2438 | } | 2452 | } |
| 2439 | 2453 | ||
| 2440 | static int xfrm_notify_sa_flush(const struct km_event *c) | 2454 | static int xfrm_notify_sa_flush(const struct km_event *c) |
| @@ -2460,7 +2474,7 @@ static int xfrm_notify_sa_flush(const struct km_event *c) | |||
| 2460 | 2474 | ||
| 2461 | nlmsg_end(skb, nlh); | 2475 | nlmsg_end(skb, nlh); |
| 2462 | 2476 | ||
| 2463 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_SA, GFP_ATOMIC); | 2477 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_SA); |
| 2464 | } | 2478 | } |
| 2465 | 2479 | ||
| 2466 | static inline size_t xfrm_sa_len(struct xfrm_state *x) | 2480 | static inline size_t xfrm_sa_len(struct xfrm_state *x) |
| @@ -2547,7 +2561,7 @@ static int xfrm_notify_sa(struct xfrm_state *x, const struct km_event *c) | |||
| 2547 | 2561 | ||
| 2548 | nlmsg_end(skb, nlh); | 2562 | nlmsg_end(skb, nlh); |
| 2549 | 2563 | ||
| 2550 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_SA, GFP_ATOMIC); | 2564 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_SA); |
| 2551 | 2565 | ||
| 2552 | out_free_skb: | 2566 | out_free_skb: |
| 2553 | kfree_skb(skb); | 2567 | kfree_skb(skb); |
| @@ -2638,7 +2652,7 @@ static int xfrm_send_acquire(struct xfrm_state *x, struct xfrm_tmpl *xt, | |||
| 2638 | if (build_acquire(skb, x, xt, xp) < 0) | 2652 | if (build_acquire(skb, x, xt, xp) < 0) |
| 2639 | BUG(); | 2653 | BUG(); |
| 2640 | 2654 | ||
| 2641 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_ACQUIRE, GFP_ATOMIC); | 2655 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_ACQUIRE); |
| 2642 | } | 2656 | } |
| 2643 | 2657 | ||
| 2644 | /* User gives us xfrm_user_policy_info followed by an array of 0 | 2658 | /* User gives us xfrm_user_policy_info followed by an array of 0 |
| @@ -2752,7 +2766,7 @@ static int xfrm_exp_policy_notify(struct xfrm_policy *xp, int dir, const struct | |||
| 2752 | if (build_polexpire(skb, xp, dir, c) < 0) | 2766 | if (build_polexpire(skb, xp, dir, c) < 0) |
| 2753 | BUG(); | 2767 | BUG(); |
| 2754 | 2768 | ||
| 2755 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_EXPIRE, GFP_ATOMIC); | 2769 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_EXPIRE); |
| 2756 | } | 2770 | } |
| 2757 | 2771 | ||
| 2758 | static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c) | 2772 | static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_event *c) |
| @@ -2814,7 +2828,7 @@ static int xfrm_notify_policy(struct xfrm_policy *xp, int dir, const struct km_e | |||
| 2814 | 2828 | ||
| 2815 | nlmsg_end(skb, nlh); | 2829 | nlmsg_end(skb, nlh); |
| 2816 | 2830 | ||
| 2817 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_POLICY, GFP_ATOMIC); | 2831 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_POLICY); |
| 2818 | 2832 | ||
| 2819 | out_free_skb: | 2833 | out_free_skb: |
| 2820 | kfree_skb(skb); | 2834 | kfree_skb(skb); |
| @@ -2842,7 +2856,7 @@ static int xfrm_notify_policy_flush(const struct km_event *c) | |||
| 2842 | 2856 | ||
| 2843 | nlmsg_end(skb, nlh); | 2857 | nlmsg_end(skb, nlh); |
| 2844 | 2858 | ||
| 2845 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_POLICY, GFP_ATOMIC); | 2859 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_POLICY); |
| 2846 | 2860 | ||
| 2847 | out_free_skb: | 2861 | out_free_skb: |
| 2848 | kfree_skb(skb); | 2862 | kfree_skb(skb); |
| @@ -2911,7 +2925,7 @@ static int xfrm_send_report(struct net *net, u8 proto, | |||
| 2911 | if (build_report(skb, proto, sel, addr) < 0) | 2925 | if (build_report(skb, proto, sel, addr) < 0) |
| 2912 | BUG(); | 2926 | BUG(); |
| 2913 | 2927 | ||
| 2914 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_REPORT, GFP_ATOMIC); | 2928 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_REPORT); |
| 2915 | } | 2929 | } |
| 2916 | 2930 | ||
| 2917 | static inline size_t xfrm_mapping_msgsize(void) | 2931 | static inline size_t xfrm_mapping_msgsize(void) |
| @@ -2963,7 +2977,7 @@ static int xfrm_send_mapping(struct xfrm_state *x, xfrm_address_t *ipaddr, | |||
| 2963 | if (build_mapping(skb, x, ipaddr, sport) < 0) | 2977 | if (build_mapping(skb, x, ipaddr, sport) < 0) |
| 2964 | BUG(); | 2978 | BUG(); |
| 2965 | 2979 | ||
| 2966 | return nlmsg_multicast(net->xfrm.nlsk, skb, 0, XFRMNLGRP_MAPPING, GFP_ATOMIC); | 2980 | return xfrm_nlmsg_multicast(net, skb, 0, XFRMNLGRP_MAPPING); |
| 2967 | } | 2981 | } |
| 2968 | 2982 | ||
| 2969 | static bool xfrm_is_alive(const struct km_event *c) | 2983 | static bool xfrm_is_alive(const struct km_event *c) |
