2006-01-18 12:30:29 +03:00
/******************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* * Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2007-11-07 18:06:49 +03:00
* * Copyright ( C ) 2004 - 2007 Red Hat , Inc . All rights reserved .
2006-01-18 12:30:29 +03: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 "dlm_internal.h"
# include "config.h"
# include "memory.h"
2006-12-07 07:33:20 +03:00
static struct kmem_cache * lkb_cache ;
2006-01-18 12:30:29 +03:00
2008-02-01 20:53:46 +03:00
int __init dlm_memory_init ( void )
2006-01-18 12:30:29 +03:00
{
int ret = 0 ;
lkb_cache = kmem_cache_create ( " dlm_lkb " , sizeof ( struct dlm_lkb ) ,
2007-07-20 05:11:58 +04:00
__alignof__ ( struct dlm_lkb ) , 0 , NULL ) ;
2006-01-18 12:30:29 +03:00
if ( ! lkb_cache )
ret = - ENOMEM ;
return ret ;
}
void dlm_memory_exit ( void )
{
if ( lkb_cache )
kmem_cache_destroy ( lkb_cache ) ;
}
2007-11-07 18:06:49 +03:00
char * dlm_allocate_lvb ( struct dlm_ls * ls )
2006-01-18 12:30:29 +03:00
{
char * p ;
2009-12-01 01:34:43 +03:00
p = kzalloc ( ls - > ls_lvblen , GFP_NOFS ) ;
2006-01-18 12:30:29 +03:00
return p ;
}
2007-11-07 18:06:49 +03:00
void dlm_free_lvb ( char * p )
2006-01-18 12:30:29 +03:00
{
kfree ( p ) ;
}
/* FIXME: have some minimal space built-in to rsb for the name and
kmalloc a separate name if needed , like dentries are done */
2007-11-07 18:06:49 +03:00
struct dlm_rsb * dlm_allocate_rsb ( struct dlm_ls * ls , int namelen )
2006-01-18 12:30:29 +03:00
{
struct dlm_rsb * r ;
DLM_ASSERT ( namelen < = DLM_RESNAME_MAXLEN , ) ;
2009-12-01 01:34:43 +03:00
r = kzalloc ( sizeof ( * r ) + namelen , GFP_NOFS ) ;
2006-01-18 12:30:29 +03:00
return r ;
}
2007-11-07 18:06:49 +03:00
void dlm_free_rsb ( struct dlm_rsb * r )
2006-01-18 12:30:29 +03:00
{
if ( r - > res_lvbptr )
2007-11-07 18:06:49 +03:00
dlm_free_lvb ( r - > res_lvbptr ) ;
2006-01-18 12:30:29 +03:00
kfree ( r ) ;
}
2007-11-07 18:06:49 +03:00
struct dlm_lkb * dlm_allocate_lkb ( struct dlm_ls * ls )
2006-01-18 12:30:29 +03:00
{
struct dlm_lkb * lkb ;
2009-12-01 01:34:43 +03:00
lkb = kmem_cache_zalloc ( lkb_cache , GFP_NOFS ) ;
2006-01-18 12:30:29 +03:00
return lkb ;
}
2007-11-07 18:06:49 +03:00
void dlm_free_lkb ( struct dlm_lkb * lkb )
2006-01-18 12:30:29 +03:00
{
2006-07-13 01:44:04 +04:00
if ( lkb - > lkb_flags & DLM_IFL_USER ) {
struct dlm_user_args * ua ;
2008-02-07 08:27:04 +03:00
ua = lkb - > lkb_ua ;
2006-07-13 01:44:04 +04:00
if ( ua ) {
if ( ua - > lksb . sb_lvbptr )
kfree ( ua - > lksb . sb_lvbptr ) ;
kfree ( ua ) ;
}
}
2006-01-18 12:30:29 +03:00
kmem_cache_free ( lkb_cache , lkb ) ;
}