*** empty log message ***
[yaffs/.git] / yaffs_guts.c
index 47059771ef3727dd21f413947425f20a1a85ec63..dfef9def4c17a10e89afb2e304f93993baf5d068 100644 (file)
@@ -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);
        }
        
 }