|
|
| version 1.30, 2007/01/12 15:07:58 | version 1.31, 2007/08/06 15:41:56 |
|---|---|
| Line 471 dmapi_register( | Line 471 dmapi_register( |
| struct filesystem_dmapi_operations *dmapiops) | struct filesystem_dmapi_operations *dmapiops) |
| { | { |
| dm_vector_map_t *proto; | dm_vector_map_t *proto; |
| static int initialized = 0; | |
| wait_cache: | |
| spin_lock(&dm_fsys_lock); | |
| if (initialized == -1) { | |
| spin_unlock(&dm_fsys_lock); | |
| goto wait_cache; | |
| } | |
| if (initialized == 0) | |
| initialized = -1; | |
| spin_unlock(&dm_fsys_lock); | |
| if (initialized == -1) { | |
| ASSERT(dm_fsys_map_cachep == NULL); | |
| ASSERT(dm_fsys_vptr_cachep == NULL); | |
| dm_fsys_map_cachep = kmem_cache_create("dm_fsys_map", | |
| sizeof(dm_vector_map_t), 0, 0, NULL, NULL); | |
| dm_fsys_vptr_cachep = kmem_cache_create("dm_fsys_vptr", | |
| sizeof(dm_fsys_vector_t), 0, 0, NULL, NULL); | |
| spin_lock(&dm_fsys_lock); | |
| if ((dm_fsys_map_cachep == NULL) || | |
| (dm_fsys_map_cachep == NULL)) { | |
| initialized = 0; | |
| spin_unlock(&dm_fsys_lock); | |
| goto out_cache_free; | |
| } | |
| initialized = 1; | |
| spin_unlock(&dm_fsys_lock); | |
| } | |
| ASSERT_ALWAYS(initialized == 1); | |
| proto = kmem_cache_alloc(dm_fsys_map_cachep, GFP_KERNEL); | proto = kmem_cache_alloc(dm_fsys_map_cachep, GFP_KERNEL); |
| if (proto == NULL) { | if (proto == NULL) { |
| printk("%s/%d: kmem_cache_alloc(dm_fsys_map_cachep) returned NULL\n", __FUNCTION__, __LINE__); | printk("%s/%d: kmem_cache_alloc(dm_fsys_map_cachep) returned NULL\n", __FUNCTION__, __LINE__); |
| Line 521 wait_cache: | Line 488 wait_cache: |
| list_add(&proto->ftype_list, &dm_fsys_map); | list_add(&proto->ftype_list, &dm_fsys_map); |
| ftype_list(); | ftype_list(); |
| spin_unlock(&dm_fsys_lock); | spin_unlock(&dm_fsys_lock); |
| return; | |
| out_cache_free: | |
| if (dm_fsys_map_cachep) { | |
| kmem_cache_destroy(dm_fsys_map_cachep); | |
| dm_fsys_map_cachep = NULL; | |
| } | |
| if (dm_fsys_vptr_cachep) { | |
| kmem_cache_destroy(dm_fsys_vptr_cachep); | |
| dm_fsys_vptr_cachep = NULL; | |
| } | |
| } | } |
| /* Called by a filesystem module that is unloading from the kernel */ | /* Called by a filesystem module that is unloading from the kernel */ |
| void | void |
| dmapi_unregister( | dmapi_unregister( |