From: David S. Miller Date: Sun, 14 Nov 2010 19:57:05 +0000 (-0800) Subject: Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 X-Git-Url: https://bbs.cooldavid.org/git/?p=net-next-2.6.git;a=commitdiff_plain;h=c25ecd0a21d5e08160cb5cc984f9e2b8ee347443 Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6 --- c25ecd0a21d5e08160cb5cc984f9e2b8ee347443 diff --cc net/ipv4/igmp.c index 6f49d6c087d,3c53c2d89e3..0f0e0f0279b --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c @@@ -2301,16 -2300,14 +2301,14 @@@ void ip_mc_drop_socket(struct sock *sk return; rtnl_lock(); - while ((iml = inet->mc_list) != NULL) { + while ((iml = rtnl_dereference(inet->mc_list)) != NULL) { struct in_device *in_dev; - rcu_assign_pointer(inet->mc_list, iml->next); + inet->mc_list = iml->next_rcu; in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); (void) ip_mc_leave_src(sk, iml, in_dev); - if (in_dev != NULL) { + if (in_dev != NULL) ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); - in_dev_put(in_dev); - } /* decrease mem now to avoid the memleak warning */ atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); call_rcu(&iml->rcu, ip_mc_socklist_reclaim);