changeset 93:2b4deace2c2f

Add support for vmallocing large blockInfos
author charles
date Fri, 07 Oct 2005 03:46:50 +0100
parents 31598d35e840
children c53efc2aec17
files yaffs_guts.c yaffs_guts.h yportenv.h
diffstat 3 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/yaffs_guts.c
+++ b/yaffs_guts.c
@@ -1747,6 +1747,12 @@ static int yaffs_InitialiseBlocks(yaffs_
 
 	/* 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_
 
 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;
--- a/yaffs_guts.h
+++ b/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.
--- a/yportenv.h
+++ b/yportenv.h
@@ -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