*/
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"
/* 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;
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;
*
* 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__
/* 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.
*
* 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 $
*
*/
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/slab.h>
+#include <linux/vmalloc.h>
#define YCHAR char
#define YUCHAR unsigned char
/* #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
#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