]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/xfrm/xfrm_user.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/hskinnemoen/avr32-2.6
[karo-tx-linux.git] / net / xfrm / xfrm_user.c
index fb42d778d278b65942dac36424f04806c97283f5..1ada6186933c24256c92bfee4db98eafde653a03 100644 (file)
@@ -2721,22 +2721,24 @@ static int __net_init xfrm_user_net_init(struct net *net)
                                     xfrm_netlink_rcv, NULL, THIS_MODULE);
        if (nlsk == NULL)
                return -ENOMEM;
+       net->xfrm.nlsk_stash = nlsk; /* Don't set to NULL */
        rcu_assign_pointer(net->xfrm.nlsk, nlsk);
        return 0;
 }
 
-static void __net_exit xfrm_user_net_exit(struct net *net)
+static void __net_exit xfrm_user_net_exit(struct list_head *net_exit_list)
 {
-       struct sock *nlsk = net->xfrm.nlsk;
-
-       rcu_assign_pointer(net->xfrm.nlsk, NULL);
-       synchronize_rcu();
-       netlink_kernel_release(nlsk);
+       struct net *net;
+       list_for_each_entry(net, net_exit_list, exit_list)
+               rcu_assign_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,
-       .exit = xfrm_user_net_exit,
+       .init       = xfrm_user_net_init,
+       .exit_batch = xfrm_user_net_exit,
 };
 
 static int __init xfrm_user_init(void)