]> err.no Git - linux-2.6/blob - fs/gfs2/main.c
Merge branch 'master'
[linux-2.6] / fs / gfs2 / main.c
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 v.2.
8  */
9
10 #include <linux/sched.h>
11 #include <linux/slab.h>
12 #include <linux/spinlock.h>
13 #include <linux/completion.h>
14 #include <linux/buffer_head.h>
15 #include <linux/module.h>
16 #include <linux/init.h>
17 #include <linux/gfs2_ondisk.h>
18
19 #include "gfs2.h"
20 #include "lm_interface.h"
21 #include "incore.h"
22 #include "ops_fstype.h"
23 #include "sys.h"
24 #include "util.h"
25
26 static void gfs2_init_inode_once(void *foo, kmem_cache_t *cachep, unsigned long flags)
27 {
28         struct gfs2_inode *ip = foo;
29         if ((flags & (SLAB_CTOR_VERIFY|SLAB_CTOR_CONSTRUCTOR)) ==
30             SLAB_CTOR_CONSTRUCTOR) {
31                 inode_init_once(&ip->i_inode);
32                 atomic_set(&ip->i_count, 0);
33                 ip->i_vnode = &ip->i_inode;
34                 spin_lock_init(&ip->i_spin);
35                 init_rwsem(&ip->i_rw_mutex);
36                 memset(ip->i_cache, 0, sizeof(ip->i_cache));
37         }
38 }
39
40 /**
41  * init_gfs2_fs - Register GFS2 as a filesystem
42  *
43  * Returns: 0 on success, error code on failure
44  */
45
46 static int __init init_gfs2_fs(void)
47 {
48         int error;
49
50         gfs2_init_lmh();
51
52         error = gfs2_sys_init();
53         if (error)
54                 return error;
55
56         error = -ENOMEM;
57
58         gfs2_glock_cachep = kmem_cache_create("gfs2_glock",
59                                               sizeof(struct gfs2_glock),
60                                               0, 0, NULL, NULL);
61         if (!gfs2_glock_cachep)
62                 goto fail;
63
64         gfs2_inode_cachep = kmem_cache_create("gfs2_inode",
65                                               sizeof(struct gfs2_inode),
66                                               0, (SLAB_RECLAIM_ACCOUNT|
67                                               SLAB_PANIC|SLAB_MEM_SPREAD),
68                                               gfs2_init_inode_once, NULL);
69         if (!gfs2_inode_cachep)
70                 goto fail;
71
72         gfs2_bufdata_cachep = kmem_cache_create("gfs2_bufdata",
73                                                 sizeof(struct gfs2_bufdata),
74                                                 0, 0, NULL, NULL);
75         if (!gfs2_bufdata_cachep)
76                 goto fail;
77
78         error = register_filesystem(&gfs2_fs_type);
79         if (error)
80                 goto fail;
81
82         error = register_filesystem(&gfs2meta_fs_type);
83         if (error)
84                 goto fail_unregister;
85
86         printk("GFS2 (built %s %s) installed\n", __DATE__, __TIME__);
87
88         return 0;
89
90 fail_unregister:
91         unregister_filesystem(&gfs2_fs_type);
92 fail:
93         if (gfs2_bufdata_cachep)
94                 kmem_cache_destroy(gfs2_bufdata_cachep);
95
96         if (gfs2_inode_cachep)
97                 kmem_cache_destroy(gfs2_inode_cachep);
98
99         if (gfs2_glock_cachep)
100                 kmem_cache_destroy(gfs2_glock_cachep);
101
102         gfs2_sys_uninit();
103         return error;
104 }
105
106 /**
107  * exit_gfs2_fs - Unregister the file system
108  *
109  */
110
111 static void __exit exit_gfs2_fs(void)
112 {
113         unregister_filesystem(&gfs2_fs_type);
114         unregister_filesystem(&gfs2meta_fs_type);
115
116         kmem_cache_destroy(gfs2_bufdata_cachep);
117         kmem_cache_destroy(gfs2_inode_cachep);
118         kmem_cache_destroy(gfs2_glock_cachep);
119
120         gfs2_sys_uninit();
121 }
122
123 MODULE_DESCRIPTION("Global File System");
124 MODULE_AUTHOR("Red Hat, Inc.");
125 MODULE_LICENSE("GPL");
126
127 module_init(init_gfs2_fs);
128 module_exit(exit_gfs2_fs);
129