diff options
Diffstat (limited to 'net/l2tp/l2tp_core.c')
| -rw-r--r-- | net/l2tp/l2tp_core.c | 7 | 
1 files changed, 5 insertions, 2 deletions
diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c index 393355d37b4..1a9f3723c13 100644 --- a/net/l2tp/l2tp_core.c +++ b/net/l2tp/l2tp_core.c @@ -1347,11 +1347,10 @@ static void l2tp_tunnel_free(struct l2tp_tunnel *tunnel)  	/* Remove from tunnel list */  	spin_lock_bh(&pn->l2tp_tunnel_list_lock);  	list_del_rcu(&tunnel->list); +	kfree_rcu(tunnel, rcu);  	spin_unlock_bh(&pn->l2tp_tunnel_list_lock); -	synchronize_rcu();  	atomic_dec(&l2tp_tunnel_count); -	kfree(tunnel);  }  /* Create a socket for the tunnel, if one isn't set up by @@ -1502,6 +1501,8 @@ out:  	return err;  } +static struct lock_class_key l2tp_socket_class; +  int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32 peer_tunnel_id, struct l2tp_tunnel_cfg *cfg, struct l2tp_tunnel **tunnelp)  {  	struct l2tp_tunnel *tunnel = NULL; @@ -1606,6 +1607,8 @@ int l2tp_tunnel_create(struct net *net, int fd, int version, u32 tunnel_id, u32  	tunnel->old_sk_destruct = sk->sk_destruct;  	sk->sk_destruct = &l2tp_tunnel_destruct;  	tunnel->sock = sk; +	lockdep_set_class_and_name(&sk->sk_lock.slock, &l2tp_socket_class, "l2tp_sock"); +  	sk->sk_allocation = GFP_ATOMIC;  	/* Add tunnel to our list */  |