vxlan: Use sk_release_kernel() instead of sock_release().
authorJesse Gross <jesse@nicira.com>
Thu, 6 Dec 2012 19:06:06 +0000 (11:06 -0800)
committerJesse Gross <jesse@nicira.com>
Thu, 6 Dec 2012 19:18:51 +0000 (11:18 -0800)
A socket that is created using sock_create_kern() and then switched
to a namespace using sk_change_net() should be released using
sk_release_kernel() instead of sock_release().  This is because
sk_change_net() has already released a reference to the namespace
and we shouldn't try to release it again later.

Cc: Kyle Mestery <kmestery@cisco.com>
Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Kyle Mestery <kmestery@cisco.com>
datapath/vport-vxlan.c

index 137e5d8..3d7260f 100644 (file)
@@ -222,7 +222,7 @@ static int vxlan_socket_init(struct vxlan_port *vxlan_port, struct net *net)
        return 0;
 
 error_sock:
-       sock_release(vxlan_port->vxlan_rcv_socket);
+       sk_release_kernel(vxlan_port->vxlan_rcv_socket->sk);
 error:
        pr_warn("cannot register vxlan protocol handler\n");
        return err;
@@ -234,7 +234,7 @@ static void vxlan_tunnel_release(struct vxlan_port *vxlan_port)
 
        if (vxlan_port->count == 0) {
                /* Release old socket */
-               sock_release(vxlan_port->vxlan_rcv_socket);
+               sk_release_kernel(vxlan_port->vxlan_rcv_socket->sk);
                list_del(&vxlan_port->list);
                kfree(vxlan_port);
        }