vxlan: add necessary locking on device removal
authorstephen hemminger <stephen@networkplumber.org>
Sat, 13 Jul 2013 17:18:18 +0000 (10:18 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Jul 2013 19:51:19 +0000 (12:51 -0700)
The socket management is now done in workqueue (outside of RTNL)
and protected by vn->sock_lock. There were two possible bugs, first
the vxlan device was removed from the VNI hash table per socket without
holding lock. And there was a race when device is created and the workqueue
could run after deletion.

Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/vxlan.c

index 0ba1e7edbb1b443d8fe34a685baf4fe934c91175..a5ba8dd7e6bea33d060e9d5306b9eab6bb2095da 100644 (file)
@@ -1767,9 +1767,15 @@ static int vxlan_newlink(struct net *net, struct net_device *dev,
 
 static void vxlan_dellink(struct net_device *dev, struct list_head *head)
 {
+       struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id);
        struct vxlan_dev *vxlan = netdev_priv(dev);
 
+       flush_workqueue(vxlan_wq);
+
+       spin_lock(&vn->sock_lock);
        hlist_del_rcu(&vxlan->hlist);
+       spin_unlock(&vn->sock_lock);
+
        list_del(&vxlan->next);
        unregister_netdevice_queue(dev, head);
 }