From 4fef0bc86b1ea977b237bc98dc25f3cc3f6c0e15 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Thu, 3 May 2007 03:17:14 -0700 Subject: [PATCH] --- yaml --- r: 53463 b: refs/heads/master c: 3f660d66dfbc13ea4b61d3865851b348444c24b4 h: refs/heads/master i: 53461: 2cc5487580ee636ba2959109a9b090a85325bcfc 53459: 4948c67d88e38d01407e8daf5c08d3108a9142a4 53455: 1abd1da8701d7c2e9157f459a0786e745c02e119 v: v3 --- [refs] | 2 +- trunk/net/netlink/af_netlink.c | 29 +++++++++++++++-------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index e00a685f39c8..1e0236e4c099 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: be52178b9f73969b583c6a781ca613f4e601221a +refs/heads/master: 3f660d66dfbc13ea4b61d3865851b348444c24b4 diff --git a/trunk/net/netlink/af_netlink.c b/trunk/net/netlink/af_netlink.c index 42d2fb94eff1..7fc6b4da4f02 100644 --- a/trunk/net/netlink/af_netlink.c +++ b/trunk/net/netlink/af_netlink.c @@ -140,6 +140,15 @@ static struct hlist_head *nl_pid_hashfn(struct nl_pid_hash *hash, u32 pid) static void netlink_sock_destruct(struct sock *sk) { + struct netlink_sock *nlk = nlk_sk(sk); + + BUG_ON(mutex_is_locked(nlk_sk(sk)->cb_mutex)); + if (nlk->cb) { + if (nlk->cb->done) + nlk->cb->done(nlk->cb); + netlink_destroy_callback(nlk->cb); + } + skb_queue_purge(&sk->sk_receive_queue); if (!sock_flag(sk, SOCK_DEAD)) { @@ -148,7 +157,6 @@ static void netlink_sock_destruct(struct sock *sk) } BUG_TRAP(!atomic_read(&sk->sk_rmem_alloc)); BUG_TRAP(!atomic_read(&sk->sk_wmem_alloc)); - BUG_TRAP(!nlk_sk(sk)->cb); BUG_TRAP(!nlk_sk(sk)->groups); } @@ -456,17 +464,10 @@ static int netlink_release(struct socket *sock) sock_orphan(sk); nlk = nlk_sk(sk); - mutex_lock(nlk->cb_mutex); - if (nlk->cb) { - if (nlk->cb->done) - nlk->cb->done(nlk->cb); - netlink_destroy_callback(nlk->cb); - nlk->cb = NULL; - } - mutex_unlock(nlk->cb_mutex); - - /* OK. Socket is unlinked, and, therefore, - no new packets will arrive */ + /* + * OK. Socket is unlinked, any packets that arrive now + * will be purged. + */ sock->sk = NULL; wake_up_interruptible_all(&nlk->wait); @@ -1426,9 +1427,9 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb, return -ECONNREFUSED; } nlk = nlk_sk(sk); - /* A dump or destruction is in progress... */ + /* A dump is in progress... */ mutex_lock(nlk->cb_mutex); - if (nlk->cb || sock_flag(sk, SOCK_DEAD)) { + if (nlk->cb) { mutex_unlock(nlk->cb_mutex); netlink_destroy_callback(cb); sock_put(sk);