- for(chunkInBlock = 0,oldChunk = block * dev->nChunksPerBlock;
- chunkInBlock < dev->nChunksPerBlock && yaffs_StillSomeChunkBits(dev,block);
- chunkInBlock++, oldChunk++ )
- {
- if(yaffs_CheckChunkBit(dev,block,chunkInBlock))
- {
-
- // This page is in use and might need to be copied off
-
- markNAND = 1;
-
- //T(("copying page %x from %d to %d\n",mask,oldChunk,newChunk));
-
- yaffs_InitialiseTags(&tags);
-
- yaffs_ReadChunkWithTagsFromNAND(dev,oldChunk,buffer, &tags);
-
- object = yaffs_FindObjectByNumber(dev,tags.objectId);
-
- T(YAFFS_TRACE_GC_DETAIL,(TSTR("Collecting page %d, %d %d %d " TENDSTR),chunkInBlock,tags.objectId,tags.chunkId,tags.byteCount));
-
- if(!object)
- {
- T(YAFFS_TRACE_ERROR,(TSTR("page %d in gc has no object " TENDSTR),oldChunk));
- }
-
- if(object && object->deleted && tags.chunkId != 0)
- {
- // Data chunk in a deleted file, throw it away
- // It's a soft deleted data chunk,
- // No need to copy this, just forget about it and fix up the
- // object.
-
- //yaffs_PutChunkIntoFile(object, tags.chunkId, 0,0);
- object->nDataChunks--;
-
- if(object->nDataChunks <= 0)
- {
- // remeber to clean up the object
- dev->gcCleanupList[cleanups] = tags.objectId;
- cleanups++;
- }
- markNAND = 0;
- }
- else if( 0 /* Todo object && object->deleted && object->nDataChunks == 0 */)
- {
- // Deleted object header with no data chunks.
- // Can be discarded and the file deleted.
- object->chunkId = 0;
- yaffs_FreeTnode(object->myDev,object->variant.fileVariant.top);
- object->variant.fileVariant.top = NULL;
- yaffs_DoGenericObjectDeletion(object);
-
- }
- else if(object)
- {
- // It's either a data chunk in a live file or
- // an ObjectHeader, so we're interested in it.
- // NB Need to keep the ObjectHeaders of deleted files
- // until the whole file has been deleted off
- tags.serialNumber++;
-
- dev->nGCCopies++;
-
- if(tags.chunkId == 0)
- {
- // It is an object Id,
- // We need to nuke the shrinkheader flags first
- // We no longer want the shrinkHeader flag since its work is done
- // and if it is left in place it will mess up scanning.
- // Also, clear out any shadowing stuff
-
- yaffs_ObjectHeader *oh = (yaffs_ObjectHeader *)buffer;
- oh->isShrink = 0;
- oh->shadowsObject = -1;
- tags.extraShadows = 0;
- tags.extraIsShrinkHeader = 0;
- }