Commit | Line | Data |
---|---|---|
d7e09d03 PT |
1 | /* |
2 | * GPL HEADER START | |
3 | * | |
4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 only, | |
8 | * as published by the Free Software Foundation. | |
9 | * | |
10 | * This program is distributed in the hope that it will be useful, but | |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License version 2 for more details (a copy is included | |
14 | * in the LICENSE file that accompanied this code). | |
15 | * | |
16 | * You should have received a copy of the GNU General Public License | |
17 | * version 2 along with this program; If not, see | |
6a5b99a4 | 18 | * http://www.gnu.org/licenses/gpl-2.0.html |
d7e09d03 | 19 | * |
d7e09d03 PT |
20 | * GPL HEADER END |
21 | */ | |
22 | /* | |
23 | * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. | |
24 | * Use is subject to license terms. | |
25 | * | |
26 | * Copyright (c) 2011, Intel Corporation. | |
27 | */ | |
28 | /* | |
29 | * This file is part of Lustre, http://www.lustre.org/ | |
30 | * Lustre is a trademark of Sun Microsystems, Inc. | |
31 | */ | |
32 | ||
33 | #define DEBUG_SUBSYSTEM S_LLITE | |
34 | ||
35 | #include <linux/module.h> | |
36 | #include <linux/types.h> | |
67a235f5 GKH |
37 | #include "../include/lustre_lite.h" |
38 | #include "../include/lustre_ha.h" | |
39 | #include "../include/lustre_dlm.h" | |
d7e09d03 PT |
40 | #include <linux/init.h> |
41 | #include <linux/fs.h> | |
67a235f5 | 42 | #include "../include/lprocfs_status.h" |
d7e09d03 PT |
43 | #include "llite_internal.h" |
44 | ||
45 | static struct kmem_cache *ll_inode_cachep; | |
46 | ||
47 | static struct inode *ll_alloc_inode(struct super_block *sb) | |
48 | { | |
49 | struct ll_inode_info *lli; | |
50ffcb7e | 50 | |
d7e09d03 | 51 | ll_stats_ops_tally(ll_s2sbi(sb), LPROC_LL_ALLOC_INODE, 1); |
21068c46 | 52 | lli = kmem_cache_zalloc(ll_inode_cachep, GFP_NOFS); |
6e16818b | 53 | if (!lli) |
d7e09d03 PT |
54 | return NULL; |
55 | ||
56 | inode_init_once(&lli->lli_vfs_inode); | |
57 | return &lli->lli_vfs_inode; | |
58 | } | |
59 | ||
60 | static void ll_inode_destroy_callback(struct rcu_head *head) | |
61 | { | |
62 | struct inode *inode = container_of(head, struct inode, i_rcu); | |
63 | struct ll_inode_info *ptr = ll_i2info(inode); | |
50ffcb7e | 64 | |
50d30362 | 65 | kmem_cache_free(ll_inode_cachep, ptr); |
d7e09d03 PT |
66 | } |
67 | ||
68 | static void ll_destroy_inode(struct inode *inode) | |
69 | { | |
70 | call_rcu(&inode->i_rcu, ll_inode_destroy_callback); | |
71 | } | |
72 | ||
d7e09d03 | 73 | /* exported operations */ |
9d0b2b7a | 74 | struct super_operations lustre_super_operations = { |
d7e09d03 PT |
75 | .alloc_inode = ll_alloc_inode, |
76 | .destroy_inode = ll_destroy_inode, | |
77 | .evict_inode = ll_delete_inode, | |
78 | .put_super = ll_put_super, | |
79 | .statfs = ll_statfs, | |
80 | .umount_begin = ll_umount_begin, | |
81 | .remount_fs = ll_remount_fs, | |
82 | .show_options = ll_show_options, | |
83 | }; | |
69d19388 | 84 | MODULE_ALIAS_FS("lustre"); |
d7e09d03 PT |
85 | |
86 | void lustre_register_client_process_config(int (*cpc)(struct lustre_cfg *lcfg)); | |
87 | ||
e0f94113 | 88 | static int __init lustre_init(void) |
d7e09d03 | 89 | { |
d7e09d03 | 90 | lnet_process_id_t lnet_id; |
1f4fc343 | 91 | struct timespec64 ts; |
081fa9df | 92 | int i, rc, seed[2]; |
d7e09d03 PT |
93 | |
94 | CLASSERT(sizeof(LUSTRE_VOLATILE_HDR) == LUSTRE_VOLATILE_HDR_LEN + 1); | |
95 | ||
96 | /* print an address of _any_ initialized kernel symbol from this | |
97 | * module, to allow debugging with gdb that doesn't support data | |
c0894c6c OD |
98 | * symbols from modules. |
99 | */ | |
d7e09d03 PT |
100 | CDEBUG(D_INFO, "Lustre client module (%p).\n", |
101 | &lustre_super_operations); | |
102 | ||
081fa9df JH |
103 | rc = -ENOMEM; |
104 | ll_inode_cachep = kmem_cache_create("lustre_inode_cache", | |
cd94f231 OD |
105 | sizeof(struct ll_inode_info), 0, |
106 | SLAB_HWCACHE_ALIGN | SLAB_ACCOUNT, | |
5d097056 | 107 | NULL); |
6e16818b | 108 | if (!ll_inode_cachep) |
081fa9df JH |
109 | goto out_cache; |
110 | ||
d7e09d03 | 111 | ll_file_data_slab = kmem_cache_create("ll_file_data", |
e15ba45d OD |
112 | sizeof(struct ll_file_data), 0, |
113 | SLAB_HWCACHE_ALIGN, NULL); | |
6e16818b | 114 | if (!ll_file_data_slab) |
081fa9df | 115 | goto out_cache; |
d7e09d03 | 116 | |
ae7c0f48 OD |
117 | llite_root = debugfs_create_dir("llite", debugfs_lustre_root); |
118 | if (IS_ERR_OR_NULL(llite_root)) { | |
119 | rc = llite_root ? PTR_ERR(llite_root) : -ENOMEM; | |
120 | llite_root = NULL; | |
081fa9df | 121 | goto out_cache; |
d7e09d03 PT |
122 | } |
123 | ||
fd0d04ba OD |
124 | llite_kset = kset_create_and_add("llite", NULL, lustre_kobj); |
125 | if (!llite_kset) { | |
126 | rc = -ENOMEM; | |
ae7c0f48 | 127 | goto out_debugfs; |
fd0d04ba OD |
128 | } |
129 | ||
d7e09d03 PT |
130 | cfs_get_random_bytes(seed, sizeof(seed)); |
131 | ||
081fa9df | 132 | /* Nodes with small feet have little entropy. The NID for this |
c0894c6c OD |
133 | * node gives the most entropy in the low bits |
134 | */ | |
081fa9df JH |
135 | for (i = 0;; i++) { |
136 | if (LNetGetId(i, &lnet_id) == -ENOENT) | |
d7e09d03 | 137 | break; |
081fa9df JH |
138 | |
139 | if (LNET_NETTYP(LNET_NIDNET(lnet_id.nid)) != LOLND) | |
d7e09d03 | 140 | seed[0] ^= LNET_NIDADDR(lnet_id.nid); |
d7e09d03 PT |
141 | } |
142 | ||
1f4fc343 AB |
143 | ktime_get_ts64(&ts); |
144 | cfs_srand(ts.tv_sec ^ seed[0], ts.tv_nsec ^ seed[1]); | |
d7e09d03 | 145 | |
081fa9df JH |
146 | rc = vvp_global_init(); |
147 | if (rc != 0) | |
ef2e0f55 | 148 | goto out_sysfs; |
081fa9df | 149 | |
a37bec74 JH |
150 | cl_inode_fini_env = cl_env_alloc(&cl_inode_fini_refcheck, |
151 | LCT_REMEMBER | LCT_NOREF); | |
152 | if (IS_ERR(cl_inode_fini_env)) { | |
153 | rc = PTR_ERR(cl_inode_fini_env); | |
154 | goto out_vvp; | |
155 | } | |
156 | ||
157 | cl_inode_fini_env->le_ctx.lc_cookie = 0x4; | |
158 | ||
081fa9df JH |
159 | rc = ll_xattr_init(); |
160 | if (rc != 0) | |
a37bec74 | 161 | goto out_inode_fini_env; |
081fa9df JH |
162 | |
163 | lustre_register_client_fill_super(ll_fill_super); | |
164 | lustre_register_kill_super_cb(ll_kill_super); | |
165 | lustre_register_client_process_config(ll_process_config); | |
166 | ||
167 | return 0; | |
168 | ||
a37bec74 JH |
169 | out_inode_fini_env: |
170 | cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); | |
081fa9df JH |
171 | out_vvp: |
172 | vvp_global_fini(); | |
fd0d04ba OD |
173 | out_sysfs: |
174 | kset_unregister(llite_kset); | |
ae7c0f48 OD |
175 | out_debugfs: |
176 | debugfs_remove(llite_root); | |
081fa9df | 177 | out_cache: |
ce85ed4d JL |
178 | kmem_cache_destroy(ll_inode_cachep); |
179 | kmem_cache_destroy(ll_file_data_slab); | |
d7e09d03 PT |
180 | return rc; |
181 | } | |
182 | ||
e0f94113 | 183 | static void __exit lustre_exit(void) |
d7e09d03 | 184 | { |
081fa9df JH |
185 | lustre_register_client_fill_super(NULL); |
186 | lustre_register_kill_super_cb(NULL); | |
187 | lustre_register_client_process_config(NULL); | |
188 | ||
ae7c0f48 | 189 | debugfs_remove(llite_root); |
fd0d04ba | 190 | kset_unregister(llite_kset); |
081fa9df | 191 | |
7fc1f831 | 192 | ll_xattr_fini(); |
a37bec74 | 193 | cl_env_put(cl_inode_fini_env, &cl_inode_fini_refcheck); |
d7e09d03 | 194 | vvp_global_fini(); |
d7e09d03 | 195 | |
081fa9df | 196 | kmem_cache_destroy(ll_inode_cachep); |
d7e09d03 | 197 | kmem_cache_destroy(ll_file_data_slab); |
d7e09d03 PT |
198 | } |
199 | ||
a0455471 | 200 | MODULE_AUTHOR("OpenSFS, Inc. <http://www.lustre.org/>"); |
57878e17 | 201 | MODULE_DESCRIPTION("Lustre Client File System"); |
5b0e50b9 | 202 | MODULE_VERSION(LUSTRE_VERSION_STRING); |
d7e09d03 PT |
203 | MODULE_LICENSE("GPL"); |
204 | ||
e0f94113 AD |
205 | module_init(lustre_init); |
206 | module_exit(lustre_exit); |