ecfebaa3cff20c9719809773cef6c33de6a55053
[openafs.git] / src / afs / LINUX / osi_pag_module.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * Linux module support routines.
12  *
13  */
14 #include <afsconfig.h>
15 #include "afs/param.h"
16
17 RCSID
18     ("$Header$");
19
20 #include <linux/module.h> /* early to avoid printf->printk mapping */
21 #include "afs/sysincludes.h"
22 #include "afsincludes.h"
23 #include "h/unistd.h"           /* For syscall numbers. */
24 #include "h/mm.h"
25
26 #ifdef AFS_AMD64_LINUX20_ENV
27 #include <asm/ia32_unistd.h>
28 #endif
29 #ifdef AFS_SPARC64_LINUX20_ENV
30 #include <linux/ioctl32.h>
31 #endif
32
33 #include <linux/proc_fs.h>
34 #include <linux/slab.h>
35 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
36 #include <linux/init.h>
37 #include <linux/sched.h>
38 #include <linux/kernel.h>
39 #endif
40
41 static unsigned long nfs_server_addr = 0;
42 #if defined(module_param)
43 module_param(nfs_server_addr, long, 0);
44 #else
45 MODULE_PARM(nfs_server_addr,  "l");
46 #endif
47 MODULE_PARM_DESC(nfs_server_addr,  "IP Address of NFS Server");
48
49 static char *this_cell = 0;
50 #if defined(module_param_array) && LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9)
51 module_param_array(this_cell, charp, 0);
52 #else
53 MODULE_PARM(this_cell, "s");
54 #endif
55 MODULE_PARM_DESC(this_cell, "Local cell name");
56
57 #if defined(AFS_LINUX24_ENV)
58 DECLARE_MUTEX(afs_global_lock);
59 struct proc_dir_entry *openafs_procfs;
60 #else
61 struct semaphore afs_global_lock = MUTEX;
62 #endif
63 int afs_global_owner = 0;
64
65 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
66 int __init
67 afspag_init(void)
68 #else
69 int
70 init_module(void)
71 #endif
72 {
73     int err;
74
75     osi_Init();
76
77     err = osi_syscall_init();
78     if (err)
79         return err;
80 #ifdef AFS_LINUX24_ENV
81     openafs_procfs = proc_mkdir(PROC_FSDIRNAME, proc_root_fs);
82     osi_ioctl_init();
83 #endif
84
85     afspag_Init(htonl(nfs_server_addr));
86     if (this_cell)
87         afspag_SetPrimaryCell(this_cell);
88
89     return 0;
90 }
91
92 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
93 void __exit
94 afspag_cleanup(void)
95 #else
96 void
97 cleanup_module(void)
98 #endif
99 {
100     osi_syscall_clean();
101
102     osi_linux_free_afs_memory();
103
104 #ifdef AFS_LINUX24_ENV
105     osi_ioctl_clean();
106     remove_proc_entry(PROC_FSDIRNAME, proc_root_fs);
107 #endif
108     return;
109 }
110
111 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
112 MODULE_LICENSE("http://www.openafs.org/dl/license10.html");
113 module_init(afspag_init);
114 module_exit(afspag_cleanup);
115 #endif
116
117 #ifdef AFS_LINUX26_ENV
118 /* Hack alert!
119  * These will never be called in the standalone PAG manager, because
120  * they are only referenced in afs_InitReq, and nothing calls that.
121  * However, we need to define them in order to resolve the reference,
122  * unless we want to move afs_InitReq out of afs_osi_pag.c.
123  */
124 int osi_linux_nfs_initreq(struct vrequest *av, struct AFS_UCRED *cr, int *code)
125 {
126     *code = EACCES;
127     return 1;
128 }
129
130 int
131 afs_nfsclient_reqhandler(struct afs_exporter *exporter,
132                          struct AFS_UCRED **cred,
133                          afs_int32 host, afs_int32 *pagparam,
134                          struct afs_exporter **outexporter)
135 {
136     return EINVAL;
137 }
138 #endif