diff options
-rw-r--r-- | net/ipv4/udp.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index bcb5def2b09e..7e4d9c871153 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -189,6 +189,11 @@ int udp_lib_get_port(struct sock *sk, unsigned short snum, | |||
189 | inet_sk(sk)->num = snum; | 189 | inet_sk(sk)->num = snum; |
190 | sk->sk_hash = snum; | 190 | sk->sk_hash = snum; |
191 | if (sk_unhashed(sk)) { | 191 | if (sk_unhashed(sk)) { |
192 | /* | ||
193 | * We need that previous write to sk->sk_hash committed | ||
194 | * before write to sk->next done in following add_node() variant | ||
195 | */ | ||
196 | smp_wmb(); | ||
192 | sk_add_node_rcu(sk, &hslot->head); | 197 | sk_add_node_rcu(sk, &hslot->head); |
193 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); | 198 | sock_prot_inuse_add(sock_net(sk), sk->sk_prot, 1); |
194 | } | 199 | } |