X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=yaffs_guts.c;h=dfef9def4c17a10e89afb2e304f93993baf5d068;hb=37122d7644239983d55096a85bca6fb8e248cf20;hp=47059771ef3727dd21f413947425f20a1a85ec63;hpb=657bdac1f20c85e9e0d06ef5fcdd49cec4d7627c;p=yaffs%2F.git diff --git a/yaffs_guts.c b/yaffs_guts.c index 4705977..dfef9de 100644 --- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -14,7 +14,7 @@ */ //yaffs_guts.c -const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.17 2003-01-17 04:19:08 charles Exp $"; +const char *yaffs_guts_c_version="$Id: yaffs_guts.c,v 1.22 2003-03-11 05:16:53 charles Exp $"; #include "yportenv.h" @@ -216,10 +216,6 @@ int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, int retVal; yaffs_Spare localSpare; - __u8 calcEcc[3]; - int eccResult1,eccResult2; - struct yaffs_NANDSpare nspare; - dev->nPageReads++; @@ -240,6 +236,9 @@ int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, { // Do ECC correction //Todo handle any errors + int eccResult1,eccResult2; + __u8 calcEcc[3]; + nand_calculate_ecc(data,calcEcc); eccResult1 = nand_correct_data (data,spare->ecc1, calcEcc); nand_calculate_ecc(&data[256],calcEcc); @@ -276,6 +275,8 @@ int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, } else { + // Must allocate enough memory for spare+2*sizeof(int) for ecc results from device. + struct yaffs_NANDSpare nspare; retVal = dev->readChunkFromNAND(dev,chunkInNAND,data,(yaffs_Spare*)&nspare); memcpy (spare, &nspare, sizeof(yaffs_Spare)); if(data && doErrorCorrection) @@ -298,7 +299,7 @@ int yaffs_ReadChunkFromNAND(struct yaffs_DeviceStruct *dev, T(YAFFS_TRACE_ERROR,(TSTR("**>>ecc error unfixed on chunk %d:1" TENDSTR),chunkInNAND)); } - if(nspare.eccres2 || nspare.eccres2) + if(nspare.eccres1 || nspare.eccres2) { // Hoosterman, we had a data problem on this page yaffs_HandleReadDataError(dev,chunkInNAND); @@ -316,12 +317,10 @@ static int yaffs_CheckChunkErased(struct yaffs_DeviceStruct *dev,int chunkInNAND static int init = 0; static __u8 cmpbuf[YAFFS_BYTES_PER_CHUNK]; static __u8 data[YAFFS_BYTES_PER_CHUNK]; - static __u8 spare[16]; - - - dev->readChunkFromNAND(dev,chunkInNAND,data,(yaffs_Spare *)spare); - - + // Might as well always allocate the larger size for dev->useNANDECC == true; + static __u8 spare[sizeof(struct yaffs_NANDSpare)]; + + dev->readChunkFromNAND(dev,chunkInNAND,data,(yaffs_Spare *)spare); if(!init) { @@ -1149,8 +1148,10 @@ static int yaffs_SoftDeleteWorker(yaffs_Object *in, yaffs_Tnode *tn, __u32 level { if(tn->level0[i]) { - theChunk = (tn->level0[i] << in->myDev->chunkGroupBits); + T(YAFFS_TRACE_SCAN,(TSTR("soft delete tch %d cgb %d chunk %d" TENDSTR), + tn->level0[i],in->myDev->chunkGroupBits,theChunk)); + theBlock = yaffs_GetBlockInfo(in->myDev, theChunk/in->myDev->nChunksPerBlock); if(theBlock) { @@ -1851,7 +1852,7 @@ int yaffs_RenameObject(yaffs_Object *oldDir, const char *oldName, yaffs_Object * yaffs_Object *obj; int force = 0; -#ifdef YAFFS_CASE_INSENSITIVE +#ifdef CONFIG_YAFFS_CASE_INSENSITIVE // Special case for WinCE. // While look-up is case insensitive, the name isn't. // THerefore we might want to change x.txt to X.txt @@ -2012,6 +2013,7 @@ static int yaffs_FindDirtiestBlock(yaffs_Device *dev,int aggressive) } else { + iterations = dev->endBlock - dev->startBlock + 1; iterations = iterations / 16; if(iterations > 200) { @@ -2139,7 +2141,7 @@ static int yaffs_AllocateChunk(yaffs_Device *dev,int useReserve) dev->allocationPage = 0; } - if(!useReserve && dev->nErasedBlocks <= YAFFS_RESERVED_BLOCKS) + if(!useReserve && dev->nErasedBlocks <= dev->nReservedBlocks) { // Not enough space to allocate unless we're allowed to use the reserve. return -1; @@ -2181,7 +2183,7 @@ static int yaffs_AllocateChunk(yaffs_Device *dev,int useReserve) static int yaffs_CheckSpaceForChunkCache(yaffs_Device *dev) { - return (dev->nErasedBlocks >= YAFFS_RESERVED_BLOCKS); + return (dev->nErasedBlocks >= dev->nReservedBlocks); } @@ -2362,7 +2364,7 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev) //yaffs_DoUnlinkedFileDeletion(dev); - if(dev->nErasedBlocks <= (YAFFS_RESERVED_BLOCKS + YAFFS_GARBAGE_COLLECT_LOW_WATER)) + if(dev->nErasedBlocks <= (dev->nReservedBlocks + YAFFS_GARBAGE_COLLECT_LOW_WATER)) { aggressive = 1; } @@ -2402,7 +2404,7 @@ static int yaffs_CheckGarbageCollection(yaffs_Device *dev) //yaffs_DoUnlinkedFileDeletion(dev); - if(dev->nErasedBlocks <= (YAFFS_RESERVED_BLOCKS + 1)) + if(dev->nErasedBlocks <= (dev->nReservedBlocks + 1)) { aggressive = 1; } @@ -4599,6 +4601,20 @@ int yaffs_GutsInitialise(yaffs_Device *dev) int extraBits; int nBlocks; + if( dev->nBytesPerChunk != YAFFS_BYTES_PER_CHUNK || + + dev->nChunksPerBlock < 2 || + dev->nReservedBlocks < 2 || + dev->startBlock <= 0 || + dev->endBlock <= 0 || + dev->endBlock <= (dev->startBlock + dev->nReservedBlocks) + ) + { + //these parameters must be set before stating yaffs + // Other parameters startBlock, + return YAFFS_FAIL; + } + if(!yaffs_CheckStructures()) @@ -4655,9 +4671,6 @@ int yaffs_GutsInitialise(yaffs_Device *dev) } dev->chunkGroupSize = 1 << dev->chunkGroupBits; - // Stuff to be taken out later - dev->nBytesPerChunk = YAFFS_BYTES_PER_CHUNK; - dev->nChunksPerBlock = YAFFS_CHUNKS_PER_BLOCK; // More device initialisation @@ -4742,6 +4755,7 @@ void yaffs_Deinitialise(yaffs_Device *dev) yaffs_DeinitialiseBlocks(dev); yaffs_DeinitialiseTnodes(dev); yaffs_DeinitialiseObjects(dev); + YFREE(dev->localBuffer); } }