@ -40,6 +40,7 @@
# include <linux/module.h>
# include <linux/fs.h>
# include <linux/blkdev.h>
# include <linux/slab.h>
# include "rbd_types.h"
@ -344,6 +345,8 @@ static DEFINE_SPINLOCK(rbd_dev_list_lock);
static LIST_HEAD ( rbd_client_list ) ; /* clients */
static DEFINE_SPINLOCK ( rbd_client_list_lock ) ;
static struct kmem_cache * rbd_img_request_cache ;
static int rbd_img_request_submit ( struct rbd_img_request * img_request ) ;
static void rbd_dev_device_release ( struct device * dev ) ;
@ -1821,7 +1824,7 @@ static struct rbd_img_request *rbd_img_request_create(
{
struct rbd_img_request * img_request ;
img_request = kmalloc ( sizeof ( * img_request ) , GFP_ATOMIC ) ;
img_request = kmem_cache_alloc ( rbd_img_request_cache , GFP_ATOMIC ) ;
if ( ! img_request )
return NULL ;
@ -1884,7 +1887,7 @@ static void rbd_img_request_destroy(struct kref *kref)
if ( img_request_child_test ( img_request ) )
rbd_obj_request_put ( img_request - > obj_request ) ;
kfree ( img_request ) ;
kmem_cache_ free ( rbd_img_request_cache , img_request ) ;
}
static bool rbd_img_obj_end_request ( struct rbd_obj_request * obj_request )
@ -4992,6 +4995,26 @@ static void rbd_sysfs_cleanup(void)
device_unregister ( & rbd_root_dev ) ;
}
static int rbd_slab_init ( void )
{
rbd_assert ( ! rbd_img_request_cache ) ;
rbd_img_request_cache = kmem_cache_create ( " rbd_img_request " ,
sizeof ( struct rbd_img_request ) ,
__alignof__ ( struct rbd_img_request ) ,
0 , NULL ) ;
if ( rbd_img_request_cache )
return 0 ;
return - ENOMEM ;
}
static void rbd_slab_exit ( void )
{
rbd_assert ( rbd_img_request_cache ) ;
kmem_cache_destroy ( rbd_img_request_cache ) ;
rbd_img_request_cache = NULL ;
}
static int __init rbd_init ( void )
{
int rc ;
@ -5001,16 +5024,22 @@ static int __init rbd_init(void)
return - EINVAL ;
}
rc = rbd_sysfs _init ( ) ;
rc = rbd_slab _init ( ) ;
if ( rc )
return rc ;
pr_info ( " loaded " RBD_DRV_NAME_LONG " \n " ) ;
return 0 ;
rc = rbd_sysfs_init ( ) ;
if ( rc )
rbd_slab_exit ( ) ;
else
pr_info ( " loaded " RBD_DRV_NAME_LONG " \n " ) ;
return rc ;
}
static void __exit rbd_exit ( void )
{
rbd_sysfs_cleanup ( ) ;
rbd_slab_exit ( ) ;
}
module_init ( rbd_init ) ;