yaffs_linux_allocator.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. /*
  2. * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
  3. *
  4. * Copyright (C) 2002-2010 Aleph One Ltd.
  5. * for Toby Churchill Ltd and Brightstar Engineering
  6. *
  7. * Created by Charles Manning <[email protected]>
  8. *
  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.
  12. *
  13. * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
  14. *
  15. * Note: Tis code is currently unused. Being checked in in case it becomes useful.
  16. */
  17. #include "yaffs_allocator.h"
  18. #include "yaffs_guts.h"
  19. #include "yaffs_trace.h"
  20. #include "yportenv.h"
  21. #include "yaffs_linux.h"
  22. /*
  23. * Start out with the same allocator as yaffs direct.
  24. * Todo: Change to Linux slab allocator.
  25. */
  26. #define NAMELEN 20
  27. struct yaffs_AllocatorStruct {
  28. char tnode_name[NAMELEN+1];
  29. char object_name[NAMELEN+1];
  30. struct kmem_cache *tnode_cache;
  31. struct kmem_cache *object_cache;
  32. };
  33. typedef struct yaffs_AllocatorStruct yaffs_Allocator;
  34. int mount_id;
  35. void yaffs_deinit_raw_tnodes_and_objs(yaffs_dev_t *dev)
  36. {
  37. yaffs_Allocator *allocator = (yaffs_Allocator *)dev->allocator;
  38. T(YAFFS_TRACE_ALLOCATE,(TSTR("Deinitialising yaffs allocator\n")));
  39. if(allocator){
  40. if(allocator->tnode_cache){
  41. kmem_cache_destroy(allocator->tnode_cache);
  42. allocator->tnode_cache = NULL;
  43. } else {
  44. T(YAFFS_TRACE_ALWAYS,
  45. (TSTR("NULL tnode cache\n")));
  46. YBUG();
  47. }
  48. if(allocator->object_cache){
  49. kmem_cache_destroy(allocator->object_cache);
  50. allocator->object_cache = NULL;
  51. } else {
  52. T(YAFFS_TRACE_ALWAYS,
  53. (TSTR("NULL object cache\n")));
  54. YBUG();
  55. }
  56. YFREE(allocator);
  57. } else {
  58. T(YAFFS_TRACE_ALWAYS,
  59. (TSTR("Deinitialising NULL allocator\n")));
  60. YBUG();
  61. }
  62. dev->allocator = NULL;
  63. }
  64. static void fake_ctor0(void *data){data = data;}
  65. static void fake_ctor1(void *data){data = data;}
  66. static void fake_ctor2(void *data){data = data;}
  67. static void fake_ctor3(void *data){data = data;}
  68. static void fake_ctor4(void *data){data = data;}
  69. static void fake_ctor5(void *data){data = data;}
  70. static void fake_ctor6(void *data){data = data;}
  71. static void fake_ctor7(void *data){data = data;}
  72. static void fake_ctor8(void *data){data = data;}
  73. static void fake_ctor9(void *data){data = data;}
  74. static void (*fake_ctor_list[10]) (void *) = {
  75. fake_ctor0,
  76. fake_ctor1,
  77. fake_ctor2,
  78. fake_ctor3,
  79. fake_ctor4,
  80. fake_ctor5,
  81. fake_ctor6,
  82. fake_ctor7,
  83. fake_ctor8,
  84. fake_ctor9,
  85. };
  86. void yaffs_init_raw_tnodes_and_objs(yaffs_dev_t *dev)
  87. {
  88. yaffs_Allocator *allocator;
  89. unsigned mount_id = yaffs_dev_to_lc(dev)->mount_id;
  90. T(YAFFS_TRACE_ALLOCATE,(TSTR("Initialising yaffs allocator\n")));
  91. if(dev->allocator)
  92. YBUG();
  93. else if(mount_id >= 10){
  94. T(YAFFS_TRACE_ALWAYS,(TSTR("Bad mount_id %u\n"),mount_id));
  95. } else {
  96. allocator = YMALLOC(sizeof(yaffs_Allocator));
  97. memset(allocator,0,sizeof(yaffs_Allocator));
  98. dev->allocator = allocator;
  99. if(!dev->allocator){
  100. T(YAFFS_TRACE_ALWAYS,
  101. (TSTR("yaffs allocator creation failed\n")));
  102. YBUG();
  103. return;
  104. }
  105. sprintf(allocator->tnode_name,"yaffs_t_%u",mount_id);
  106. sprintf(allocator->object_name,"yaffs_o_%u",mount_id);
  107. allocator->tnode_cache =
  108. kmem_cache_create(allocator->tnode_name,
  109. dev->tnode_size,
  110. 0, 0,
  111. fake_ctor_list[mount_id]);
  112. if(allocator->tnode_cache)
  113. T(YAFFS_TRACE_ALLOCATE,
  114. (TSTR("tnode cache \"%s\" %p\n"),
  115. allocator->tnode_name,allocator->tnode_cache));
  116. else {
  117. T(YAFFS_TRACE_ALWAYS,
  118. (TSTR("yaffs cache creation failed\n")));
  119. YBUG();
  120. }
  121. allocator->object_cache =
  122. kmem_cache_create(allocator->object_name,
  123. sizeof(yaffs_obj_t),
  124. 0, 0,
  125. fake_ctor_list[mount_id]);
  126. if(allocator->object_cache)
  127. T(YAFFS_TRACE_ALLOCATE,
  128. (TSTR("object cache \"%s\" %p\n"),
  129. allocator->object_name,allocator->object_cache));
  130. else {
  131. T(YAFFS_TRACE_ALWAYS,
  132. (TSTR("yaffs cache creation failed\n")));
  133. YBUG();
  134. }
  135. }
  136. }
  137. yaffs_tnode_t *yaffs_alloc_raw_tnode(yaffs_dev_t *dev)
  138. {
  139. yaffs_Allocator *allocator = dev->allocator;
  140. if(!allocator || !allocator->tnode_cache){
  141. YBUG();
  142. return NULL;
  143. }
  144. return kmem_cache_alloc(allocator->tnode_cache, GFP_NOFS);
  145. }
  146. void yaffs_free_raw_tnode(yaffs_dev_t *dev, yaffs_tnode_t *tn)
  147. {
  148. yaffs_Allocator *allocator = dev->allocator;
  149. kmem_cache_free(allocator->tnode_cache,tn);
  150. }
  151. yaffs_obj_t *yaffs_alloc_raw_obj(yaffs_dev_t *dev)
  152. {
  153. yaffs_Allocator *allocator = dev->allocator;
  154. if(!allocator){
  155. YBUG();
  156. return NULL;
  157. }
  158. if(!allocator->object_cache){
  159. YBUG();
  160. return NULL;
  161. }
  162. return kmem_cache_alloc(allocator->object_cache, GFP_NOFS);
  163. }
  164. void yaffs_free_raw_obj(yaffs_dev_t *dev, yaffs_obj_t *obj)
  165. {
  166. yaffs_Allocator *allocator = dev->allocator;
  167. kmem_cache_free(allocator->object_cache,obj);
  168. }