1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * linux/net/sunrpc/sunrpc_syms.c 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Symbols exported by the sunrpc module. 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Copyright (C) 1997 Olaf Kirch <okir@monad.swb.de> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <linux/module.h> 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <linux/uio.h> 14*4882a593Smuzhiyun #include <linux/unistd.h> 15*4882a593Smuzhiyun #include <linux/init.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <linux/sunrpc/sched.h> 18*4882a593Smuzhiyun #include <linux/sunrpc/clnt.h> 19*4882a593Smuzhiyun #include <linux/sunrpc/svc.h> 20*4882a593Smuzhiyun #include <linux/sunrpc/svcsock.h> 21*4882a593Smuzhiyun #include <linux/sunrpc/auth.h> 22*4882a593Smuzhiyun #include <linux/workqueue.h> 23*4882a593Smuzhiyun #include <linux/sunrpc/rpc_pipe_fs.h> 24*4882a593Smuzhiyun #include <linux/sunrpc/xprtsock.h> 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun #include "sunrpc.h" 27*4882a593Smuzhiyun #include "netns.h" 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun unsigned int sunrpc_net_id; 30*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(sunrpc_net_id); 31*4882a593Smuzhiyun sunrpc_init_net(struct net * net)32*4882a593Smuzhiyunstatic __net_init int sunrpc_init_net(struct net *net) 33*4882a593Smuzhiyun { 34*4882a593Smuzhiyun int err; 35*4882a593Smuzhiyun struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun err = rpc_proc_init(net); 38*4882a593Smuzhiyun if (err) 39*4882a593Smuzhiyun goto err_proc; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun err = ip_map_cache_create(net); 42*4882a593Smuzhiyun if (err) 43*4882a593Smuzhiyun goto err_ipmap; 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun err = unix_gid_cache_create(net); 46*4882a593Smuzhiyun if (err) 47*4882a593Smuzhiyun goto err_unixgid; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun err = rpc_pipefs_init_net(net); 50*4882a593Smuzhiyun if (err) 51*4882a593Smuzhiyun goto err_pipefs; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun INIT_LIST_HEAD(&sn->all_clients); 54*4882a593Smuzhiyun spin_lock_init(&sn->rpc_client_lock); 55*4882a593Smuzhiyun spin_lock_init(&sn->rpcb_clnt_lock); 56*4882a593Smuzhiyun return 0; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun err_pipefs: 59*4882a593Smuzhiyun unix_gid_cache_destroy(net); 60*4882a593Smuzhiyun err_unixgid: 61*4882a593Smuzhiyun ip_map_cache_destroy(net); 62*4882a593Smuzhiyun err_ipmap: 63*4882a593Smuzhiyun rpc_proc_exit(net); 64*4882a593Smuzhiyun err_proc: 65*4882a593Smuzhiyun return err; 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun sunrpc_exit_net(struct net * net)68*4882a593Smuzhiyunstatic __net_exit void sunrpc_exit_net(struct net *net) 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun rpc_pipefs_exit_net(net); 73*4882a593Smuzhiyun unix_gid_cache_destroy(net); 74*4882a593Smuzhiyun ip_map_cache_destroy(net); 75*4882a593Smuzhiyun rpc_proc_exit(net); 76*4882a593Smuzhiyun WARN_ON_ONCE(!list_empty(&sn->all_clients)); 77*4882a593Smuzhiyun } 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun static struct pernet_operations sunrpc_net_ops = { 80*4882a593Smuzhiyun .init = sunrpc_init_net, 81*4882a593Smuzhiyun .exit = sunrpc_exit_net, 82*4882a593Smuzhiyun .id = &sunrpc_net_id, 83*4882a593Smuzhiyun .size = sizeof(struct sunrpc_net), 84*4882a593Smuzhiyun }; 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun static int __init init_sunrpc(void)87*4882a593Smuzhiyuninit_sunrpc(void) 88*4882a593Smuzhiyun { 89*4882a593Smuzhiyun int err = rpc_init_mempool(); 90*4882a593Smuzhiyun if (err) 91*4882a593Smuzhiyun goto out; 92*4882a593Smuzhiyun err = rpcauth_init_module(); 93*4882a593Smuzhiyun if (err) 94*4882a593Smuzhiyun goto out2; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun cache_initialize(); 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun err = register_pernet_subsys(&sunrpc_net_ops); 99*4882a593Smuzhiyun if (err) 100*4882a593Smuzhiyun goto out3; 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun err = register_rpc_pipefs(); 103*4882a593Smuzhiyun if (err) 104*4882a593Smuzhiyun goto out4; 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun sunrpc_debugfs_init(); 107*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 108*4882a593Smuzhiyun rpc_register_sysctl(); 109*4882a593Smuzhiyun #endif 110*4882a593Smuzhiyun svc_init_xprt_sock(); /* svc sock transport */ 111*4882a593Smuzhiyun init_socket_xprt(); /* clnt sock transport */ 112*4882a593Smuzhiyun return 0; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun out4: 115*4882a593Smuzhiyun unregister_pernet_subsys(&sunrpc_net_ops); 116*4882a593Smuzhiyun out3: 117*4882a593Smuzhiyun rpcauth_remove_module(); 118*4882a593Smuzhiyun out2: 119*4882a593Smuzhiyun rpc_destroy_mempool(); 120*4882a593Smuzhiyun out: 121*4882a593Smuzhiyun return err; 122*4882a593Smuzhiyun } 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun static void __exit cleanup_sunrpc(void)125*4882a593Smuzhiyuncleanup_sunrpc(void) 126*4882a593Smuzhiyun { 127*4882a593Smuzhiyun rpc_cleanup_clids(); 128*4882a593Smuzhiyun rpcauth_remove_module(); 129*4882a593Smuzhiyun cleanup_socket_xprt(); 130*4882a593Smuzhiyun svc_cleanup_xprt_sock(); 131*4882a593Smuzhiyun sunrpc_debugfs_exit(); 132*4882a593Smuzhiyun unregister_rpc_pipefs(); 133*4882a593Smuzhiyun rpc_destroy_mempool(); 134*4882a593Smuzhiyun unregister_pernet_subsys(&sunrpc_net_ops); 135*4882a593Smuzhiyun auth_domain_cleanup(); 136*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 137*4882a593Smuzhiyun rpc_unregister_sysctl(); 138*4882a593Smuzhiyun #endif 139*4882a593Smuzhiyun rcu_barrier(); /* Wait for completion of call_rcu()'s */ 140*4882a593Smuzhiyun } 141*4882a593Smuzhiyun MODULE_LICENSE("GPL"); 142*4882a593Smuzhiyun MODULE_IMPORT_NS(VFS_internal_I_am_really_a_filesystem_and_am_NOT_a_driver); 143*4882a593Smuzhiyun fs_initcall(init_sunrpc); /* Ensure we're initialised before nfs */ 144*4882a593Smuzhiyun module_exit(cleanup_sunrpc); 145