int yaffs_CheckpointWrite(yaffs_Device *dev, const void *data, int nBytes) { int i = 0; int ok = 1; __u8 * dataBytes = (__u8 *)data; if (!dev->checkpointBuffer) return 0; if (!dev->checkpointOpenForWrite) return -1; while (i < nBytes && ok) { dev->checkpointBuffer[dev->checkpointByteOffset] = *dataBytes; dev->checkpointSum += *dataBytes; dev->checkpointXor ^= *dataBytes; dev->checkpointByteOffset++; i++; dataBytes++; dev->checkpointByteCount++; if (dev->checkpointByteOffset < 0 || dev->checkpointByteOffset >= dev->nDataBytesPerChunk) ok = yaffs_CheckpointFlushBuffer(dev); } return i; }
int yaffs_CheckpointClose(yaffs_Device *dev) { if (dev->checkpointOpenForWrite) { if (dev->checkpointByteOffset != 0) yaffs_CheckpointFlushBuffer(dev); } else { int i; for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) { yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev, dev->checkpointBlockList[i]); if (bi->blockState == YAFFS_BLOCK_STATE_EMPTY) bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; else { /* Todo this looks odd... */ } } YFREE(dev->checkpointBlockList); dev->checkpointBlockList = NULL; } dev->nFreeChunks -= dev->blocksInCheckpoint * dev->nChunksPerBlock; dev->nErasedBlocks -= dev->blocksInCheckpoint; T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint byte count %d" TENDSTR), dev->checkpointByteCount)); if (dev->checkpointBuffer) { /* free the buffer */ YFREE(dev->checkpointBuffer); dev->checkpointBuffer = NULL; return 1; } else return 0; }