xref: /openbmc/linux/fs/jffs2/malloc.c (revision f538c96b)
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  *
10f538c96bSArtem B. Bityutskiy  * $Id: malloc.c,v 1.29 2005/07/27 14:16:53 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);
100f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
106f538c96bSArtem B. Bityutskiy 	JFFS2_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);
114f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
120f538c96bSArtem B. Bityutskiy 	JFFS2_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);
128f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
134f538c96bSArtem B. Bityutskiy 	JFFS2_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);
142f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
148f538c96bSArtem B. Bityutskiy 	JFFS2_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);
156f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
163f538c96bSArtem B. Bityutskiy 	JFFS2_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);
171f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
177f538c96bSArtem B. Bityutskiy 	JFFS2_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);
185f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
191f538c96bSArtem B. Bityutskiy 	JFFS2_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);
199f538c96bSArtem B. Bityutskiy 	JFFS2_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 {
205f538c96bSArtem B. Bityutskiy 	JFFS2_DBG_MEMALLOC("%p\n", x);
2061da177e4SLinus Torvalds 	kmem_cache_free(inode_cache_slab, x);
2071da177e4SLinus Torvalds }
208