linux/fs/gfs2/main.c
<<
>>
Prefs
   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/rcupdate.h>
  18#include <linux/rculist_bl.h>
  19#include <linux/atomic.h>
  20#include <linux/mempool.h>
  21
  22#include "gfs2.h"
  23#include "incore.h"
  24#include "super.h"
  25#include "sys.h"
  26#include "util.h"
  27#include "glock.h"
  28#include "quota.h"
  29#include "recovery.h"
  30#include "dir.h"
  31
  32struct workqueue_struct *gfs2_control_wq;
  33
  34static struct shrinker qd_shrinker = {
  35        .shrink = gfs2_shrink_qd_memory,
  36        .seeks = DEFAULT_SEEKS,
  37};
  38
  39static void gfs2_init_inode_once(void *foo)
  40{
  41        struct gfs2_inode *ip = foo;
  42
  43        inode_init_once(&ip->i_inode);
  44        init_rwsem(&ip->i_rw_mutex);
  45        INIT_LIST_HEAD(&ip->i_trunc_list);
  46        ip->i_res = NULL;
  47        ip->i_hash_cache = NULL;
  48}
  49
  50static void gfs2_init_glock_once(void *foo)
  51{
  52        struct gfs2_glock *gl = foo;
  53
  54        INIT_HLIST_BL_NODE(&gl->gl_list);
  55        spin_lock_init(&gl->gl_spin);
  56        INIT_LIST_HEAD(&gl->gl_holders);
  57        INIT_LIST_HEAD(&gl->gl_lru);
  58        INIT_LIST_HEAD(&gl->gl_ail_list);
  59        atomic_set(&gl->gl_ail_count, 0);
  60        atomic_set(&gl->gl_revokes, 0);
  61}
  62
  63static void gfs2_init_gl_aspace_once(void *foo)
  64{
  65        struct gfs2_glock *gl = foo;
  66        struct address_space *mapping = (struct address_space *)(gl + 1);
  67
  68        gfs2_init_glock_once(gl);
  69        address_space_init_once(mapping);
  70}
  71
  72/**
  73 * init_gfs2_fs - Register GFS2 as a filesystem
  74 *
  75 * Returns: 0 on success, error code on failure
  76 */
  77
  78static int __init init_gfs2_fs(void)
  79{
  80        int error;
  81
  82        gfs2_str2qstr(&gfs2_qdot, ".");
  83        gfs2_str2qstr(&gfs2_qdotdot, "..");
  84
  85        error = gfs2_sys_init();
  86        if (error)
  87                return error;
  88
  89        error = gfs2_glock_init();
  90        if (error)
  91                goto fail;
  92
  93        error = -ENOMEM;
  94        gfs2_glock_cachep = kmem_cache_create("gfs2_glock",
  95                                              sizeof(struct gfs2_glock),
  96                                              0, 0,
  97                                              gfs2_init_glock_once);
  98        if (!gfs2_glock_cachep)
  99                goto fail;
 100
 101        gfs2_glock_aspace_cachep = kmem_cache_create("gfs2_glock(aspace)",
 102                                        sizeof(struct gfs2_glock) +
 103                                        sizeof(struct address_space),
 104                                        0, 0, gfs2_init_gl_aspace_once);
 105
 106        if (!gfs2_glock_aspace_cachep)
 107                goto fail;
 108
 109        gfs2_inode_cachep = kmem_cache_create("gfs2_inode",
 110                                              sizeof(struct gfs2_inode),
 111                                              0,  SLAB_RECLAIM_ACCOUNT|
 112                                                  SLAB_MEM_SPREAD,
 113                                              gfs2_init_inode_once);
 114        if (!gfs2_inode_cachep)
 115                goto fail;
 116
 117        gfs2_bufdata_cachep = kmem_cache_create("gfs2_bufdata",
 118                                                sizeof(struct gfs2_bufdata),
 119                                                0, 0, NULL);
 120        if (!gfs2_bufdata_cachep)
 121                goto fail;
 122
 123        gfs2_rgrpd_cachep = kmem_cache_create("gfs2_rgrpd",
 124                                              sizeof(struct gfs2_rgrpd),
 125                                              0, 0, NULL);
 126        if (!gfs2_rgrpd_cachep)
 127                goto fail;
 128
 129        gfs2_quotad_cachep = kmem_cache_create("gfs2_quotad",
 130                                               sizeof(struct gfs2_quota_data),
 131                                               0, 0, NULL);
 132        if (!gfs2_quotad_cachep)
 133                goto fail;
 134
 135        gfs2_rsrv_cachep = kmem_cache_create("gfs2_mblk",
 136                                             sizeof(struct gfs2_blkreserv),
 137                                               0, 0, NULL);
 138        if (!gfs2_rsrv_cachep)
 139                goto fail;
 140
 141        register_shrinker(&qd_shrinker);
 142
 143        error = register_filesystem(&gfs2_fs_type);
 144        if (error)
 145                goto fail;
 146
 147        error = register_filesystem(&gfs2meta_fs_type);
 148        if (error)
 149                goto fail_unregister;
 150
 151        error = -ENOMEM;
 152        gfs_recovery_wq = alloc_workqueue("gfs_recovery",
 153                                          WQ_MEM_RECLAIM | WQ_FREEZABLE, 0);
 154        if (!gfs_recovery_wq)
 155                goto fail_wq;
 156
 157        gfs2_control_wq = alloc_workqueue("gfs2_control",
 158                               WQ_NON_REENTRANT | WQ_UNBOUND | WQ_FREEZABLE, 0);
 159        if (!gfs2_control_wq)
 160                goto fail_recovery;
 161
 162        gfs2_page_pool = mempool_create_page_pool(64, 0);
 163        if (!gfs2_page_pool)
 164                goto fail_control;
 165
 166        gfs2_register_debugfs();
 167
 168        printk("GFS2 installed\n");
 169
 170        return 0;
 171
 172fail_control:
 173        destroy_workqueue(gfs2_control_wq);
 174fail_recovery:
 175        destroy_workqueue(gfs_recovery_wq);
 176fail_wq:
 177        unregister_filesystem(&gfs2meta_fs_type);
 178fail_unregister:
 179        unregister_filesystem(&gfs2_fs_type);
 180fail:
 181        unregister_shrinker(&qd_shrinker);
 182        gfs2_glock_exit();
 183
 184        if (gfs2_rsrv_cachep)
 185                kmem_cache_destroy(gfs2_rsrv_cachep);
 186
 187        if (gfs2_quotad_cachep)
 188                kmem_cache_destroy(gfs2_quotad_cachep);
 189
 190        if (gfs2_rgrpd_cachep)
 191                kmem_cache_destroy(gfs2_rgrpd_cachep);
 192
 193        if (gfs2_bufdata_cachep)
 194                kmem_cache_destroy(gfs2_bufdata_cachep);
 195
 196        if (gfs2_inode_cachep)
 197                kmem_cache_destroy(gfs2_inode_cachep);
 198
 199        if (gfs2_glock_aspace_cachep)
 200                kmem_cache_destroy(gfs2_glock_aspace_cachep);
 201
 202        if (gfs2_glock_cachep)
 203                kmem_cache_destroy(gfs2_glock_cachep);
 204
 205        gfs2_sys_uninit();
 206        return error;
 207}
 208
 209/**
 210 * exit_gfs2_fs - Unregister the file system
 211 *
 212 */
 213
 214static void __exit exit_gfs2_fs(void)
 215{
 216        unregister_shrinker(&qd_shrinker);
 217        gfs2_glock_exit();
 218        gfs2_unregister_debugfs();
 219        unregister_filesystem(&gfs2_fs_type);
 220        unregister_filesystem(&gfs2meta_fs_type);
 221        destroy_workqueue(gfs_recovery_wq);
 222        destroy_workqueue(gfs2_control_wq);
 223
 224        rcu_barrier();
 225
 226        mempool_destroy(gfs2_page_pool);
 227        kmem_cache_destroy(gfs2_rsrv_cachep);
 228        kmem_cache_destroy(gfs2_quotad_cachep);
 229        kmem_cache_destroy(gfs2_rgrpd_cachep);
 230        kmem_cache_destroy(gfs2_bufdata_cachep);
 231        kmem_cache_destroy(gfs2_inode_cachep);
 232        kmem_cache_destroy(gfs2_glock_aspace_cachep);
 233        kmem_cache_destroy(gfs2_glock_cachep);
 234
 235        gfs2_sys_uninit();
 236}
 237
 238MODULE_DESCRIPTION("Global File System");
 239MODULE_AUTHOR("Red Hat, Inc.");
 240MODULE_LICENSE("GPL");
 241
 242module_init(init_gfs2_fs);
 243module_exit(exit_gfs2_fs);
 244
 245
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.