109c434b8SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * linux/net/sunrpc/sunrpc_syms.c 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Symbols exported by the sunrpc module. 61da177e4SLinus Torvalds * 71da177e4SLinus Torvalds * Copyright (C) 1997 Olaf Kirch <okir@monad.swb.de> 81da177e4SLinus Torvalds */ 91da177e4SLinus Torvalds 101da177e4SLinus Torvalds #include <linux/module.h> 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #include <linux/types.h> 131da177e4SLinus Torvalds #include <linux/uio.h> 141da177e4SLinus Torvalds #include <linux/unistd.h> 151da177e4SLinus Torvalds #include <linux/init.h> 161da177e4SLinus Torvalds 171da177e4SLinus Torvalds #include <linux/sunrpc/sched.h> 181da177e4SLinus Torvalds #include <linux/sunrpc/clnt.h> 191da177e4SLinus Torvalds #include <linux/sunrpc/svc.h> 201da177e4SLinus Torvalds #include <linux/sunrpc/svcsock.h> 211da177e4SLinus Torvalds #include <linux/sunrpc/auth.h> 221da177e4SLinus Torvalds #include <linux/workqueue.h> 231da177e4SLinus Torvalds #include <linux/sunrpc/rpc_pipe_fs.h> 2449c36fccS\"Talpey, Thomas\ #include <linux/sunrpc/xprtsock.h> 251da177e4SLinus Torvalds 26f45db2b9SNeilBrown #include "sunrpc.h" 2774678748SOlga Kornievskaia #include "sysfs.h" 282f72c9b7SPavel Emelyanov #include "netns.h" 292f72c9b7SPavel Emelyanov 30c7d03a00SAlexey Dobriyan unsigned int sunrpc_net_id; 31a1db410dSStanislav Kinsbursky EXPORT_SYMBOL_GPL(sunrpc_net_id); 322f72c9b7SPavel Emelyanov sunrpc_init_net(struct net * net)332f72c9b7SPavel Emelyanovstatic __net_init int sunrpc_init_net(struct net *net) 342f72c9b7SPavel Emelyanov { 354f42d0d5SPavel Emelyanov int err; 3670abc49bSStanislav Kinsbursky struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 374f42d0d5SPavel Emelyanov 384f42d0d5SPavel Emelyanov err = rpc_proc_init(net); 394f42d0d5SPavel Emelyanov if (err) 404f42d0d5SPavel Emelyanov goto err_proc; 414f42d0d5SPavel Emelyanov 4290d51b02SPavel Emelyanov err = ip_map_cache_create(net); 4390d51b02SPavel Emelyanov if (err) 4490d51b02SPavel Emelyanov goto err_ipmap; 4590d51b02SPavel Emelyanov 4673393232SStanislav Kinsbursky err = unix_gid_cache_create(net); 4773393232SStanislav Kinsbursky if (err) 4873393232SStanislav Kinsbursky goto err_unixgid; 4973393232SStanislav Kinsbursky 504b9a445eSJeff Layton err = rpc_pipefs_init_net(net); 514b9a445eSJeff Layton if (err) 524b9a445eSJeff Layton goto err_pipefs; 534b9a445eSJeff Layton 5470abc49bSStanislav Kinsbursky INIT_LIST_HEAD(&sn->all_clients); 5570abc49bSStanislav Kinsbursky spin_lock_init(&sn->rpc_client_lock); 561d96e80fSStanislav Kinsbursky spin_lock_init(&sn->rpcb_clnt_lock); 572f72c9b7SPavel Emelyanov return 0; 584f42d0d5SPavel Emelyanov 594b9a445eSJeff Layton err_pipefs: 604b9a445eSJeff Layton unix_gid_cache_destroy(net); 6173393232SStanislav Kinsbursky err_unixgid: 6273393232SStanislav Kinsbursky ip_map_cache_destroy(net); 6390d51b02SPavel Emelyanov err_ipmap: 6490d51b02SPavel Emelyanov rpc_proc_exit(net); 654f42d0d5SPavel Emelyanov err_proc: 664f42d0d5SPavel Emelyanov return err; 672f72c9b7SPavel Emelyanov } 682f72c9b7SPavel Emelyanov sunrpc_exit_net(struct net * net)692f72c9b7SPavel Emelyanovstatic __net_exit void sunrpc_exit_net(struct net *net) 702f72c9b7SPavel Emelyanov { 714112be70SVasily Averin struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 724112be70SVasily Averin 734b9a445eSJeff Layton rpc_pipefs_exit_net(net); 7473393232SStanislav Kinsbursky unix_gid_cache_destroy(net); 7590d51b02SPavel Emelyanov ip_map_cache_destroy(net); 764f42d0d5SPavel Emelyanov rpc_proc_exit(net); 774112be70SVasily Averin WARN_ON_ONCE(!list_empty(&sn->all_clients)); 782f72c9b7SPavel Emelyanov } 792f72c9b7SPavel Emelyanov 802f72c9b7SPavel Emelyanov static struct pernet_operations sunrpc_net_ops = { 812f72c9b7SPavel Emelyanov .init = sunrpc_init_net, 822f72c9b7SPavel Emelyanov .exit = sunrpc_exit_net, 832f72c9b7SPavel Emelyanov .id = &sunrpc_net_id, 842f72c9b7SPavel Emelyanov .size = sizeof(struct sunrpc_net), 852f72c9b7SPavel Emelyanov }; 862f72c9b7SPavel Emelyanov 871da177e4SLinus Torvalds static int __init init_sunrpc(void)881da177e4SLinus Torvaldsinit_sunrpc(void) 891da177e4SLinus Torvalds { 90adae0fe0SStanislav Kinsbursky int err = rpc_init_mempool(); 911da177e4SLinus Torvalds if (err) 921da177e4SLinus Torvalds goto out; 935d8d9a4dSTrond Myklebust err = rpcauth_init_module(); 945d8d9a4dSTrond Myklebust if (err) 95adae0fe0SStanislav Kinsbursky goto out2; 962f72c9b7SPavel Emelyanov 972f72c9b7SPavel Emelyanov cache_initialize(); 982f72c9b7SPavel Emelyanov 992f72c9b7SPavel Emelyanov err = register_pernet_subsys(&sunrpc_net_ops); 1002f72c9b7SPavel Emelyanov if (err) 101adae0fe0SStanislav Kinsbursky goto out3; 102adae0fe0SStanislav Kinsbursky 103adae0fe0SStanislav Kinsbursky err = register_rpc_pipefs(); 104adae0fe0SStanislav Kinsbursky if (err) 1052f72c9b7SPavel Emelyanov goto out4; 106b4b9d2ccSJeff Layton 10774678748SOlga Kornievskaia err = rpc_sysfs_init(); 10874678748SOlga Kornievskaia if (err) 10974678748SOlga Kornievskaia goto out5; 11074678748SOlga Kornievskaia 111f9c72d10SJeff Layton sunrpc_debugfs_init(); 112f895b252SJeff Layton #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 1131da177e4SLinus Torvalds rpc_register_sysctl(); 1141da177e4SLinus Torvalds #endif 115360d8738STom Tucker svc_init_xprt_sock(); /* svc sock transport */ 116360d8738STom Tucker init_socket_xprt(); /* clnt sock transport */ 1175d8d9a4dSTrond Myklebust return 0; 1182f72c9b7SPavel Emelyanov 11974678748SOlga Kornievskaia out5: 12074678748SOlga Kornievskaia unregister_rpc_pipefs(); 1212f72c9b7SPavel Emelyanov out4: 122adae0fe0SStanislav Kinsbursky unregister_pernet_subsys(&sunrpc_net_ops); 1235d8d9a4dSTrond Myklebust out3: 124adae0fe0SStanislav Kinsbursky rpcauth_remove_module(); 1255d8d9a4dSTrond Myklebust out2: 126adae0fe0SStanislav Kinsbursky rpc_destroy_mempool(); 1271da177e4SLinus Torvalds out: 1281da177e4SLinus Torvalds return err; 1291da177e4SLinus Torvalds } 1301da177e4SLinus Torvalds 1311da177e4SLinus Torvalds static void __exit cleanup_sunrpc(void)1321da177e4SLinus Torvaldscleanup_sunrpc(void) 1331da177e4SLinus Torvalds { 13474678748SOlga Kornievskaia rpc_sysfs_exit(); 135c929ea0bSKinglong Mee rpc_cleanup_clids(); 136572caba4SOlga Kornievskaia xprt_cleanup_ids(); 137*5b926872SOlga Kornievskaia xprt_multipath_cleanup_ids(); 138f5c2187cSTrond Myklebust rpcauth_remove_module(); 139282b32e1SChuck Lever cleanup_socket_xprt(); 140360d8738STom Tucker svc_cleanup_xprt_sock(); 141b4b9d2ccSJeff Layton sunrpc_debugfs_exit(); 1421da177e4SLinus Torvalds unregister_rpc_pipefs(); 1431da177e4SLinus Torvalds rpc_destroy_mempool(); 1442f72c9b7SPavel Emelyanov unregister_pernet_subsys(&sunrpc_net_ops); 145f45db2b9SNeilBrown auth_domain_cleanup(); 146f895b252SJeff Layton #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 1471da177e4SLinus Torvalds rpc_unregister_sysctl(); 1481da177e4SLinus Torvalds #endif 14975de874fSJesper Dangaard Brouer rcu_barrier(); /* Wait for completion of call_rcu()'s */ 1501da177e4SLinus Torvalds } 1511da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 152405d8f8bSTrond Myklebust fs_initcall(init_sunrpc); /* Ensure we're initialised before nfs */ 1531da177e4SLinus Torvalds module_exit(cleanup_sunrpc); 154