summaryrefslogtreecommitdiff
path: root/yaffs_checkptrw.c
diff options
context:
space:
mode:
authorcharles <charles>2007-05-15 20:07:40 +0000
committercharles <charles>2007-05-15 20:07:40 +0000
commitb0b91352fff81d01d34fd562629ce199c255cdd6 (patch)
tree4e6794903c63b1fbba4c62838f06511d503cb46d /yaffs_checkptrw.c
parent8f1f39785a283189eed75ee16e145a5b6bfaccf0 (diff)
Adding checkpoint and robustness improvements
Diffstat (limited to 'yaffs_checkptrw.c')
-rw-r--r--yaffs_checkptrw.c26
1 files changed, 23 insertions, 3 deletions
diff --git a/yaffs_checkptrw.c b/yaffs_checkptrw.c
index 2f658e6..2f3f875 100644
--- a/yaffs_checkptrw.c
+++ b/yaffs_checkptrw.c
@@ -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++;