Add support for vmallocing large blockInfos
authorcharles <charles>
Fri, 7 Oct 2005 02:46:49 +0000 (02:46 +0000)
committercharles <charles>
Fri, 7 Oct 2005 02:46:49 +0000 (02:46 +0000)
yaffs_guts.c
yaffs_guts.h
yportenv.h

index 90aba83..eafbaa9 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 const char *yaffs_guts_c_version =
-    "$Id: yaffs_guts.c,v 1.19 2005-09-20 05:08:50 charles Exp $";
+    "$Id: yaffs_guts.c,v 1.20 2005-10-07 02:46:49 charles Exp $";
 
 #include "yportenv.h"
 
@@ -1747,6 +1747,12 @@ static int yaffs_InitialiseBlocks(yaffs_Device * dev, int nBlocks)
 
        /* Todo we're assuming the malloc will pass. */
        dev->blockInfo = YMALLOC(nBlocks * sizeof(yaffs_BlockInfo));
+       if(!dev->blockInfo){
+               dev->blockInfo = YMALLOC_ALT(nBlocks * sizeof(yaffs_BlockInfo));
+               dev->blockInfoAlt = 1;
+       }
+       else
+               dev->blockInfoAlt = 0;
        
        /* Set up dynamic blockinfo stuff. */
        dev->chunkBitmapStride = (dev->nChunksPerBlock + 7) / 8;
@@ -1763,7 +1769,12 @@ static int yaffs_InitialiseBlocks(yaffs_Device * dev, int nBlocks)
 
 static void yaffs_DeinitialiseBlocks(yaffs_Device * dev)
 {
-       YFREE(dev->blockInfo);
+       if(dev->blockInfoAlt)
+               YFREE_ALT(dev->blockInfo);
+       else
+               YFREE(dev->blockInfo);
+       dev->blockInfoAlt = 0;
+
        dev->blockInfo = NULL;
        YFREE(dev->chunkBits);
        dev->chunkBits = NULL;
index 535a269..c5eee97 100644 (file)
@@ -14,7 +14,7 @@
  *
  * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
  *
- * $Id: yaffs_guts.h,v 1.14 2005-09-20 05:05:40 charles Exp $
+ * $Id: yaffs_guts.h,v 1.15 2005-10-07 02:46:50 charles Exp $
  */
 
 #ifndef __YAFFS_GUTS_H__
@@ -561,6 +561,7 @@ struct yaffs_DeviceStruct {
 
        /* Block Info */
        yaffs_BlockInfo *blockInfo;
+       int blockInfoAlt;       /* was allocated using alternative strategy */
        __u8 *chunkBits;        /* bitmap of chunks in use */
        int chunkBitmapStride;  /* Number of bytes of chunkBits per block. 
                                 * Must be consistent with nChunksPerBlock.
index 0543383..240b6b9 100644 (file)
@@ -15,7 +15,7 @@
  *
  * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
  *
- * $Id: yportenv.h,v 1.8 2005-09-18 05:31:26 marty Exp $
+ * $Id: yportenv.h,v 1.9 2005-10-07 02:46:50 charles Exp $
  *
  */
 
@@ -37,6 +37,7 @@
 #include <linux/mm.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/vmalloc.h>
 
 #define YCHAR char
 #define YUCHAR unsigned char
@@ -55,6 +56,8 @@
 /* #define YPRINTF(x) printk x */
 #define YMALLOC(x) kmalloc(x,GFP_KERNEL)
 #define YFREE(x)   kfree(x)
+#define YMALLOC_ALT(x) vmalloc(x)
+#define YFREE_ALT(x)   vfree(x)
 
 #define YAFFS_ROOT_MODE                                0666
 #define YAFFS_LOSTNFOUND_MODE          0666
@@ -91,6 +94,8 @@
 
 #define YMALLOC(x) malloc(x)
 #define YFREE(x)   free(x)
+#define YMALLOC_ALT(x) malloc(x)
+#define YFREE_ALT(x) free(x)
 
 #define YCHAR char
 #define YUCHAR unsigned char