yaffs: Cache object xattrib state.
[yaffs2.git] / yaffs_yaffs2.c
index 40d9771cdf5019dbe90b41c07d2d1c1d9a01ddd4..b2fd8e47472fc545e31da2e7bfc82b846743e18c 100644 (file)
@@ -206,6 +206,7 @@ int yaffs2_CheckpointRequired(yaffs_Device *dev)
        nblocks = dev->internalEndBlock - dev->internalStartBlock + 1 ;
 
        return  !dev->param.skipCheckpointWrite &&
+               !dev->readOnly &&
                (nblocks >= YAFFS_CHECKPOINT_MIN_BLOCKS);
 }
 
@@ -1130,6 +1131,16 @@ int yaffs2_ScanBackwards(yaffs_Device *dev)
 
                                  dev->nFreeChunks++;
 
+                       } else if (tags.objectId > YAFFS_MAX_OBJECT_ID ||
+                               tags.chunkId > YAFFS_MAX_CHUNK_ID ||
+                               (tags.chunkId > 0 && tags.byteCount > dev->nDataBytesPerChunk) ||
+                               tags.sequenceNumber != bi->sequenceNumber ) {
+                               T(YAFFS_TRACE_SCAN,
+                                 (TSTR("Chunk (%d:%d) with bad tags:obj = %d, chunkId = %d, byteCount = %d, ignored"TENDSTR),
+                                 blk, c,tags.objectId, tags.chunkId, tags.byteCount));
+
+                                 dev->nFreeChunks++;
+
                        } else if (tags.chunkId > 0) {
                                /* chunkId > 0 so it is a data chunk... */
                                unsigned int endpos;
@@ -1304,7 +1315,6 @@ int yaffs2_ScanBackwards(yaffs_Device *dev)
                                        in->valid = 1;
 
                                        if (oh) {
-                                               in->variantType = oh->type;
 
                                                in->yst_mode = oh->yst_mode;
 #ifdef CONFIG_YAFFS_WINCE
@@ -1322,11 +1332,11 @@ int yaffs2_ScanBackwards(yaffs_Device *dev)
                                                in->yst_ctime = oh->yst_ctime;
                                                in->yst_rdev = oh->yst_rdev;
 
+                                               in->lazyLoaded = 0;
+
 #endif
-                                       } else {
-                                               in->variantType = tags.extraObjectType;
+                                       } else
                                                in->lazyLoaded = 1;
-                                       }
 
                                        in->hdrChunk = chunk;
 
@@ -1364,7 +1374,7 @@ int yaffs2_ScanBackwards(yaffs_Device *dev)
                                                        
 
 
-                                               yaffs_SetObjectName(in, oh->name);
+                                               yaffs_SetObjectNameFromOH(in, oh);
                                                parent =
                                                    yaffs_FindOrCreateObjectByNumber
                                                        (dev, oh->parentObjectId,