2006-01-16 16:50:04 +00:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 15:09:15 -04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 16:50:04 +00:00
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
* of the GNU General Public License v .2 .
*/
# include <linux/sched.h>
# include <linux/slab.h>
# include <linux/spinlock.h>
# include <linux/completion.h>
# include <linux/buffer_head.h>
# include <linux/module.h>
# include <linux/init.h>
2006-02-27 17:23:27 -05:00
# include <linux/gfs2_ondisk.h>
2006-01-16 16:50:04 +00:00
# include "gfs2.h"
2006-02-27 17:23:27 -05:00
# include "lm_interface.h"
# include "incore.h"
2006-01-16 16:50:04 +00:00
# include "ops_fstype.h"
# include "sys.h"
2006-02-27 17:23:27 -05:00
# include "util.h"
2006-01-16 16:50:04 +00:00
2006-05-18 16:25:27 -04:00
static void gfs2_init_inode_once ( void * foo , kmem_cache_t * cachep , unsigned long flags )
{
struct gfs2_inode * ip = foo ;
if ( ( flags & ( SLAB_CTOR_VERIFY | SLAB_CTOR_CONSTRUCTOR ) ) = =
SLAB_CTOR_CONSTRUCTOR ) {
inode_init_once ( & ip - > i_inode ) ;
spin_lock_init ( & ip - > i_spin ) ;
init_rwsem ( & ip - > i_rw_mutex ) ;
memset ( ip - > i_cache , 0 , sizeof ( ip - > i_cache ) ) ;
}
}
2006-01-16 16:50:04 +00:00
/**
* init_gfs2_fs - Register GFS2 as a filesystem
*
* Returns : 0 on success , error code on failure
*/
static int __init init_gfs2_fs ( void )
{
int error ;
gfs2_init_lmh ( ) ;
error = gfs2_sys_init ( ) ;
if ( error )
return error ;
error = - ENOMEM ;
gfs2_glock_cachep = kmem_cache_create ( " gfs2_glock " ,
sizeof ( struct gfs2_glock ) ,
0 , 0 , NULL , NULL ) ;
if ( ! gfs2_glock_cachep )
goto fail ;
gfs2_inode_cachep = kmem_cache_create ( " gfs2_inode " ,
sizeof ( struct gfs2_inode ) ,
2006-05-18 16:25:27 -04:00
0 , ( SLAB_RECLAIM_ACCOUNT |
SLAB_PANIC | SLAB_MEM_SPREAD ) ,
gfs2_init_inode_once , NULL ) ;
2006-01-16 16:50:04 +00:00
if ( ! gfs2_inode_cachep )
goto fail ;
gfs2_bufdata_cachep = kmem_cache_create ( " gfs2_bufdata " ,
sizeof ( struct gfs2_bufdata ) ,
0 , 0 , NULL , NULL ) ;
if ( ! gfs2_bufdata_cachep )
goto fail ;
error = register_filesystem ( & gfs2_fs_type ) ;
if ( error )
goto fail ;
2006-03-02 16:33:41 -05:00
error = register_filesystem ( & gfs2meta_fs_type ) ;
if ( error )
goto fail_unregister ;
2006-01-16 16:50:04 +00:00
printk ( " GFS2 (built %s %s) installed \n " , __DATE__ , __TIME__ ) ;
return 0 ;
2006-03-02 16:33:41 -05:00
fail_unregister :
unregister_filesystem ( & gfs2_fs_type ) ;
fail :
2006-01-16 16:50:04 +00:00
if ( gfs2_bufdata_cachep )
kmem_cache_destroy ( gfs2_bufdata_cachep ) ;
if ( gfs2_inode_cachep )
kmem_cache_destroy ( gfs2_inode_cachep ) ;
if ( gfs2_glock_cachep )
kmem_cache_destroy ( gfs2_glock_cachep ) ;
gfs2_sys_uninit ( ) ;
return error ;
}
/**
* exit_gfs2_fs - Unregister the file system
*
*/
static void __exit exit_gfs2_fs ( void )
{
unregister_filesystem ( & gfs2_fs_type ) ;
2006-03-02 16:33:41 -05:00
unregister_filesystem ( & gfs2meta_fs_type ) ;
2006-01-16 16:50:04 +00:00
kmem_cache_destroy ( gfs2_bufdata_cachep ) ;
kmem_cache_destroy ( gfs2_inode_cachep ) ;
kmem_cache_destroy ( gfs2_glock_cachep ) ;
gfs2_sys_uninit ( ) ;
}
MODULE_DESCRIPTION ( " Global File System " ) ;
MODULE_AUTHOR ( " Red Hat, Inc. " ) ;
MODULE_LICENSE ( " GPL " ) ;
module_init ( init_gfs2_fs ) ;
module_exit ( exit_gfs2_fs ) ;