X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_checkptrw.c;h=2f3f875f75a65e677c6ee24688a3804550746077;hp=dcf7cf5042df99cd6c445bba110034840a5691f4;hb=b6a4e8ea42be221cca959a466199e568ac2ae698;hpb=ca5c7aa2360cc5ed3b8f946e935591a4d112d4b7 diff --git a/yaffs_checkptrw.c b/yaffs_checkptrw.c index dcf7cf5..2f3f875 100644 --- a/yaffs_checkptrw.c +++ b/yaffs_checkptrw.c @@ -1,6 +1,7 @@ -/* YAFFS: Yet another FFS. A NAND-flash specific file system. +/* + * YAFFS: Yet Another Flash File System. A NAND-flash specific file system. * - * Copyright (C) 2002 Aleph One Ltd. + * Copyright (C) 2002-2007 Aleph One Ltd. * for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning @@ -8,11 +9,10 @@ * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. - * */ const char *yaffs_checkptrw_c_version = - "$Id: yaffs_checkptrw.c,v 1.10 2006-11-10 02:51:10 charles 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) { @@ -48,7 +47,7 @@ static int yaffs_CheckpointErase(yaffs_Device *dev) yaffs_BlockInfo *bi = yaffs_GetBlockInfo(dev,i); if(bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT){ T(YAFFS_TRACE_CHECKPOINT,(TSTR("erasing checkpt block %d"TENDSTR),i)); - if(dev->eraseBlockInNAND(dev,i)){ + if(dev->eraseBlockInNAND(dev,i- dev->blockOffset /* realign */)){ bi->blockState = YAFFS_BLOCK_STATE_EMPTY; dev->nErasedBlocks++; dev->nFreeChunks += dev->nChunksPerBlock; @@ -105,8 +104,9 @@ static void yaffs_CheckpointFindNextCheckpointBlock(yaffs_Device *dev) if(dev->blocksInCheckpoint < dev->checkpointMaxBlocks) for(i = dev->checkpointNextBlock; i <= dev->internalEndBlock; i++){ int chunk = i * dev->nChunksPerBlock; + int realignedChunk = chunk - dev->chunkOffset; - dev->readChunkWithTagsFromNAND(dev,chunk,NULL,&tags); + dev->readChunkWithTagsFromNAND(dev,realignedChunk,NULL,&tags); T(YAFFS_TRACE_CHECKPOINT,(TSTR("find next checkpt block: search: block %d oid %d seq %d eccr %d" TENDSTR), i, tags.objectId,tags.sequenceNumber,tags.eccResult)); @@ -152,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; @@ -179,10 +181,19 @@ 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) { int chunk; + int realignedChunk; yaffs_ExtendedTags tags; @@ -208,11 +219,14 @@ static int yaffs_CheckpointFlushBuffer(yaffs_Device *dev) } chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk; + T(YAFFS_TRACE_CHECKPOINT,(TSTR("checkpoint wite buffer nand %d(%d:%d) objid %d chId %d" TENDSTR), chunk, dev->checkpointCurrentBlock, dev->checkpointCurrentChunk,tags.objectId,tags.chunkId)); - - dev->writeChunkWithTagsToNAND(dev,chunk,dev->checkpointBuffer,&tags); + + realignedChunk = chunk - dev->chunkOffset; + + dev->writeChunkWithTagsToNAND(dev,realignedChunk,dev->checkpointBuffer,&tags); dev->checkpointByteOffset = 0; dev->checkpointPageSequence++; dev->checkpointCurrentChunk++; @@ -238,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++; @@ -267,12 +287,16 @@ int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes) int chunk; + int realignedChunk; __u8 *dataBytes = (__u8 *)data; if(!dev->checkpointBuffer) return 0; + if(dev->checkpointOpenForWrite) + return -1; + while(i < nBytes && ok) { @@ -291,9 +315,11 @@ int yaffs_CheckpointRead(yaffs_Device *dev, void *data, int nBytes) chunk = dev->checkpointCurrentBlock * dev->nChunksPerBlock + dev->checkpointCurrentChunk; + realignedChunk = chunk - dev->chunkOffset; + /* read in the next chunk */ /* printf("read checkpoint page %d\n",dev->checkpointPage); */ - dev->readChunkWithTagsFromNAND(dev, chunk, + dev->readChunkWithTagsFromNAND(dev, realignedChunk, dev->checkpointBuffer, &tags); @@ -312,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++;