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 <asm/atomic.h> 18 19 #include "gfs2.h" 20 #include "incore.h" 21 #include "super.h" 22 #include "sys.h" 23 #include "util.h" 24 #include "glock.h" 25 #include "quota.h" 26 27 static struct shrinker qd_shrinker = { 28 .shrink = gfs2_shrink_qd_memory, 29 .seeks = DEFAULT_SEEKS, 30 }; 31 32 static void gfs2_init_inode_once(void *foo) 33 { 34 struct gfs2_inode *ip = foo; 35 36 inode_init_once(&ip->i_inode); 37 init_rwsem(&ip->i_rw_mutex); 38 INIT_LIST_HEAD(&ip->i_trunc_list); 39 ip->i_alloc = NULL; 40 } 41 42 static void gfs2_init_glock_once(void *foo) 43 { 44 struct gfs2_glock *gl = foo; 45 46 INIT_HLIST_NODE(&gl->gl_list); 47 spin_lock_init(&gl->gl_spin); 48 INIT_LIST_HEAD(&gl->gl_holders); 49 INIT_LIST_HEAD(&gl->gl_lru); 50 INIT_LIST_HEAD(&gl->gl_ail_list); 51 atomic_set(&gl->gl_ail_count, 0); 52 } 53 54 /** 55 * init_gfs2_fs - Register GFS2 as a filesystem 56 * 57 * Returns: 0 on success, error code on failure 58 */ 59 60 static int __init init_gfs2_fs(void) 61 { 62 int error; 63 64 error = gfs2_sys_init(); 65 if (error) 66 return error; 67 68 error = gfs2_glock_init(); 69 if (error) 70 goto fail; 71 72 error = -ENOMEM; 73 gfs2_glock_cachep = kmem_cache_create("gfs2_glock", 74 sizeof(struct gfs2_glock), 75 0, 0, 76 gfs2_init_glock_once); 77 if (!gfs2_glock_cachep) 78 goto fail; 79 80 gfs2_inode_cachep = kmem_cache_create("gfs2_inode", 81 sizeof(struct gfs2_inode), 82 0, SLAB_RECLAIM_ACCOUNT| 83 SLAB_MEM_SPREAD, 84 gfs2_init_inode_once); 85 if (!gfs2_inode_cachep) 86 goto fail; 87 88 gfs2_bufdata_cachep = kmem_cache_create("gfs2_bufdata", 89 sizeof(struct gfs2_bufdata), 90 0, 0, NULL); 91 if (!gfs2_bufdata_cachep) 92 goto fail; 93 94 gfs2_rgrpd_cachep = kmem_cache_create("gfs2_rgrpd", 95 sizeof(struct gfs2_rgrpd), 96 0, 0, NULL); 97 if (!gfs2_rgrpd_cachep) 98 goto fail; 99 100 gfs2_quotad_cachep = kmem_cache_create("gfs2_quotad", 101 sizeof(struct gfs2_quota_data), 102 0, 0, NULL); 103 if (!gfs2_quotad_cachep) 104 goto fail; 105 106 register_shrinker(&qd_shrinker); 107 108 error = register_filesystem(&gfs2_fs_type); 109 if (error) 110 goto fail; 111 112 error = register_filesystem(&gfs2meta_fs_type); 113 if (error) 114 goto fail_unregister; 115 116 gfs2_register_debugfs(); 117 118 printk("GFS2 (built %s %s) installed\n", __DATE__, __TIME__); 119 120 return 0; 121 122 fail_unregister: 123 unregister_filesystem(&gfs2_fs_type); 124 fail: 125 unregister_shrinker(&qd_shrinker); 126 gfs2_glock_exit(); 127 128 if (gfs2_quotad_cachep) 129 kmem_cache_destroy(gfs2_quotad_cachep); 130 131 if (gfs2_rgrpd_cachep) 132 kmem_cache_destroy(gfs2_rgrpd_cachep); 133 134 if (gfs2_bufdata_cachep) 135 kmem_cache_destroy(gfs2_bufdata_cachep); 136 137 if (gfs2_inode_cachep) 138 kmem_cache_destroy(gfs2_inode_cachep); 139 140 if (gfs2_glock_cachep) 141 kmem_cache_destroy(gfs2_glock_cachep); 142 143 gfs2_sys_uninit(); 144 return error; 145 } 146 147 /** 148 * exit_gfs2_fs - Unregister the file system 149 * 150 */ 151 152 static void __exit exit_gfs2_fs(void) 153 { 154 unregister_shrinker(&qd_shrinker); 155 gfs2_glock_exit(); 156 gfs2_unregister_debugfs(); 157 unregister_filesystem(&gfs2_fs_type); 158 unregister_filesystem(&gfs2meta_fs_type); 159 160 kmem_cache_destroy(gfs2_quotad_cachep); 161 kmem_cache_destroy(gfs2_rgrpd_cachep); 162 kmem_cache_destroy(gfs2_bufdata_cachep); 163 kmem_cache_destroy(gfs2_inode_cachep); 164 kmem_cache_destroy(gfs2_glock_cachep); 165 166 gfs2_sys_uninit(); 167 } 168 169 MODULE_DESCRIPTION("Global File System"); 170 MODULE_AUTHOR("Red Hat, Inc."); 171 MODULE_LICENSE("GPL"); 172 173 module_init(init_gfs2_fs); 174 module_exit(exit_gfs2_fs); 175 176