ipv4, ipv6: kill ip_mc_{join, leave}_group and ipv6_sock_mc_{join, drop}
authorMarcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Wed, 18 Mar 2015 17:50:43 +0000 (14:50 -0300)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Mar 2015 02:05:09 +0000 (22:05 -0400)
in favor of their inner __ ones, which doesn't grab rtnl.

As these functions need to operate on a locked socket, we can't be
grabbing rtnl by then. It's too late and doing so causes reversed
locking.

So this patch:
- move rtnl handling to callers instead while already fixing some
  reversed locking situations, like on vxlan and ipvs code.
- renames __ ones to not have the __ mark:
  __ip_mc_{join,leave}_group -> ip_mc_{join,leave}_group
  __ipv6_sock_mc_{join,drop} -> ipv6_sock_mc_{join,drop}

Signed-off-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Acked-by: Hannes Frederic Sowa <hannes@stressinduktion.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c
include/linux/igmp.h
include/net/ipv6.h
net/ipv4/devinet.c
net/ipv4/igmp.c
net/ipv4/ip_sockglue.c
net/ipv6/addrconf.c
net/ipv6/ipv6_sockglue.c
net/ipv6/mcast.c
net/netfilter/ipvs/ip_vs_sync.c
net/tipc/udp_media.c

index 25d92d4..8b8ca74 100644 (file)
@@ -1097,7 +1097,6 @@ EXPORT_SYMBOL_GPL(vxlan_sock_release);
 
 /* Callback to update multicast group membership when first VNI on
  * multicast asddress is brought up
- * Done as workqueue because ip_mc_join_group acquires RTNL.
  */
 static void vxlan_igmp_join(struct work_struct *work)
 {
@@ -1107,6 +1106,7 @@ static void vxlan_igmp_join(struct work_struct *work)
        union vxlan_addr *ip = &vxlan->default_dst.remote_ip;
        int ifindex = vxlan->default_dst.remote_ifindex;
 
+       rtnl_lock();
        lock_sock(sk);
        if (ip->sa.sa_family == AF_INET) {
                struct ip_mreqn mreq = {
@@ -1122,6 +1122,7 @@ static void vxlan_igmp_join(struct work_struct *work)
 #endif
        }
        release_sock(sk);
+       rtnl_unlock();
 
        vxlan_sock_release(vs);
        dev_put(vxlan->dev);
@@ -1136,6 +1137,7 @@ static void vxlan_igmp_leave(struct work_struct *work)
        union vxlan_addr *ip = &vxlan->default_dst.remote_ip;
        int ifindex = vxlan->default_dst.remote_ifindex;
 
+       rtnl_lock();
        lock_sock(sk);
        if (ip->sa.sa_family == AF_INET) {
                struct ip_mreqn mreq = {
@@ -1152,6 +1154,7 @@ static void vxlan_igmp_leave(struct work_struct *work)
        }
 
        release_sock(sk);
+       rtnl_unlock();
 
        vxlan_sock_release(vs);
        dev_put(vxlan->dev);
Simple merge
Simple merge
Simple merge
diff --cc net/ipv4/igmp.c
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge