11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * JFFS2 -- Journalling Flash File System, Version 2. 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 2001-2003 Red Hat, Inc. 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * Created by David Woodhouse <dwmw2@infradead.org> 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * For licensing information, see the file 'LICENCE' in this directory. 91da177e4SLinus Torvalds * 10733802d9SArtem B. Bityutskiy * $Id: malloc.c,v 1.30 2005/09/20 14:27:34 dedekind Exp $ 111da177e4SLinus Torvalds * 121da177e4SLinus Torvalds */ 131da177e4SLinus Torvalds 141da177e4SLinus Torvalds #include <linux/kernel.h> 151da177e4SLinus Torvalds #include <linux/slab.h> 161da177e4SLinus Torvalds #include <linux/init.h> 171da177e4SLinus Torvalds #include <linux/jffs2.h> 181da177e4SLinus Torvalds #include "nodelist.h" 191da177e4SLinus Torvalds 201da177e4SLinus Torvalds /* These are initialised to NULL in the kernel startup code. 211da177e4SLinus Torvalds If you're porting to other operating systems, beware */ 221da177e4SLinus Torvalds static kmem_cache_t *full_dnode_slab; 231da177e4SLinus Torvalds static kmem_cache_t *raw_dirent_slab; 241da177e4SLinus Torvalds static kmem_cache_t *raw_inode_slab; 251da177e4SLinus Torvalds static kmem_cache_t *tmp_dnode_info_slab; 261da177e4SLinus Torvalds static kmem_cache_t *raw_node_ref_slab; 271da177e4SLinus Torvalds static kmem_cache_t *node_frag_slab; 281da177e4SLinus Torvalds static kmem_cache_t *inode_cache_slab; 291da177e4SLinus Torvalds 301da177e4SLinus Torvalds int __init jffs2_create_slab_caches(void) 311da177e4SLinus Torvalds { 321da177e4SLinus Torvalds full_dnode_slab = kmem_cache_create("jffs2_full_dnode", 331da177e4SLinus Torvalds sizeof(struct jffs2_full_dnode), 34f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 351da177e4SLinus Torvalds if (!full_dnode_slab) 361da177e4SLinus Torvalds goto err; 371da177e4SLinus Torvalds 381da177e4SLinus Torvalds raw_dirent_slab = kmem_cache_create("jffs2_raw_dirent", 391da177e4SLinus Torvalds sizeof(struct jffs2_raw_dirent), 40f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 411da177e4SLinus Torvalds if (!raw_dirent_slab) 421da177e4SLinus Torvalds goto err; 431da177e4SLinus Torvalds 441da177e4SLinus Torvalds raw_inode_slab = kmem_cache_create("jffs2_raw_inode", 451da177e4SLinus Torvalds sizeof(struct jffs2_raw_inode), 46f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 471da177e4SLinus Torvalds if (!raw_inode_slab) 481da177e4SLinus Torvalds goto err; 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds tmp_dnode_info_slab = kmem_cache_create("jffs2_tmp_dnode", 511da177e4SLinus Torvalds sizeof(struct jffs2_tmp_dnode_info), 52f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 531da177e4SLinus Torvalds if (!tmp_dnode_info_slab) 541da177e4SLinus Torvalds goto err; 551da177e4SLinus Torvalds 561da177e4SLinus Torvalds raw_node_ref_slab = kmem_cache_create("jffs2_raw_node_ref", 571da177e4SLinus Torvalds sizeof(struct jffs2_raw_node_ref), 58f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 591da177e4SLinus Torvalds if (!raw_node_ref_slab) 601da177e4SLinus Torvalds goto err; 611da177e4SLinus Torvalds 621da177e4SLinus Torvalds node_frag_slab = kmem_cache_create("jffs2_node_frag", 631da177e4SLinus Torvalds sizeof(struct jffs2_node_frag), 64f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 651da177e4SLinus Torvalds if (!node_frag_slab) 661da177e4SLinus Torvalds goto err; 671da177e4SLinus Torvalds 681da177e4SLinus Torvalds inode_cache_slab = kmem_cache_create("jffs2_inode_cache", 691da177e4SLinus Torvalds sizeof(struct jffs2_inode_cache), 70f538c96bSArtem B. Bityutskiy 0, 0, NULL, NULL); 711da177e4SLinus Torvalds if (inode_cache_slab) 721da177e4SLinus Torvalds return 0; 731da177e4SLinus Torvalds err: 741da177e4SLinus Torvalds jffs2_destroy_slab_caches(); 751da177e4SLinus Torvalds return -ENOMEM; 761da177e4SLinus Torvalds } 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds void jffs2_destroy_slab_caches(void) 791da177e4SLinus Torvalds { 801da177e4SLinus Torvalds if(full_dnode_slab) 811da177e4SLinus Torvalds kmem_cache_destroy(full_dnode_slab); 821da177e4SLinus Torvalds if(raw_dirent_slab) 831da177e4SLinus Torvalds kmem_cache_destroy(raw_dirent_slab); 841da177e4SLinus Torvalds if(raw_inode_slab) 851da177e4SLinus Torvalds kmem_cache_destroy(raw_inode_slab); 861da177e4SLinus Torvalds if(tmp_dnode_info_slab) 871da177e4SLinus Torvalds kmem_cache_destroy(tmp_dnode_info_slab); 881da177e4SLinus Torvalds if(raw_node_ref_slab) 891da177e4SLinus Torvalds kmem_cache_destroy(raw_node_ref_slab); 901da177e4SLinus Torvalds if(node_frag_slab) 911da177e4SLinus Torvalds kmem_cache_destroy(node_frag_slab); 921da177e4SLinus Torvalds if(inode_cache_slab) 931da177e4SLinus Torvalds kmem_cache_destroy(inode_cache_slab); 941da177e4SLinus Torvalds } 951da177e4SLinus Torvalds 961da177e4SLinus Torvalds struct jffs2_full_dirent *jffs2_alloc_full_dirent(int namesize) 971da177e4SLinus Torvalds { 98f538c96bSArtem B. Bityutskiy struct jffs2_full_dirent *ret; 99f538c96bSArtem B. Bityutskiy ret = kmalloc(sizeof(struct jffs2_full_dirent) + namesize, GFP_KERNEL); 100733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 101f538c96bSArtem B. Bityutskiy return ret; 1021da177e4SLinus Torvalds } 1031da177e4SLinus Torvalds 1041da177e4SLinus Torvalds void jffs2_free_full_dirent(struct jffs2_full_dirent *x) 1051da177e4SLinus Torvalds { 106733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1071da177e4SLinus Torvalds kfree(x); 1081da177e4SLinus Torvalds } 1091da177e4SLinus Torvalds 1101da177e4SLinus Torvalds struct jffs2_full_dnode *jffs2_alloc_full_dnode(void) 1111da177e4SLinus Torvalds { 112f538c96bSArtem B. Bityutskiy struct jffs2_full_dnode *ret; 113f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(full_dnode_slab, GFP_KERNEL); 114733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 1151da177e4SLinus Torvalds return ret; 1161da177e4SLinus Torvalds } 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds void jffs2_free_full_dnode(struct jffs2_full_dnode *x) 1191da177e4SLinus Torvalds { 120733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1211da177e4SLinus Torvalds kmem_cache_free(full_dnode_slab, x); 1221da177e4SLinus Torvalds } 1231da177e4SLinus Torvalds 1241da177e4SLinus Torvalds struct jffs2_raw_dirent *jffs2_alloc_raw_dirent(void) 1251da177e4SLinus Torvalds { 126f538c96bSArtem B. Bityutskiy struct jffs2_raw_dirent *ret; 127f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(raw_dirent_slab, GFP_KERNEL); 128733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 1291da177e4SLinus Torvalds return ret; 1301da177e4SLinus Torvalds } 1311da177e4SLinus Torvalds 1321da177e4SLinus Torvalds void jffs2_free_raw_dirent(struct jffs2_raw_dirent *x) 1331da177e4SLinus Torvalds { 134733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1351da177e4SLinus Torvalds kmem_cache_free(raw_dirent_slab, x); 1361da177e4SLinus Torvalds } 1371da177e4SLinus Torvalds 1381da177e4SLinus Torvalds struct jffs2_raw_inode *jffs2_alloc_raw_inode(void) 1391da177e4SLinus Torvalds { 140f538c96bSArtem B. Bityutskiy struct jffs2_raw_inode *ret; 141f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(raw_inode_slab, GFP_KERNEL); 142733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 1431da177e4SLinus Torvalds return ret; 1441da177e4SLinus Torvalds } 1451da177e4SLinus Torvalds 1461da177e4SLinus Torvalds void jffs2_free_raw_inode(struct jffs2_raw_inode *x) 1471da177e4SLinus Torvalds { 148733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1491da177e4SLinus Torvalds kmem_cache_free(raw_inode_slab, x); 1501da177e4SLinus Torvalds } 1511da177e4SLinus Torvalds 1521da177e4SLinus Torvalds struct jffs2_tmp_dnode_info *jffs2_alloc_tmp_dnode_info(void) 1531da177e4SLinus Torvalds { 154f538c96bSArtem B. Bityutskiy struct jffs2_tmp_dnode_info *ret; 155f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(tmp_dnode_info_slab, GFP_KERNEL); 156733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", 157f538c96bSArtem B. Bityutskiy ret); 1581da177e4SLinus Torvalds return ret; 1591da177e4SLinus Torvalds } 1601da177e4SLinus Torvalds 1611da177e4SLinus Torvalds void jffs2_free_tmp_dnode_info(struct jffs2_tmp_dnode_info *x) 1621da177e4SLinus Torvalds { 163733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1641da177e4SLinus Torvalds kmem_cache_free(tmp_dnode_info_slab, x); 1651da177e4SLinus Torvalds } 1661da177e4SLinus Torvalds 1671da177e4SLinus Torvalds struct jffs2_raw_node_ref *jffs2_alloc_raw_node_ref(void) 1681da177e4SLinus Torvalds { 169f538c96bSArtem B. Bityutskiy struct jffs2_raw_node_ref *ret; 170f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(raw_node_ref_slab, GFP_KERNEL); 171733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 1721da177e4SLinus Torvalds return ret; 1731da177e4SLinus Torvalds } 1741da177e4SLinus Torvalds 1751da177e4SLinus Torvalds void jffs2_free_raw_node_ref(struct jffs2_raw_node_ref *x) 1761da177e4SLinus Torvalds { 177733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1781da177e4SLinus Torvalds kmem_cache_free(raw_node_ref_slab, x); 1791da177e4SLinus Torvalds } 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds struct jffs2_node_frag *jffs2_alloc_node_frag(void) 1821da177e4SLinus Torvalds { 183f538c96bSArtem B. Bityutskiy struct jffs2_node_frag *ret; 184f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(node_frag_slab, GFP_KERNEL); 185733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 1861da177e4SLinus Torvalds return ret; 1871da177e4SLinus Torvalds } 1881da177e4SLinus Torvalds 1891da177e4SLinus Torvalds void jffs2_free_node_frag(struct jffs2_node_frag *x) 1901da177e4SLinus Torvalds { 191733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 1921da177e4SLinus Torvalds kmem_cache_free(node_frag_slab, x); 1931da177e4SLinus Torvalds } 1941da177e4SLinus Torvalds 1951da177e4SLinus Torvalds struct jffs2_inode_cache *jffs2_alloc_inode_cache(void) 1961da177e4SLinus Torvalds { 197f538c96bSArtem B. Bityutskiy struct jffs2_inode_cache *ret; 198f538c96bSArtem B. Bityutskiy ret = kmem_cache_alloc(inode_cache_slab, GFP_KERNEL); 199733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", ret); 2001da177e4SLinus Torvalds return ret; 2011da177e4SLinus Torvalds } 2021da177e4SLinus Torvalds 2031da177e4SLinus Torvalds void jffs2_free_inode_cache(struct jffs2_inode_cache *x) 2041da177e4SLinus Torvalds { 205733802d9SArtem B. Bityutskiy dbg_memalloc("%p\n", x); 2061da177e4SLinus Torvalds kmem_cache_free(inode_cache_slab, x); 2071da177e4SLinus Torvalds } 208