2 * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
4 * Copyright (C) 2002-2010 Aleph One Ltd.
5 * for Toby Churchill Ltd and Brightstar Engineering
7 * Created by Charles Manning <charles@aleph1.co.uk>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU Lesser General Public License version 2.1 as
11 * published by the Free Software Foundation.
13 * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
15 * Note: Tis code is currently unused. Being checked in in case it becomes useful.
19 #include "yaffs_allocator.h"
20 #include "yaffs_guts.h"
21 #include "yaffs_trace.h"
23 #include "yaffs_linux.h"
25 * Start out with the same allocator as yaffs direct.
26 * Todo: Change to Linux slab allocator.
32 struct yaffs_AllocatorStruct {
33 char tnode_name[NAMELEN+1];
34 char object_name[NAMELEN+1];
35 struct kmem_cache *tnode_cache;
36 struct kmem_cache *object_cache;
39 typedef struct yaffs_AllocatorStruct yaffs_Allocator;
43 void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev)
45 yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator;
47 T(YAFFS_TRACE_ALLOCATE,(TSTR("Deinitialising yaffs allocator\n")));
50 if(allocator->tnode_cache){
51 kmem_cache_destroy(allocator->tnode_cache);
52 allocator->tnode_cache = NULL;
55 (TSTR("NULL tnode cache\n")));
59 if(allocator->object_cache){
60 kmem_cache_destroy(allocator->object_cache);
61 allocator->object_cache = NULL;
64 (TSTR("NULL object cache\n")));
72 (TSTR("Deinitialising NULL allocator\n")));
75 dev->allocator = NULL;
79 static void fake_ctor0(void *data){data = data;}
80 static void fake_ctor1(void *data){data = data;}
81 static void fake_ctor2(void *data){data = data;}
82 static void fake_ctor3(void *data){data = data;}
83 static void fake_ctor4(void *data){data = data;}
84 static void fake_ctor5(void *data){data = data;}
85 static void fake_ctor6(void *data){data = data;}
86 static void fake_ctor7(void *data){data = data;}
87 static void fake_ctor8(void *data){data = data;}
88 static void fake_ctor9(void *data){data = data;}
90 static void (*fake_ctor_list[10]) (void *) = {
103 void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev)
105 yaffs_Allocator *allocator;
106 unsigned mount_id = yaffs_dev_to_lc(dev)->mount_id;
108 T(YAFFS_TRACE_ALLOCATE,(TSTR("Initialising yaffs allocator\n")));
112 else if(mount_id >= 10){
113 T(YAFFS_TRACE_ALWAYS,(TSTR("Bad mount_id %u\n"),mount_id));
115 allocator = YMALLOC(sizeof(yaffs_Allocator));
116 memset(allocator,0,sizeof(yaffs_Allocator));
117 dev->allocator = allocator;
120 T(YAFFS_TRACE_ALWAYS,
121 (TSTR("yaffs allocator creation failed\n")));
127 sprintf(allocator->tnode_name,"yaffs_t_%u",mount_id);
128 sprintf(allocator->object_name,"yaffs_o_%u",mount_id);
130 allocator->tnode_cache =
131 kmem_cache_create(allocator->tnode_name,
134 fake_ctor_list[mount_id]);
135 if(allocator->tnode_cache)
136 T(YAFFS_TRACE_ALLOCATE,
137 (TSTR("tnode cache \"%s\" %p\n"),
138 allocator->tnode_name,allocator->tnode_cache));
140 T(YAFFS_TRACE_ALWAYS,
141 (TSTR("yaffs cache creation failed\n")));
146 allocator->object_cache =
147 kmem_cache_create(allocator->object_name,
150 fake_ctor_list[mount_id]);
152 if(allocator->object_cache)
153 T(YAFFS_TRACE_ALLOCATE,
154 (TSTR("object cache \"%s\" %p\n"),
155 allocator->object_name,allocator->object_cache));
158 T(YAFFS_TRACE_ALWAYS,
159 (TSTR("yaffs cache creation failed\n")));
166 yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev)
168 yaffs_Allocator *allocator = dev->allocator;
169 if(!allocator || !allocator->tnode_cache){
173 return kmem_cache_alloc(allocator->tnode_cache, GFP_NOFS);
176 void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn)
178 yaffs_Allocator *allocator = dev->allocator;
179 kmem_cache_free(allocator->tnode_cache,tn);
182 yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev)
184 yaffs_Allocator *allocator = dev->allocator;
189 if(!allocator->object_cache){
193 return kmem_cache_alloc(allocator->object_cache, GFP_NOFS);
196 void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj)
198 yaffs_Allocator *allocator = dev->allocator;
199 kmem_cache_free(allocator->object_cache,obj);