xref: /minix3/sys/ufs/chfs/chfs_malloc.c (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: chfs_malloc.c,v 1.4 2012/10/19 12:44:39 ttoth Exp $	*/
2d65f6f70SBen Gras 
3d65f6f70SBen Gras /*-
4d65f6f70SBen Gras  * Copyright (c) 2010 Department of Software Engineering,
5d65f6f70SBen Gras  *		      University of Szeged, Hungary
6d65f6f70SBen Gras  * Copyright (C) 2010 Tamas Toth <ttoth@inf.u-szeged.hu>
7d65f6f70SBen Gras  * Copyright (C) 2010 Adam Hoka <ahoka@NetBSD.org>
8d65f6f70SBen Gras  * All rights reserved.
9d65f6f70SBen Gras  *
10d65f6f70SBen Gras  * This code is derived from software contributed to The NetBSD Foundation
11d65f6f70SBen Gras  * by the Department of Software Engineering, University of Szeged, Hungary
12d65f6f70SBen Gras  *
13d65f6f70SBen Gras  * Redistribution and use in source and binary forms, with or without
14d65f6f70SBen Gras  * modification, are permitted provided that the following conditions
15d65f6f70SBen Gras  * are met:
16d65f6f70SBen Gras  * 1. Redistributions of source code must retain the above copyright
17d65f6f70SBen Gras  *    notice, this list of conditions and the following disclaimer.
18d65f6f70SBen Gras  * 2. Redistributions in binary form must reproduce the above copyright
19d65f6f70SBen Gras  *    notice, this list of conditions and the following disclaimer in the
20d65f6f70SBen Gras  *    documentation and/or other materials provided with the distribution.
21d65f6f70SBen Gras  *
22d65f6f70SBen Gras  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23d65f6f70SBen Gras  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24d65f6f70SBen Gras  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25d65f6f70SBen Gras  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26d65f6f70SBen Gras  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27d65f6f70SBen Gras  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28d65f6f70SBen Gras  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29d65f6f70SBen Gras  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30d65f6f70SBen Gras  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31d65f6f70SBen Gras  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32d65f6f70SBen Gras  * SUCH DAMAGE.
33d65f6f70SBen Gras  */
34d65f6f70SBen Gras 
35d65f6f70SBen Gras #include "chfs.h"
36d65f6f70SBen Gras #include <sys/pool.h>
37d65f6f70SBen Gras 
38d65f6f70SBen Gras pool_cache_t chfs_vnode_cache;
39d65f6f70SBen Gras pool_cache_t chfs_nrefs_cache;
40d65f6f70SBen Gras pool_cache_t chfs_flash_vnode_cache;
41d65f6f70SBen Gras pool_cache_t chfs_flash_dirent_cache;
42d65f6f70SBen Gras pool_cache_t chfs_flash_dnode_cache;
43d65f6f70SBen Gras pool_cache_t chfs_node_frag_cache;
44d65f6f70SBen Gras pool_cache_t chfs_tmp_dnode_cache;
45d65f6f70SBen Gras pool_cache_t chfs_tmp_dnode_info_cache;
46d65f6f70SBen Gras 
47*84d9c625SLionel Sambuc /* chfs_alloc_pool_caches - allocating pool caches */
48d65f6f70SBen Gras int
chfs_alloc_pool_caches(void)49*84d9c625SLionel Sambuc chfs_alloc_pool_caches(void)
50d65f6f70SBen Gras {
51d65f6f70SBen Gras 	chfs_vnode_cache = pool_cache_init(
52d65f6f70SBen Gras 		sizeof(struct chfs_vnode_cache),
53d65f6f70SBen Gras 		0, 0, 0, "chfs_vnode_cache", NULL, IPL_NONE, NULL, NULL,
54d65f6f70SBen Gras 		NULL);
55d65f6f70SBen Gras 	if (!chfs_vnode_cache)
56d65f6f70SBen Gras 		goto err_vnode;
57d65f6f70SBen Gras 
58d65f6f70SBen Gras 	chfs_nrefs_cache = pool_cache_init(
59d65f6f70SBen Gras 		(REFS_BLOCK_LEN + 1) * sizeof(struct chfs_node_ref), 0, 0,
60d65f6f70SBen Gras 		0, "chfs_nrefs_pool", NULL, IPL_NONE, NULL, NULL, NULL);
61d65f6f70SBen Gras 	if (!chfs_nrefs_cache)
62d65f6f70SBen Gras 		goto err_nrefs;
63d65f6f70SBen Gras 
64d65f6f70SBen Gras 	chfs_flash_vnode_cache = pool_cache_init(
65d65f6f70SBen Gras 		sizeof(struct chfs_flash_vnode), 0, 0, 0,
66d65f6f70SBen Gras 		"chfs_flash_vnode_pool", NULL, IPL_NONE, NULL, NULL, NULL);
67d65f6f70SBen Gras 	if (!chfs_flash_vnode_cache)
68d65f6f70SBen Gras 		goto err_flash_vnode;
69d65f6f70SBen Gras 
70d65f6f70SBen Gras 	chfs_flash_dirent_cache = pool_cache_init(
71d65f6f70SBen Gras 		sizeof(struct chfs_flash_dirent_node), 0, 0, 0,
72d65f6f70SBen Gras 		"chfs_flash_dirent_pool", NULL, IPL_NONE, NULL, NULL, NULL);
73d65f6f70SBen Gras 	if (!chfs_flash_dirent_cache)
74d65f6f70SBen Gras 		goto err_flash_dirent;
75d65f6f70SBen Gras 
76d65f6f70SBen Gras 	chfs_flash_dnode_cache = pool_cache_init(
77d65f6f70SBen Gras 		sizeof(struct chfs_flash_data_node), 0, 0, 0,
78d65f6f70SBen Gras 		"chfs_flash_dnode_pool", NULL, IPL_NONE, NULL, NULL, NULL);
79d65f6f70SBen Gras 	if (!chfs_flash_dnode_cache)
80d65f6f70SBen Gras 		goto err_flash_dnode;
81d65f6f70SBen Gras 
82d65f6f70SBen Gras 	chfs_node_frag_cache = pool_cache_init(
83d65f6f70SBen Gras 		sizeof(struct chfs_node_frag), 0, 0, 0,
84d65f6f70SBen Gras 		"chfs_node_frag_pool", NULL, IPL_NONE, NULL, NULL, NULL);
85d65f6f70SBen Gras 	if (!chfs_node_frag_cache)
86d65f6f70SBen Gras 		goto err_node_frag;
87d65f6f70SBen Gras 
88d65f6f70SBen Gras 	chfs_tmp_dnode_cache = pool_cache_init(
89d65f6f70SBen Gras 		sizeof(struct chfs_tmp_dnode), 0, 0, 0,
90d65f6f70SBen Gras 		"chfs_tmp_dnode_pool", NULL, IPL_NONE, NULL, NULL, NULL);
91d65f6f70SBen Gras 	if (!chfs_tmp_dnode_cache)
92d65f6f70SBen Gras 		goto err_tmp_dnode;
93d65f6f70SBen Gras 
94d65f6f70SBen Gras 	chfs_tmp_dnode_info_cache = pool_cache_init(
95d65f6f70SBen Gras 		sizeof(struct chfs_tmp_dnode_info), 0, 0, 0,
96d65f6f70SBen Gras 		"chfs_tmp_dnode_info_pool", NULL, IPL_NONE, NULL, NULL, NULL);
97d65f6f70SBen Gras 	if (!chfs_tmp_dnode_info_cache)
98d65f6f70SBen Gras 		goto err_tmp_dnode_info;
99d65f6f70SBen Gras 
100d65f6f70SBen Gras 	return 0;
101d65f6f70SBen Gras 
102d65f6f70SBen Gras err_tmp_dnode_info:
103d65f6f70SBen Gras 	pool_cache_destroy(chfs_tmp_dnode_cache);
104d65f6f70SBen Gras err_tmp_dnode:
105d65f6f70SBen Gras 	pool_cache_destroy(chfs_node_frag_cache);
106d65f6f70SBen Gras err_node_frag:
107d65f6f70SBen Gras 	pool_cache_destroy(chfs_flash_dnode_cache);
108d65f6f70SBen Gras err_flash_dnode:
109d65f6f70SBen Gras 	pool_cache_destroy(chfs_flash_dirent_cache);
110d65f6f70SBen Gras err_flash_dirent:
111d65f6f70SBen Gras 	pool_cache_destroy(chfs_flash_vnode_cache);
112d65f6f70SBen Gras err_flash_vnode:
113d65f6f70SBen Gras 	pool_cache_destroy(chfs_nrefs_cache);
114d65f6f70SBen Gras err_nrefs:
115d65f6f70SBen Gras 	pool_cache_destroy(chfs_vnode_cache);
116d65f6f70SBen Gras err_vnode:
117d65f6f70SBen Gras 
118d65f6f70SBen Gras 	return ENOMEM;
119d65f6f70SBen Gras }
120d65f6f70SBen Gras 
121*84d9c625SLionel Sambuc /* chfs_destroy_pool_caches - destroying pool caches */
122d65f6f70SBen Gras void
chfs_destroy_pool_caches(void)123*84d9c625SLionel Sambuc chfs_destroy_pool_caches(void)
124d65f6f70SBen Gras {
125d65f6f70SBen Gras 	if (chfs_vnode_cache)
126d65f6f70SBen Gras 		pool_cache_destroy(chfs_vnode_cache);
127d65f6f70SBen Gras 
128d65f6f70SBen Gras 	if (chfs_nrefs_cache)
129d65f6f70SBen Gras 		pool_cache_destroy(chfs_nrefs_cache);
130d65f6f70SBen Gras 
131d65f6f70SBen Gras 	if (chfs_flash_vnode_cache)
132d65f6f70SBen Gras 		pool_cache_destroy(chfs_flash_vnode_cache);
133d65f6f70SBen Gras 
134d65f6f70SBen Gras 	if (chfs_flash_dirent_cache)
135d65f6f70SBen Gras 		pool_cache_destroy(chfs_flash_dirent_cache);
136d65f6f70SBen Gras 
137d65f6f70SBen Gras 	if (chfs_flash_dnode_cache)
138d65f6f70SBen Gras 		pool_cache_destroy(chfs_flash_dnode_cache);
139d65f6f70SBen Gras 
140d65f6f70SBen Gras 	if (chfs_node_frag_cache)
141d65f6f70SBen Gras 		pool_cache_destroy(chfs_node_frag_cache);
142d65f6f70SBen Gras 
143d65f6f70SBen Gras 	if (chfs_tmp_dnode_cache)
144d65f6f70SBen Gras 		pool_cache_destroy(chfs_tmp_dnode_cache);
145d65f6f70SBen Gras 
146d65f6f70SBen Gras 	if (chfs_tmp_dnode_info_cache)
147d65f6f70SBen Gras 		pool_cache_destroy(chfs_tmp_dnode_info_cache);
148d65f6f70SBen Gras }
149d65f6f70SBen Gras 
150*84d9c625SLionel Sambuc /* chfs_vnode_cache_alloc - allocating and initializing a vnode cache */
151d65f6f70SBen Gras struct chfs_vnode_cache *
chfs_vnode_cache_alloc(ino_t vno)152d65f6f70SBen Gras chfs_vnode_cache_alloc(ino_t vno)
153d65f6f70SBen Gras {
154d65f6f70SBen Gras 	struct chfs_vnode_cache* vc;
155d65f6f70SBen Gras 	vc = pool_cache_get(chfs_vnode_cache, PR_WAITOK);
156d65f6f70SBen Gras 
157d65f6f70SBen Gras 	memset(vc, 0, sizeof(*vc));
158d65f6f70SBen Gras 	vc->vno = vno;
159*84d9c625SLionel Sambuc 	/* vnode cache is the last element of all chain */
160d65f6f70SBen Gras 	vc->v = (void *)vc;
161d65f6f70SBen Gras 	vc->dirents = (void *)vc;
162d65f6f70SBen Gras 	vc->dnode = (void *)vc;
163d65f6f70SBen Gras 	TAILQ_INIT(&vc->scan_dirents);
164d65f6f70SBen Gras 	vc->highest_version = 0;
165d65f6f70SBen Gras 
166d65f6f70SBen Gras 	return vc;
167d65f6f70SBen Gras }
168d65f6f70SBen Gras 
169*84d9c625SLionel Sambuc /* chfs_vnode_cache_free - freeing a vnode cache */
170d65f6f70SBen Gras void
chfs_vnode_cache_free(struct chfs_vnode_cache * vc)171d65f6f70SBen Gras chfs_vnode_cache_free(struct chfs_vnode_cache *vc)
172d65f6f70SBen Gras {
173d65f6f70SBen Gras 	pool_cache_put(chfs_vnode_cache, vc);
174d65f6f70SBen Gras }
175d65f6f70SBen Gras 
176*84d9c625SLionel Sambuc /*
177d65f6f70SBen Gras  * chfs_alloc_refblock - allocating a refblock
178d65f6f70SBen Gras  *
179d65f6f70SBen Gras  * Returns a pointer of the first element in the block.
180d65f6f70SBen Gras  *
181d65f6f70SBen Gras  * We are not allocating just one node ref, instead we allocating REFS_BLOCK_LEN
182d65f6f70SBen Gras  * number of node refs, the last element will be a pointer to the next block.
183d65f6f70SBen Gras  * We do this, because we need a chain of nodes which have been ordered by the
184d65f6f70SBen Gras  * physical address of them.
185d65f6f70SBen Gras  *
186d65f6f70SBen Gras  */
187d65f6f70SBen Gras struct chfs_node_ref*
chfs_alloc_refblock(void)188d65f6f70SBen Gras chfs_alloc_refblock(void)
189d65f6f70SBen Gras {
190d65f6f70SBen Gras 	int i;
191d65f6f70SBen Gras 	struct chfs_node_ref *nref;
192d65f6f70SBen Gras 	nref = pool_cache_get(chfs_nrefs_cache, PR_WAITOK);
193d65f6f70SBen Gras 
194d65f6f70SBen Gras 	for (i = 0; i < REFS_BLOCK_LEN; i++) {
195d65f6f70SBen Gras 		nref[i].nref_lnr = REF_EMPTY_NODE;
196d65f6f70SBen Gras 		nref[i].nref_next = NULL;
197d65f6f70SBen Gras 	}
198d65f6f70SBen Gras 	i = REFS_BLOCK_LEN;
199d65f6f70SBen Gras 	nref[i].nref_lnr = REF_LINK_TO_NEXT;
200d65f6f70SBen Gras 	nref[i].nref_next = NULL;
201d65f6f70SBen Gras 
202d65f6f70SBen Gras 	return nref;
203d65f6f70SBen Gras }
204d65f6f70SBen Gras 
205*84d9c625SLionel Sambuc /* chfs_free_refblock - freeing a refblock */
206d65f6f70SBen Gras void
chfs_free_refblock(struct chfs_node_ref * nref)207d65f6f70SBen Gras chfs_free_refblock(struct chfs_node_ref *nref)
208d65f6f70SBen Gras {
209d65f6f70SBen Gras 	pool_cache_put(chfs_nrefs_cache, nref);
210d65f6f70SBen Gras }
211d65f6f70SBen Gras 
212*84d9c625SLionel Sambuc /*
213d65f6f70SBen Gras  * chfs_alloc_node_ref - allocating a node ref from a refblock
214d65f6f70SBen Gras  *
215d65f6f70SBen Gras  * Allocating a node ref from a refblock, it there isn't any free element in the
216d65f6f70SBen Gras  * block, a new block will be allocated and be linked to the current block.
217d65f6f70SBen Gras  */
218d65f6f70SBen Gras struct chfs_node_ref*
chfs_alloc_node_ref(struct chfs_eraseblock * cheb)219d65f6f70SBen Gras chfs_alloc_node_ref(struct chfs_eraseblock *cheb)
220d65f6f70SBen Gras {
221d65f6f70SBen Gras 	struct chfs_node_ref *nref, *new, *old;
222d65f6f70SBen Gras 	old = cheb->last_node;
223d65f6f70SBen Gras 	nref = cheb->last_node;
224d65f6f70SBen Gras 
225d65f6f70SBen Gras 	if (!nref) {
226*84d9c625SLionel Sambuc 		/* There haven't been any nref allocated for this block yet */
227d65f6f70SBen Gras 		nref = chfs_alloc_refblock();
228d65f6f70SBen Gras 
229d65f6f70SBen Gras 		cheb->first_node = nref;
230d65f6f70SBen Gras 		cheb->last_node = nref;
231d65f6f70SBen Gras 		nref->nref_lnr = cheb->lnr;
232d65f6f70SBen Gras 		KASSERT(cheb->lnr == nref->nref_lnr);
233d65f6f70SBen Gras 
234d65f6f70SBen Gras 		return nref;
235d65f6f70SBen Gras 	}
236d65f6f70SBen Gras 
237d65f6f70SBen Gras 	nref++;
238d65f6f70SBen Gras 	if (nref->nref_lnr == REF_LINK_TO_NEXT) {
239*84d9c625SLionel Sambuc 		/* this was the last element, allocate a new block */
240d65f6f70SBen Gras 		new = chfs_alloc_refblock();
241d65f6f70SBen Gras 		nref->nref_next = new;
242d65f6f70SBen Gras 		nref = new;
243d65f6f70SBen Gras 	}
244d65f6f70SBen Gras 
245d65f6f70SBen Gras 	cheb->last_node = nref;
246d65f6f70SBen Gras 	nref->nref_lnr = cheb->lnr;
247d65f6f70SBen Gras 
248d65f6f70SBen Gras 	KASSERT(old->nref_lnr == nref->nref_lnr &&
249d65f6f70SBen Gras 	    nref->nref_lnr == cheb->lnr);
250d65f6f70SBen Gras 
251d65f6f70SBen Gras 	return nref;
252d65f6f70SBen Gras }
253d65f6f70SBen Gras 
254*84d9c625SLionel Sambuc /* chfs_free_node_refs - freeing an eraseblock's node refs */
255d65f6f70SBen Gras void
chfs_free_node_refs(struct chfs_eraseblock * cheb)256d65f6f70SBen Gras chfs_free_node_refs(struct chfs_eraseblock *cheb)
257d65f6f70SBen Gras {
258d65f6f70SBen Gras 	struct chfs_node_ref *nref, *block;
259d65f6f70SBen Gras 
260d65f6f70SBen Gras 	block = nref = cheb->first_node;
261d65f6f70SBen Gras 
262d65f6f70SBen Gras 	while (nref) {
263d65f6f70SBen Gras 		if (nref->nref_lnr == REF_LINK_TO_NEXT) {
264d65f6f70SBen Gras 			nref = nref->nref_next;
265d65f6f70SBen Gras 			chfs_free_refblock(block);
266d65f6f70SBen Gras 			block = nref;
267d65f6f70SBen Gras 			continue;
268d65f6f70SBen Gras 		}
269d65f6f70SBen Gras 		nref++;
270d65f6f70SBen Gras 	}
271d65f6f70SBen Gras }
272d65f6f70SBen Gras 
273*84d9c625SLionel Sambuc /* chfs_alloc_dirent - allocating a directory entry */
274d65f6f70SBen Gras struct chfs_dirent*
chfs_alloc_dirent(int namesize)275d65f6f70SBen Gras chfs_alloc_dirent(int namesize)
276d65f6f70SBen Gras {
277d65f6f70SBen Gras 	struct chfs_dirent *ret;
278d65f6f70SBen Gras 	size_t size = sizeof(struct chfs_dirent) + namesize;
279d65f6f70SBen Gras 
280d65f6f70SBen Gras 	ret = kmem_alloc(size, KM_SLEEP);
281d65f6f70SBen Gras 
282d65f6f70SBen Gras 	return ret;
283d65f6f70SBen Gras }
284d65f6f70SBen Gras 
285*84d9c625SLionel Sambuc /* chfs_free_dirent - freeing a directory entry */
286d65f6f70SBen Gras void
chfs_free_dirent(struct chfs_dirent * dirent)287d65f6f70SBen Gras chfs_free_dirent(struct chfs_dirent *dirent)
288d65f6f70SBen Gras {
289d65f6f70SBen Gras 	size_t size = sizeof(struct chfs_dirent) + dirent->nsize + 1;
290d65f6f70SBen Gras 
291d65f6f70SBen Gras 	kmem_free(dirent, size);
292d65f6f70SBen Gras }
293d65f6f70SBen Gras 
294*84d9c625SLionel Sambuc /* chfs_alloc_full_dnode - allocating a full data node */
295d65f6f70SBen Gras struct chfs_full_dnode*
chfs_alloc_full_dnode(void)296*84d9c625SLionel Sambuc chfs_alloc_full_dnode(void)
297d65f6f70SBen Gras {
298d65f6f70SBen Gras 	struct chfs_full_dnode *ret;
299d65f6f70SBen Gras 	ret = kmem_alloc(sizeof(struct chfs_full_dnode), KM_SLEEP);
300*84d9c625SLionel Sambuc 	ret->nref = NULL;
301*84d9c625SLionel Sambuc 	ret->frags = 0;
302d65f6f70SBen Gras 	return ret;
303d65f6f70SBen Gras }
304d65f6f70SBen Gras 
305*84d9c625SLionel Sambuc /* chfs_free_full_dnode - freeing a full data node */
306d65f6f70SBen Gras void
chfs_free_full_dnode(struct chfs_full_dnode * fd)307d65f6f70SBen Gras chfs_free_full_dnode(struct chfs_full_dnode *fd)
308d65f6f70SBen Gras {
309d65f6f70SBen Gras 	kmem_free(fd,(sizeof(struct chfs_full_dnode)));
310d65f6f70SBen Gras }
311d65f6f70SBen Gras 
312*84d9c625SLionel Sambuc /* chfs_alloc_flash_vnode - allocating vnode info (used on flash) */
313d65f6f70SBen Gras struct chfs_flash_vnode*
chfs_alloc_flash_vnode(void)314*84d9c625SLionel Sambuc chfs_alloc_flash_vnode(void)
315d65f6f70SBen Gras {
316d65f6f70SBen Gras 	struct chfs_flash_vnode *ret;
317d65f6f70SBen Gras 	ret = pool_cache_get(chfs_flash_vnode_cache, 0);
318d65f6f70SBen Gras 	return ret;
319d65f6f70SBen Gras }
320d65f6f70SBen Gras 
321*84d9c625SLionel Sambuc /* chfs_free_flash_vnode - freeing vnode info */
322d65f6f70SBen Gras void
chfs_free_flash_vnode(struct chfs_flash_vnode * fvnode)323d65f6f70SBen Gras chfs_free_flash_vnode(struct chfs_flash_vnode *fvnode)
324d65f6f70SBen Gras {
325d65f6f70SBen Gras 	pool_cache_put(chfs_flash_vnode_cache, fvnode);
326d65f6f70SBen Gras }
327d65f6f70SBen Gras 
328*84d9c625SLionel Sambuc /* chfs_alloc_flash_dirent - allocating a directory entry (used on flash) */
329d65f6f70SBen Gras struct chfs_flash_dirent_node*
chfs_alloc_flash_dirent(void)330*84d9c625SLionel Sambuc chfs_alloc_flash_dirent(void)
331d65f6f70SBen Gras {
332d65f6f70SBen Gras 	struct chfs_flash_dirent_node *ret;
333d65f6f70SBen Gras 	ret = pool_cache_get(chfs_flash_dirent_cache, 0);
334d65f6f70SBen Gras 	return ret;
335d65f6f70SBen Gras }
336d65f6f70SBen Gras 
337*84d9c625SLionel Sambuc /* chfs_free_flash_dirent - freeing a (flash) directory entry */
338d65f6f70SBen Gras void
chfs_free_flash_dirent(struct chfs_flash_dirent_node * fdnode)339d65f6f70SBen Gras chfs_free_flash_dirent(struct chfs_flash_dirent_node *fdnode)
340d65f6f70SBen Gras {
341d65f6f70SBen Gras 	pool_cache_put(chfs_flash_dirent_cache, fdnode);
342d65f6f70SBen Gras }
343d65f6f70SBen Gras 
344*84d9c625SLionel Sambuc /* chfs_alloc_flash_dnode - allocating a data node (used on flash) */
345d65f6f70SBen Gras struct chfs_flash_data_node*
chfs_alloc_flash_dnode(void)346*84d9c625SLionel Sambuc chfs_alloc_flash_dnode(void)
347d65f6f70SBen Gras {
348d65f6f70SBen Gras 	struct chfs_flash_data_node *ret;
349d65f6f70SBen Gras 	ret = pool_cache_get(chfs_flash_dnode_cache, 0);
350d65f6f70SBen Gras 	return ret;
351d65f6f70SBen Gras }
352d65f6f70SBen Gras 
353*84d9c625SLionel Sambuc /* chfs_free_flash_dnode - freeing a (flash) data node */
354d65f6f70SBen Gras void
chfs_free_flash_dnode(struct chfs_flash_data_node * fdnode)355d65f6f70SBen Gras chfs_free_flash_dnode(struct chfs_flash_data_node *fdnode)
356d65f6f70SBen Gras {
357d65f6f70SBen Gras 	pool_cache_put(chfs_flash_dnode_cache, fdnode);
358d65f6f70SBen Gras }
359d65f6f70SBen Gras 
360*84d9c625SLionel Sambuc /* chfs_alloc_node_frag - allocating a fragment of a node */
361d65f6f70SBen Gras struct chfs_node_frag*
chfs_alloc_node_frag(void)362*84d9c625SLionel Sambuc chfs_alloc_node_frag(void)
363d65f6f70SBen Gras {
364d65f6f70SBen Gras 	struct chfs_node_frag *ret;
365d65f6f70SBen Gras 	ret = pool_cache_get(chfs_node_frag_cache, 0);
366d65f6f70SBen Gras 	return ret;
367d65f6f70SBen Gras }
368d65f6f70SBen Gras 
369*84d9c625SLionel Sambuc /* chfs_free_node_frag - freeing a fragment of a node */
370d65f6f70SBen Gras void
chfs_free_node_frag(struct chfs_node_frag * frag)371d65f6f70SBen Gras chfs_free_node_frag(struct chfs_node_frag *frag)
372d65f6f70SBen Gras {
373d65f6f70SBen Gras 	pool_cache_put(chfs_node_frag_cache, frag);
374d65f6f70SBen Gras }
375d65f6f70SBen Gras 
376*84d9c625SLionel Sambuc /* chfs_alloc_tmp_dnode - allocating a temporarly used dnode */
377d65f6f70SBen Gras struct chfs_tmp_dnode *
chfs_alloc_tmp_dnode(void)378*84d9c625SLionel Sambuc chfs_alloc_tmp_dnode(void)
379d65f6f70SBen Gras {
380d65f6f70SBen Gras 	struct chfs_tmp_dnode *ret;
381d65f6f70SBen Gras 	ret = pool_cache_get(chfs_tmp_dnode_cache, 0);
382d65f6f70SBen Gras 	ret->next = NULL;
383d65f6f70SBen Gras 	return ret;
384d65f6f70SBen Gras }
385d65f6f70SBen Gras 
386*84d9c625SLionel Sambuc /* chfs_free_tmp_dnode - freeing a temporarly used dnode */
387d65f6f70SBen Gras void
chfs_free_tmp_dnode(struct chfs_tmp_dnode * td)388d65f6f70SBen Gras chfs_free_tmp_dnode(struct chfs_tmp_dnode *td)
389d65f6f70SBen Gras {
390d65f6f70SBen Gras 	pool_cache_put(chfs_tmp_dnode_cache, td);
391d65f6f70SBen Gras }
392d65f6f70SBen Gras 
393*84d9c625SLionel Sambuc /* chfs_alloc_tmp_dnode_info - allocating a temporarly used dnode descriptor */
394d65f6f70SBen Gras struct chfs_tmp_dnode_info *
chfs_alloc_tmp_dnode_info(void)395*84d9c625SLionel Sambuc chfs_alloc_tmp_dnode_info(void)
396d65f6f70SBen Gras {
397d65f6f70SBen Gras 	struct chfs_tmp_dnode_info *ret;
398d65f6f70SBen Gras 	ret = pool_cache_get(chfs_tmp_dnode_info_cache, 0);
399d65f6f70SBen Gras 	ret->tmpnode = NULL;
400d65f6f70SBen Gras 	return ret;
401d65f6f70SBen Gras }
402d65f6f70SBen Gras 
403*84d9c625SLionel Sambuc /* chfs_free_tmp_dnode_info - freeing a temporarly used dnode descriptor */
404d65f6f70SBen Gras void
chfs_free_tmp_dnode_info(struct chfs_tmp_dnode_info * di)405d65f6f70SBen Gras chfs_free_tmp_dnode_info(struct chfs_tmp_dnode_info *di)
406d65f6f70SBen Gras {
407d65f6f70SBen Gras 	pool_cache_put(chfs_tmp_dnode_info_cache, di);
408d65f6f70SBen Gras }
409d65f6f70SBen Gras 
410