* published by the Free Software Foundation.
*/
+
const char *yaffs_guts_c_version =
- "$Id: yaffs_guts.c,v 1.71 2009-01-12 00:53:47 charles Exp $";
+ "$Id: yaffs_guts.c,v 1.74 2009-01-18 23:24:08 charles Exp $";
#include "yportenv.h"
__u32 chunkMax;
__u32 chunkIdOk;
- __u32 chunkIsLive;
+ __u32 chunkInRange;
+ __u32 chunkShouldNotBeDeleted;
+ __u32 chunkValid;
if(!obj)
return;
+
+ if(obj->beingCreated)
+ return;
dev = obj->myDev;
chunkMin = dev->internalStartBlock * dev->nChunksPerBlock;
chunkMax = (dev->internalEndBlock+1) * dev->nChunksPerBlock - 1;
- chunkIdOk = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
- chunkIsLive = chunkIdOk &&
+ chunkInRange = (((unsigned)(obj->hdrChunk)) >= chunkMin && ((unsigned)(obj->hdrChunk)) <= chunkMax);
+ chunkIdOk = chunkInRange || obj->hdrChunk == 0;
+ chunkValid = chunkInRange &&
yaffs_CheckChunkBit(dev,
obj->hdrChunk / dev->nChunksPerBlock,
obj->hdrChunk % dev->nChunksPerBlock);
+ chunkShouldNotBeDeleted = chunkInRange && !chunkValid;
+
if(!obj->fake &&
- (!chunkIdOk || !chunkIsLive)) {
+ (!chunkIdOk || chunkShouldNotBeDeleted)) {
T(YAFFS_TRACE_VERIFY,
(TSTR("Obj %d has chunkId %d %s %s"TENDSTR),
obj->objectId,obj->hdrChunk,
chunkIdOk ? "" : ",out of range",
- chunkIsLive || !chunkIdOk ? "" : ",marked as deleted"));
+ chunkShouldNotBeDeleted ? ",marked as deleted" : ""));
}
- if(chunkIdOk && chunkIsLive &&!yaffs_SkipNANDVerification(dev)) {
+ if(chunkValid &&!yaffs_SkipNANDVerification(dev)) {
yaffs_ExtendedTags tags;
yaffs_ObjectHeader *oh;
__u8 *buffer = yaffs_GetTempBuffer(dev,__LINE__);
/* Now sweeten it up... */
memset(tn, 0, sizeof(yaffs_Object));
+ tn->beingCreated = 1;
+
tn->myDev = dev;
tn->hdrChunk = 0;
tn->variantType = YAFFS_OBJECT_TYPE_UNKNOWN;
if (dev->lostNFoundDir) {
yaffs_AddObjectToDirectory(dev->lostNFoundDir, tn);
}
+
+ tn->beingCreated = 0;
}
dev->nCheckpointBlocksRequired = 0; /* force recalculation*/
}
} else if (level == 0) {
__u32 baseOffset = chunkOffset << YAFFS_TNODES_LEVEL0_BITS;
- /* printf("write tnode at %d\n",baseOffset); */
ok = (yaffs_CheckpointWrite(dev,&baseOffset,sizeof(baseOffset)) == sizeof(baseOffset));
if(ok)
ok = (yaffs_CheckpointWrite(dev,tn,tnodeSize) == tnodeSize);
/* Read level 0 tnode */
- /* printf("read tnode at %d\n",baseChunk); */
tn = yaffs_GetTnodeRaw(dev);
if(tn)
ok = (yaffs_CheckpointRead(dev,tn,tnodeSize) == tnodeSize);
dev->nFreeChunks++;
- } else if (tags.chunkId > 0) {
+ } else if (tags.eccResult == YAFFS_ECC_RESULT_UNFIXED){
+ T(YAFFS_TRACE_SCAN,
+ (TSTR(" Unfixed ECC in chunk(%d:%d), chunk ignored"TENDSTR),
+ blk, c));
+
+ /* Don't actually delete because the chunk is not yet set up as being in use */
+ /* yaffs_DeleteChunk(dev, chunk, 1, __LINE__); */
+ }else if (tags.chunkId > 0) {
/* chunkId > 0 so it is a data chunk... */
unsigned int endpos;
__u32 chunkBase =