From 64239466cac1b316650213aaa07c92f57c3e7861 Mon Sep 17 00:00:00 2001 From: charles Date: Fri, 7 Oct 2005 02:46:49 +0000 Subject: [PATCH] Add support for vmallocing large blockInfos --- yaffs_guts.c | 15 +++++++++++++-- yaffs_guts.h | 3 ++- yportenv.h | 7 ++++++- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/yaffs_guts.c b/yaffs_guts.c index 90aba83..eafbaa9 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -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; diff --git a/yaffs_guts.h b/yaffs_guts.h index 535a269..c5eee97 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -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. diff --git a/yportenv.h b/yportenv.h index 0543383..240b6b9 100644 --- a/yportenv.h +++ b/yportenv.h @@ -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 #include #include +#include #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 -- 2.30.2