• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
3  * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
4  *
5  * This copyrighted material is made available to anyone wishing to use,
6  * modify, copy, or redistribute it subject to the terms and conditions
7  * of the GNU General Public License version 2.
8  */
9 
10 #include <linux/slab.h>
11 #include <linux/spinlock.h>
12 #include <linux/completion.h>
13 #include <linux/buffer_head.h>
14 #include <linux/module.h>
15 #include <linux/init.h>
16 #include <linux/gfs2_ondisk.h>
17 #include <linux/lm_interface.h>
18 #include <asm/atomic.h>
19 
20 #include "gfs2.h"
21 #include "incore.h"
22 #include "super.h"
23 #include "sys.h"
24 #include "util.h"
25 #include "glock.h"
26 
gfs2_init_inode_once(void * foo)27 static void gfs2_init_inode_once(void *foo)
28 {
29 	struct gfs2_inode *ip = foo;
30 
31 	inode_init_once(&ip->i_inode);
32 	init_rwsem(&ip->i_rw_mutex);
33 	INIT_LIST_HEAD(&ip->i_trunc_list);
34 	ip->i_alloc = NULL;
35 }
36 
gfs2_init_glock_once(void * foo)37 static void gfs2_init_glock_once(void *foo)
38 {
39 	struct gfs2_glock *gl = foo;
40 
41 	INIT_HLIST_NODE(&gl->gl_list);
42 	spin_lock_init(&gl->gl_spin);
43 	INIT_LIST_HEAD(&gl->gl_holders);
44 	gl->gl_lvb = NULL;
45 	atomic_set(&gl->gl_lvb_count, 0);
46 	INIT_LIST_HEAD(&gl->gl_lru);
47 	INIT_LIST_HEAD(&gl->gl_ail_list);
48 	atomic_set(&gl->gl_ail_count, 0);
49 }
50 
51 /**
52  * init_gfs2_fs - Register GFS2 as a filesystem
53  *
54  * Returns: 0 on success, error code on failure
55  */
56 
init_gfs2_fs(void)57 static int __init init_gfs2_fs(void)
58 {
59 	int error;
60 
61 	error = gfs2_sys_init();
62 	if (error)
63 		return error;
64 
65 	error = gfs2_glock_init();
66 	if (error)
67 		goto fail;
68 
69 	error = -ENOMEM;
70 	gfs2_glock_cachep = kmem_cache_create("gfs2_glock",
71 					      sizeof(struct gfs2_glock),
72 					      0, 0,
73 					      gfs2_init_glock_once);
74 	if (!gfs2_glock_cachep)
75 		goto fail;
76 
77 	gfs2_inode_cachep = kmem_cache_create("gfs2_inode",
78 					      sizeof(struct gfs2_inode),
79 					      0,  SLAB_RECLAIM_ACCOUNT|
80 					          SLAB_MEM_SPREAD,
81 					      gfs2_init_inode_once);
82 	if (!gfs2_inode_cachep)
83 		goto fail;
84 
85 	gfs2_bufdata_cachep = kmem_cache_create("gfs2_bufdata",
86 						sizeof(struct gfs2_bufdata),
87 					        0, 0, NULL);
88 	if (!gfs2_bufdata_cachep)
89 		goto fail;
90 
91 	gfs2_rgrpd_cachep = kmem_cache_create("gfs2_rgrpd",
92 					      sizeof(struct gfs2_rgrpd),
93 					      0, 0, NULL);
94 	if (!gfs2_rgrpd_cachep)
95 		goto fail;
96 
97 	gfs2_quotad_cachep = kmem_cache_create("gfs2_quotad",
98 					       sizeof(struct gfs2_quota_data),
99 					       0, 0, NULL);
100 	if (!gfs2_quotad_cachep)
101 		goto fail;
102 
103 	error = register_filesystem(&gfs2_fs_type);
104 	if (error)
105 		goto fail;
106 
107 	error = register_filesystem(&gfs2meta_fs_type);
108 	if (error)
109 		goto fail_unregister;
110 
111 	gfs2_register_debugfs();
112 
113 	printk("GFS2 (built %s %s) installed\n", __DATE__, __TIME__);
114 
115 	return 0;
116 
117 fail_unregister:
118 	unregister_filesystem(&gfs2_fs_type);
119 fail:
120 	gfs2_glock_exit();
121 
122 	if (gfs2_quotad_cachep)
123 		kmem_cache_destroy(gfs2_quotad_cachep);
124 
125 	if (gfs2_rgrpd_cachep)
126 		kmem_cache_destroy(gfs2_rgrpd_cachep);
127 
128 	if (gfs2_bufdata_cachep)
129 		kmem_cache_destroy(gfs2_bufdata_cachep);
130 
131 	if (gfs2_inode_cachep)
132 		kmem_cache_destroy(gfs2_inode_cachep);
133 
134 	if (gfs2_glock_cachep)
135 		kmem_cache_destroy(gfs2_glock_cachep);
136 
137 	gfs2_sys_uninit();
138 	return error;
139 }
140 
141 /**
142  * exit_gfs2_fs - Unregister the file system
143  *
144  */
145 
exit_gfs2_fs(void)146 static void __exit exit_gfs2_fs(void)
147 {
148 	gfs2_glock_exit();
149 	gfs2_unregister_debugfs();
150 	unregister_filesystem(&gfs2_fs_type);
151 	unregister_filesystem(&gfs2meta_fs_type);
152 
153 	kmem_cache_destroy(gfs2_quotad_cachep);
154 	kmem_cache_destroy(gfs2_rgrpd_cachep);
155 	kmem_cache_destroy(gfs2_bufdata_cachep);
156 	kmem_cache_destroy(gfs2_inode_cachep);
157 	kmem_cache_destroy(gfs2_glock_cachep);
158 
159 	gfs2_sys_uninit();
160 }
161 
162 MODULE_DESCRIPTION("Global File System");
163 MODULE_AUTHOR("Red Hat, Inc.");
164 MODULE_LICENSE("GPL");
165 
166 module_init(init_gfs2_fs);
167 module_exit(exit_gfs2_fs);
168 
169