diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-01-09 02:38:23 -0500 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2012-01-09 02:38:23 -0500 |
commit | da733563be5a9da26fe81d9f007262d00b846e22 (patch) | |
tree | db28291df94a2043af2123911984c5c173da4e6f /net/ipv6/raw.c | |
parent | 6ccbcf2cb41131f8d56ef0723bf3f7c1f8486076 (diff) | |
parent | dab78d7924598ea4031663dd10db814e2e324928 (diff) |
Merge branch 'next' into for-linus
Diffstat (limited to 'net/ipv6/raw.c')
-rw-r--r-- | net/ipv6/raw.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 6a79f3081bdb..331af3b882ac 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c | |||
@@ -61,6 +61,7 @@ | |||
61 | 61 | ||
62 | #include <linux/proc_fs.h> | 62 | #include <linux/proc_fs.h> |
63 | #include <linux/seq_file.h> | 63 | #include <linux/seq_file.h> |
64 | #include <linux/export.h> | ||
64 | 65 | ||
65 | static struct raw_hashinfo raw_v6_hashinfo = { | 66 | static struct raw_hashinfo raw_v6_hashinfo = { |
66 | .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), | 67 | .lock = __RW_LOCK_UNLOCKED(raw_v6_hashinfo.lock), |
@@ -130,14 +131,14 @@ static mh_filter_t __rcu *mh_filter __read_mostly; | |||
130 | 131 | ||
131 | int rawv6_mh_filter_register(mh_filter_t filter) | 132 | int rawv6_mh_filter_register(mh_filter_t filter) |
132 | { | 133 | { |
133 | rcu_assign_pointer(mh_filter, filter); | 134 | RCU_INIT_POINTER(mh_filter, filter); |
134 | return 0; | 135 | return 0; |
135 | } | 136 | } |
136 | EXPORT_SYMBOL(rawv6_mh_filter_register); | 137 | EXPORT_SYMBOL(rawv6_mh_filter_register); |
137 | 138 | ||
138 | int rawv6_mh_filter_unregister(mh_filter_t filter) | 139 | int rawv6_mh_filter_unregister(mh_filter_t filter) |
139 | { | 140 | { |
140 | rcu_assign_pointer(mh_filter, NULL); | 141 | RCU_INIT_POINTER(mh_filter, NULL); |
141 | synchronize_rcu(); | 142 | synchronize_rcu(); |
142 | return 0; | 143 | return 0; |
143 | } | 144 | } |
@@ -372,9 +373,9 @@ void raw6_icmp_error(struct sk_buff *skb, int nexthdr, | |||
372 | read_unlock(&raw_v6_hashinfo.lock); | 373 | read_unlock(&raw_v6_hashinfo.lock); |
373 | } | 374 | } |
374 | 375 | ||
375 | static inline int rawv6_rcv_skb(struct sock * sk, struct sk_buff * skb) | 376 | static inline int rawv6_rcv_skb(struct sock *sk, struct sk_buff *skb) |
376 | { | 377 | { |
377 | if ((raw6_sk(sk)->checksum || rcu_dereference_raw(sk->sk_filter)) && | 378 | if ((raw6_sk(sk)->checksum || rcu_access_pointer(sk->sk_filter)) && |
378 | skb_checksum_complete(skb)) { | 379 | skb_checksum_complete(skb)) { |
379 | atomic_inc(&sk->sk_drops); | 380 | atomic_inc(&sk->sk_drops); |
380 | kfree_skb(skb); | 381 | kfree_skb(skb); |
@@ -542,8 +543,7 @@ static int rawv6_push_pending_frames(struct sock *sk, struct flowi6 *fl6, | |||
542 | goto out; | 543 | goto out; |
543 | 544 | ||
544 | offset = rp->offset; | 545 | offset = rp->offset; |
545 | total_len = inet_sk(sk)->cork.base.length - (skb_network_header(skb) - | 546 | total_len = inet_sk(sk)->cork.base.length; |
546 | skb->data); | ||
547 | if (offset >= total_len - 1) { | 547 | if (offset >= total_len - 1) { |
548 | err = -EINVAL; | 548 | err = -EINVAL; |
549 | ip6_flush_pending_frames(sk); | 549 | ip6_flush_pending_frames(sk); |
@@ -817,8 +817,8 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk, | |||
817 | memset(opt, 0, sizeof(struct ipv6_txoptions)); | 817 | memset(opt, 0, sizeof(struct ipv6_txoptions)); |
818 | opt->tot_len = sizeof(struct ipv6_txoptions); | 818 | opt->tot_len = sizeof(struct ipv6_txoptions); |
819 | 819 | ||
820 | err = datagram_send_ctl(sock_net(sk), msg, &fl6, opt, &hlimit, | 820 | err = datagram_send_ctl(sock_net(sk), sk, msg, &fl6, opt, |
821 | &tclass, &dontfrag); | 821 | &hlimit, &tclass, &dontfrag); |
822 | if (err < 0) { | 822 | if (err < 0) { |
823 | fl6_sock_release(flowlabel); | 823 | fl6_sock_release(flowlabel); |
824 | return err; | 824 | return err; |