at v2.6.17-rc2 207 lines 5.1 kB view raw
1/* 2 * JFFS2 -- Journalling Flash File System, Version 2. 3 * 4 * Copyright (C) 2001-2003 Red Hat, Inc. 5 * 6 * Created by David Woodhouse <dwmw2@infradead.org> 7 * 8 * For licensing information, see the file 'LICENCE' in this directory. 9 * 10 * $Id: malloc.c,v 1.31 2005/11/07 11:14:40 gleixner Exp $ 11 * 12 */ 13 14#include <linux/kernel.h> 15#include <linux/slab.h> 16#include <linux/init.h> 17#include <linux/jffs2.h> 18#include "nodelist.h" 19 20/* These are initialised to NULL in the kernel startup code. 21 If you're porting to other operating systems, beware */ 22static kmem_cache_t *full_dnode_slab; 23static kmem_cache_t *raw_dirent_slab; 24static kmem_cache_t *raw_inode_slab; 25static kmem_cache_t *tmp_dnode_info_slab; 26static kmem_cache_t *raw_node_ref_slab; 27static kmem_cache_t *node_frag_slab; 28static kmem_cache_t *inode_cache_slab; 29 30int __init jffs2_create_slab_caches(void) 31{ 32 full_dnode_slab = kmem_cache_create("jffs2_full_dnode", 33 sizeof(struct jffs2_full_dnode), 34 0, 0, NULL, NULL); 35 if (!full_dnode_slab) 36 goto err; 37 38 raw_dirent_slab = kmem_cache_create("jffs2_raw_dirent", 39 sizeof(struct jffs2_raw_dirent), 40 0, 0, NULL, NULL); 41 if (!raw_dirent_slab) 42 goto err; 43 44 raw_inode_slab = kmem_cache_create("jffs2_raw_inode", 45 sizeof(struct jffs2_raw_inode), 46 0, 0, NULL, NULL); 47 if (!raw_inode_slab) 48 goto err; 49 50 tmp_dnode_info_slab = kmem_cache_create("jffs2_tmp_dnode", 51 sizeof(struct jffs2_tmp_dnode_info), 52 0, 0, NULL, NULL); 53 if (!tmp_dnode_info_slab) 54 goto err; 55 56 raw_node_ref_slab = kmem_cache_create("jffs2_raw_node_ref", 57 sizeof(struct jffs2_raw_node_ref), 58 0, 0, NULL, NULL); 59 if (!raw_node_ref_slab) 60 goto err; 61 62 node_frag_slab = kmem_cache_create("jffs2_node_frag", 63 sizeof(struct jffs2_node_frag), 64 0, 0, NULL, NULL); 65 if (!node_frag_slab) 66 goto err; 67 68 inode_cache_slab = kmem_cache_create("jffs2_inode_cache", 69 sizeof(struct jffs2_inode_cache), 70 0, 0, NULL, NULL); 71 if (inode_cache_slab) 72 return 0; 73 err: 74 jffs2_destroy_slab_caches(); 75 return -ENOMEM; 76} 77 78void jffs2_destroy_slab_caches(void) 79{ 80 if(full_dnode_slab) 81 kmem_cache_destroy(full_dnode_slab); 82 if(raw_dirent_slab) 83 kmem_cache_destroy(raw_dirent_slab); 84 if(raw_inode_slab) 85 kmem_cache_destroy(raw_inode_slab); 86 if(tmp_dnode_info_slab) 87 kmem_cache_destroy(tmp_dnode_info_slab); 88 if(raw_node_ref_slab) 89 kmem_cache_destroy(raw_node_ref_slab); 90 if(node_frag_slab) 91 kmem_cache_destroy(node_frag_slab); 92 if(inode_cache_slab) 93 kmem_cache_destroy(inode_cache_slab); 94} 95 96struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) 97{ 98 struct jffs2_full_dirent *ret; 99 ret = kmalloc(sizeof(struct jffs2_full_dirent) + namesize, GFP_KERNEL); 100 dbg_memalloc("%p\n", ret); 101 return ret; 102} 103 104void jffs2_free_full_dirent(struct jffs2_full_dirent *x) 105{ 106 dbg_memalloc("%p\n", x); 107 kfree(x); 108} 109 110struct jffs2_full_dnode *jffs2_alloc_full_dnode(void) 111{ 112 struct jffs2_full_dnode *ret; 113 ret = kmem_cache_alloc(full_dnode_slab, GFP_KERNEL); 114 dbg_memalloc("%p\n", ret); 115 return ret; 116} 117 118void jffs2_free_full_dnode(struct jffs2_full_dnode *x) 119{ 120 dbg_memalloc("%p\n", x); 121 kmem_cache_free(full_dnode_slab, x); 122} 123 124struct jffs2_raw_dirent *jffs2_alloc_raw_dirent(void) 125{ 126 struct jffs2_raw_dirent *ret; 127 ret = kmem_cache_alloc(raw_dirent_slab, GFP_KERNEL); 128 dbg_memalloc("%p\n", ret); 129 return ret; 130} 131 132void jffs2_free_raw_dirent(struct jffs2_raw_dirent *x) 133{ 134 dbg_memalloc("%p\n", x); 135 kmem_cache_free(raw_dirent_slab, x); 136} 137 138struct jffs2_raw_inode *jffs2_alloc_raw_inode(void) 139{ 140 struct jffs2_raw_inode *ret; 141 ret = kmem_cache_alloc(raw_inode_slab, GFP_KERNEL); 142 dbg_memalloc("%p\n", ret); 143 return ret; 144} 145 146void jffs2_free_raw_inode(struct jffs2_raw_inode *x) 147{ 148 dbg_memalloc("%p\n", x); 149 kmem_cache_free(raw_inode_slab, x); 150} 151 152struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void) 153{ 154 struct jffs2_tmp_dnode_info *ret; 155 ret = kmem_cache_alloc(tmp_dnode_info_slab, GFP_KERNEL); 156 dbg_memalloc("%p\n", 157 ret); 158 return ret; 159} 160 161void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *x) 162{ 163 dbg_memalloc("%p\n", x); 164 kmem_cache_free(tmp_dnode_info_slab, x); 165} 166 167struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) 168{ 169 struct jffs2_raw_node_ref *ret; 170 ret = kmem_cache_alloc(raw_node_ref_slab, GFP_KERNEL); 171 dbg_memalloc("%p\n", ret); 172 return ret; 173} 174 175void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *x) 176{ 177 dbg_memalloc("%p\n", x); 178 kmem_cache_free(raw_node_ref_slab, x); 179} 180 181struct jffs2_node_frag *jffs2_alloc_node_frag(void) 182{ 183 struct jffs2_node_frag *ret; 184 ret = kmem_cache_alloc(node_frag_slab, GFP_KERNEL); 185 dbg_memalloc("%p\n", ret); 186 return ret; 187} 188 189void jffs2_free_node_frag(struct jffs2_node_frag *x) 190{ 191 dbg_memalloc("%p\n", x); 192 kmem_cache_free(node_frag_slab, x); 193} 194 195struct jffs2_inode_cache *jffs2_alloc_inode_cache(void) 196{ 197 struct jffs2_inode_cache *ret; 198 ret = kmem_cache_alloc(inode_cache_slab, GFP_KERNEL); 199 dbg_memalloc("%p\n", ret); 200 return ret; 201} 202 203void jffs2_free_inode_cache(struct jffs2_inode_cache *x) 204{ 205 dbg_memalloc("%p\n", x); 206 kmem_cache_free(inode_cache_slab, x); 207}