diff options
Diffstat (limited to 'net/xfrm/xfrm_user.c')
| -rw-r--r-- | net/xfrm/xfrm_user.c | 12 | 
1 files changed, 8 insertions, 4 deletions
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index 5a0ef4361e43..f0aecee4d539 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -1761,7 +1761,7 @@ static int xfrm_add_policy(struct sk_buff *skb, struct nlmsghdr *nlh,  	/* shouldn't excl be based on nlh flags??  	 * Aha! this is anti-netlink really i.e  more pfkey derived -	 * in netlink excl is a flag and you wouldnt need +	 * in netlink excl is a flag and you wouldn't need  	 * a type XFRM_MSG_UPDPOLICY - JHS */  	excl = nlh->nlmsg_type == XFRM_MSG_NEWPOLICY;  	err = xfrm_policy_insert(p->dir, xp, excl); @@ -3480,18 +3480,22 @@ static int __net_init xfrm_user_net_init(struct net *net)  	return 0;  } +static void __net_exit xfrm_user_net_pre_exit(struct net *net) +{ +	RCU_INIT_POINTER(net->xfrm.nlsk, NULL); +} +  static void __net_exit xfrm_user_net_exit(struct list_head *net_exit_list)  {  	struct net *net; -	list_for_each_entry(net, net_exit_list, exit_list) -		RCU_INIT_POINTER(net->xfrm.nlsk, NULL); -	synchronize_net(); +  	list_for_each_entry(net, net_exit_list, exit_list)  		netlink_kernel_release(net->xfrm.nlsk_stash);  }  static struct pernet_operations xfrm_user_net_ops = {  	.init	    = xfrm_user_net_init, +	.pre_exit   = xfrm_user_net_pre_exit,  	.exit_batch = xfrm_user_net_exit,  };  |