]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - net/tipc/core.c
Merge tag 'drm-next-2020-02-07' of git://anongit.freedesktop.org/drm/drm
[linux.git] / net / tipc / core.c
index 8f35060a24e1d04b12e6d40cb9427765e0602c67..4f6dc74adf455c8bbcf523be2c64432c6341ce03 100644 (file)
@@ -42,6 +42,7 @@
 #include "socket.h"
 #include "bcast.h"
 #include "node.h"
+#include "crypto.h"
 
 #include <linux/module.h>
 
@@ -66,6 +67,11 @@ static int __net_init tipc_init_net(struct net *net)
        INIT_LIST_HEAD(&tn->node_list);
        spin_lock_init(&tn->node_list_lock);
 
+#ifdef CONFIG_TIPC_CRYPTO
+       err = tipc_crypto_start(&tn->crypto_tx, net, NULL);
+       if (err)
+               goto out_crypto;
+#endif
        err = tipc_sk_rht_init(net);
        if (err)
                goto out_sk_rht;
@@ -91,6 +97,11 @@ static int __net_init tipc_init_net(struct net *net)
 out_nametbl:
        tipc_sk_rht_destroy(net);
 out_sk_rht:
+
+#ifdef CONFIG_TIPC_CRYPTO
+       tipc_crypto_stop(&tn->crypto_tx);
+out_crypto:
+#endif
        return err;
 }
 
@@ -101,8 +112,20 @@ static void __net_exit tipc_exit_net(struct net *net)
        tipc_bcast_stop(net);
        tipc_nametbl_stop(net);
        tipc_sk_rht_destroy(net);
+#ifdef CONFIG_TIPC_CRYPTO
+       tipc_crypto_stop(&tipc_net(net)->crypto_tx);
+#endif
+}
+
+static void __net_exit tipc_pernet_pre_exit(struct net *net)
+{
+       tipc_node_pre_cleanup_net(net);
 }
 
+static struct pernet_operations tipc_pernet_pre_exit_ops = {
+       .pre_exit = tipc_pernet_pre_exit,
+};
+
 static struct pernet_operations tipc_net_ops = {
        .init = tipc_init_net,
        .exit = tipc_exit_net,
@@ -125,14 +148,6 @@ static int __init tipc_init(void)
        sysctl_tipc_rmem[1] = RCVBUF_DEF;
        sysctl_tipc_rmem[2] = RCVBUF_MAX;
 
-       err = tipc_netlink_start();
-       if (err)
-               goto out_netlink;
-
-       err = tipc_netlink_compat_start();
-       if (err)
-               goto out_netlink_compat;
-
        err = tipc_register_sysctl();
        if (err)
                goto out_sysctl;
@@ -149,13 +164,32 @@ static int __init tipc_init(void)
        if (err)
                goto out_pernet_topsrv;
 
+       err = register_pernet_subsys(&tipc_pernet_pre_exit_ops);
+       if (err)
+               goto out_register_pernet_subsys;
+
        err = tipc_bearer_setup();
        if (err)
                goto out_bearer;
 
+       err = tipc_netlink_start();
+       if (err)
+               goto out_netlink;
+
+       err = tipc_netlink_compat_start();
+       if (err)
+               goto out_netlink_compat;
+
        pr_info("Started in single node mode\n");
        return 0;
+
+out_netlink_compat:
+       tipc_netlink_stop();
+out_netlink:
+       tipc_bearer_cleanup();
 out_bearer:
+       unregister_pernet_subsys(&tipc_pernet_pre_exit_ops);
+out_register_pernet_subsys:
        unregister_pernet_device(&tipc_topsrv_net_ops);
 out_pernet_topsrv:
        tipc_socket_stop();
@@ -164,22 +198,19 @@ static int __init tipc_init(void)
 out_pernet:
        tipc_unregister_sysctl();
 out_sysctl:
-       tipc_netlink_compat_stop();
-out_netlink_compat:
-       tipc_netlink_stop();
-out_netlink:
        pr_err("Unable to start in single node mode\n");
        return err;
 }
 
 static void __exit tipc_exit(void)
 {
+       tipc_netlink_compat_stop();
+       tipc_netlink_stop();
        tipc_bearer_cleanup();
+       unregister_pernet_subsys(&tipc_pernet_pre_exit_ops);
        unregister_pernet_device(&tipc_topsrv_net_ops);
        tipc_socket_stop();
        unregister_pernet_device(&tipc_net_ops);
-       tipc_netlink_stop();
-       tipc_netlink_compat_stop();
        tipc_unregister_sysctl();
 
        pr_info("Deactivated\n");