Adding checkpoint and robustness improvements
[yaffs2.git] / yaffs_checkptrw.c
index 2f658e68aadacf37eca09f30e34bb584e018cd5a..2f3f875f75a65e677c6ee24688a3804550746077 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 const char *yaffs_checkptrw_c_version =
-    "$Id: yaffs_checkptrw.c,v 1.13 2007-02-14 01:09:06 wookey Exp $";
+    "$Id: yaffs_checkptrw.c,v 1.14 2007-05-15 20:07:40 charles Exp $";
 
 
 #include "yaffs_checkptrw.h"
@@ -32,7 +32,6 @@ static int yaffs_CheckpointSpaceOk(yaffs_Device *dev)
 }
 
 
-
 static int yaffs_CheckpointErase(yaffs_Device *dev)
 {
        
@@ -153,6 +152,8 @@ int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting)
        dev->checkpointOpenForWrite = forWriting;
        
        dev->checkpointByteCount = 0;
+       dev->checkpointSum = 0;
+       dev->checkpointXor = 0;
        dev->checkpointCurrentBlock = -1;
        dev->checkpointCurrentChunk = -1;
        dev->checkpointNextBlock = dev->internalStartBlock;
@@ -180,6 +181,14 @@ int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting)
        return 1;
 }
 
+int yaffs_GetCheckpointSum(yaffs_Device *dev, __u32 *sum)
+{
+       __u32 compositeSum;
+       compositeSum =  (dev->checkpointSum << 8) | (dev->checkpointXor & 0xFF);
+       *sum = compositeSum;
+       return 1;
+}
+
 static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev)
 {
 
@@ -243,12 +252,18 @@ int yaffs_CheckpointWrite(yaffs_Device *dev,const void *data, int nBytes)
 
        if(!dev->checkpointBuffer)
                return 0;
+               
+       if(!dev->checkpointOpenForWrite)
+               return -1;
 
        while(i < nBytes && ok) {
                
 
                
-                dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
+               dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes ;
+               dev->checkpointSum += *dataBytes;
+               dev->checkpointXor ^= *dataBytes;
+                
                dev->checkpointByteOffset++;
                i++;
                dataBytes++;
@@ -279,6 +294,9 @@ int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
        if(!dev->checkpointBuffer)
                return 0;
 
+       if(dev->checkpointOpenForWrite)
+               return -1;
+
        while(i < nBytes && ok) {
        
        
@@ -320,6 +338,8 @@ int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes)
                
                if(ok){
                        *dataBytes = dev->checkpointBuffer[dev->checkpointByteOffset];
+                       dev->checkpointSum += *dataBytes;
+                       dev->checkpointXor ^= *dataBytes;
                        dev->checkpointByteOffset++;
                        i++;
                        dataBytes++;