From e3f17187fc0e3bddfb41872d5c50e5cb49666746 Mon Sep 17 00:00:00 2001 From: Eric Dumazet Date: Tue, 25 Nov 2008 13:55:15 -0800 Subject: [PATCH] --- yaml --- r: 122151 b: refs/heads/master c: 723b46108f8ee75b61ce703d0c9225e4f537bc46 h: refs/heads/master i: 122149: ef87780ef0b9b983cc469716a1e49be7116cd558 122147: 4cdd71e41d2e2ec2dc94f9c64084476e8fcaddfc 122143: a3e2a6bd3e892e4c62d5fd290082b43ecff161b2 v: v3 --- [refs] | 2 +- trunk/net/ipv4/udp.c | 18 ++++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/[refs] b/[refs] index bdb2d1079016..b62baf9c55fe 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5bc0b3bfa758e4ae49c94e31c1edb9a5f10a8060 +refs/heads/master: 723b46108f8ee75b61ce703d0c9225e4f537bc46 diff --git a/trunk/net/ipv4/udp.c b/trunk/net/ipv4/udp.c index 549114472db3..cf5ab0581eba 100644 --- a/trunk/net/ipv4/udp.c +++ b/trunk/net/ipv4/udp.c @@ -970,16 +970,18 @@ int udp_disconnect(struct sock *sk, int flags) void udp_lib_unhash(struct sock *sk) { - struct udp_table *udptable = sk->sk_prot->h.udp_table; - unsigned int hash = udp_hashfn(sock_net(sk), sk->sk_hash); - struct udp_hslot *hslot = &udptable->hash[hash]; + if (sk_hashed(sk)) { + struct udp_table *udptable = sk->sk_prot->h.udp_table; + unsigned int hash = udp_hashfn(sock_net(sk), sk->sk_hash); + struct udp_hslot *hslot = &udptable->hash[hash]; - spin_lock_bh(&hslot->lock); - if (sk_nulls_del_node_init_rcu(sk)) { - inet_sk(sk)->num = 0; - sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); + spin_lock_bh(&hslot->lock); + if (sk_nulls_del_node_init_rcu(sk)) { + inet_sk(sk)->num = 0; + sock_prot_inuse_add(sock_net(sk), sk->sk_prot, -1); + } + spin_unlock_bh(&hslot->lock); } - spin_unlock_bh(&hslot->lock); } EXPORT_SYMBOL(udp_lib_unhash);