11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/net/sunrpc/sunrpc_syms.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Symbols exported by the sunrpc module. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Copyright (C) 1997 Olaf Kirch <okir@monad.swb.de> 71da177e4SLinus Torvalds */ 81da177e4SLinus Torvalds 91da177e4SLinus Torvalds #include <linux/module.h> 101da177e4SLinus Torvalds 111da177e4SLinus Torvalds #include <linux/types.h> 121da177e4SLinus Torvalds #include <linux/uio.h> 131da177e4SLinus Torvalds #include <linux/unistd.h> 141da177e4SLinus Torvalds #include <linux/init.h> 151da177e4SLinus Torvalds 161da177e4SLinus Torvalds #include <linux/sunrpc/sched.h> 171da177e4SLinus Torvalds #include <linux/sunrpc/clnt.h> 181da177e4SLinus Torvalds #include <linux/sunrpc/svc.h> 191da177e4SLinus Torvalds #include <linux/sunrpc/svcsock.h> 201da177e4SLinus Torvalds #include <linux/sunrpc/auth.h> 211da177e4SLinus Torvalds #include <linux/workqueue.h> 221da177e4SLinus Torvalds #include <linux/sunrpc/rpc_pipe_fs.h> 2349c36fccS\"Talpey, Thomas\ #include <linux/sunrpc/xprtsock.h> 241da177e4SLinus Torvalds 252f72c9b7SPavel Emelyanov #include "netns.h" 262f72c9b7SPavel Emelyanov 272f72c9b7SPavel Emelyanov int sunrpc_net_id; 28a1db410dSStanislav Kinsbursky EXPORT_SYMBOL_GPL(sunrpc_net_id); 292f72c9b7SPavel Emelyanov 302f72c9b7SPavel Emelyanov static __net_init int sunrpc_init_net(struct net *net) 312f72c9b7SPavel Emelyanov { 324f42d0d5SPavel Emelyanov int err; 3370abc49bSStanislav Kinsbursky struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 344f42d0d5SPavel Emelyanov 354f42d0d5SPavel Emelyanov err = rpc_proc_init(net); 364f42d0d5SPavel Emelyanov if (err) 374f42d0d5SPavel Emelyanov goto err_proc; 384f42d0d5SPavel Emelyanov 3990d51b02SPavel Emelyanov err = ip_map_cache_create(net); 4090d51b02SPavel Emelyanov if (err) 4190d51b02SPavel Emelyanov goto err_ipmap; 4290d51b02SPavel Emelyanov 4373393232SStanislav Kinsbursky err = unix_gid_cache_create(net); 4473393232SStanislav Kinsbursky if (err) 4573393232SStanislav Kinsbursky goto err_unixgid; 4673393232SStanislav Kinsbursky 47c21a588fSStanislav Kinsbursky rpc_pipefs_init_net(net); 4870abc49bSStanislav Kinsbursky INIT_LIST_HEAD(&sn->all_clients); 4970abc49bSStanislav Kinsbursky spin_lock_init(&sn->rpc_client_lock); 501d96e80fSStanislav Kinsbursky spin_lock_init(&sn->rpcb_clnt_lock); 512f72c9b7SPavel Emelyanov return 0; 524f42d0d5SPavel Emelyanov 5373393232SStanislav Kinsbursky err_unixgid: 5473393232SStanislav Kinsbursky ip_map_cache_destroy(net); 5590d51b02SPavel Emelyanov err_ipmap: 5690d51b02SPavel Emelyanov rpc_proc_exit(net); 574f42d0d5SPavel Emelyanov err_proc: 584f42d0d5SPavel Emelyanov return err; 592f72c9b7SPavel Emelyanov } 602f72c9b7SPavel Emelyanov 612f72c9b7SPavel Emelyanov static __net_exit void sunrpc_exit_net(struct net *net) 622f72c9b7SPavel Emelyanov { 6373393232SStanislav Kinsbursky unix_gid_cache_destroy(net); 6490d51b02SPavel Emelyanov ip_map_cache_destroy(net); 654f42d0d5SPavel Emelyanov rpc_proc_exit(net); 662f72c9b7SPavel Emelyanov } 672f72c9b7SPavel Emelyanov 682f72c9b7SPavel Emelyanov static struct pernet_operations sunrpc_net_ops = { 692f72c9b7SPavel Emelyanov .init = sunrpc_init_net, 702f72c9b7SPavel Emelyanov .exit = sunrpc_exit_net, 712f72c9b7SPavel Emelyanov .id = &sunrpc_net_id, 722f72c9b7SPavel Emelyanov .size = sizeof(struct sunrpc_net), 732f72c9b7SPavel Emelyanov }; 742f72c9b7SPavel Emelyanov 751da177e4SLinus Torvalds static int __init 761da177e4SLinus Torvalds init_sunrpc(void) 771da177e4SLinus Torvalds { 78adae0fe0SStanislav Kinsbursky int err = rpc_init_mempool(); 791da177e4SLinus Torvalds if (err) 801da177e4SLinus Torvalds goto out; 815d8d9a4dSTrond Myklebust err = rpcauth_init_module(); 825d8d9a4dSTrond Myklebust if (err) 83adae0fe0SStanislav Kinsbursky goto out2; 842f72c9b7SPavel Emelyanov 852f72c9b7SPavel Emelyanov cache_initialize(); 862f72c9b7SPavel Emelyanov 872f72c9b7SPavel Emelyanov err = register_pernet_subsys(&sunrpc_net_ops); 882f72c9b7SPavel Emelyanov if (err) 89adae0fe0SStanislav Kinsbursky goto out3; 90adae0fe0SStanislav Kinsbursky 91adae0fe0SStanislav Kinsbursky err = register_rpc_pipefs(); 92adae0fe0SStanislav Kinsbursky if (err) 932f72c9b7SPavel Emelyanov goto out4; 941da177e4SLinus Torvalds #ifdef RPC_DEBUG 951da177e4SLinus Torvalds rpc_register_sysctl(); 961da177e4SLinus Torvalds #endif 97360d8738STom Tucker svc_init_xprt_sock(); /* svc sock transport */ 98360d8738STom Tucker init_socket_xprt(); /* clnt sock transport */ 995d8d9a4dSTrond Myklebust return 0; 1002f72c9b7SPavel Emelyanov 1012f72c9b7SPavel Emelyanov out4: 102adae0fe0SStanislav Kinsbursky unregister_pernet_subsys(&sunrpc_net_ops); 1035d8d9a4dSTrond Myklebust out3: 104adae0fe0SStanislav Kinsbursky rpcauth_remove_module(); 1055d8d9a4dSTrond Myklebust out2: 106adae0fe0SStanislav Kinsbursky rpc_destroy_mempool(); 1071da177e4SLinus Torvalds out: 1081da177e4SLinus Torvalds return err; 1091da177e4SLinus Torvalds } 1101da177e4SLinus Torvalds 1111da177e4SLinus Torvalds static void __exit 1121da177e4SLinus Torvalds cleanup_sunrpc(void) 1131da177e4SLinus Torvalds { 114f5c2187cSTrond Myklebust rpcauth_remove_module(); 115282b32e1SChuck Lever cleanup_socket_xprt(); 116360d8738STom Tucker svc_cleanup_xprt_sock(); 1171da177e4SLinus Torvalds unregister_rpc_pipefs(); 1181da177e4SLinus Torvalds rpc_destroy_mempool(); 1192f72c9b7SPavel Emelyanov unregister_pernet_subsys(&sunrpc_net_ops); 1201da177e4SLinus Torvalds #ifdef RPC_DEBUG 1211da177e4SLinus Torvalds rpc_unregister_sysctl(); 1221da177e4SLinus Torvalds #endif 12375de874fSJesper Dangaard Brouer rcu_barrier(); /* Wait for completion of call_rcu()'s */ 1241da177e4SLinus Torvalds } 1251da177e4SLinus Torvalds MODULE_LICENSE("GPL"); 126405d8f8bSTrond Myklebust fs_initcall(init_sunrpc); /* Ensure we're initialised before nfs */ 1271da177e4SLinus Torvalds module_exit(cleanup_sunrpc); 128