From: charles Date: Thu, 29 Oct 2009 03:05:55 +0000 (+0000) Subject: Fix checkpoint to handle out of space conditions better X-Git-Tag: pre-name-change~182 X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=commitdiff_plain;h=75977b65c083566a263c252312a06093d55c86ad;ds=sidebyside Fix checkpoint to handle out of space conditions better --- diff --git a/yaffs_checkptrw.c b/yaffs_checkptrw.c index 4481bbc..481b032 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.20 2009-09-09 03:03:01 charles Exp $"; + "$Id: yaffs_checkptrw.c,v 1.21 2009-10-29 03:05:55 charles Exp $"; #include "yaffs_checkptrw.h" @@ -130,6 +130,9 @@ static void yaffs_CheckpointFindNextCheckpointBlock(yaffs_Device *dev) int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting) { + + dev->checkpointOpenForWrite = forWriting; + /* Got the functions we need? */ if (!dev->writeChunkWithTagsToNAND || !dev->readChunkWithTagsFromNAND || @@ -147,9 +150,6 @@ int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting) dev->checkpointPageSequence = 0; - - dev->checkpointOpenForWrite = forWriting; - dev->checkpointByteCount = 0; dev->checkpointSum = 0; dev->checkpointXor = 0; @@ -358,11 +358,14 @@ int yaffs_CheckpointClose(yaffs_Device *dev) if (dev->checkpointOpenForWrite) { if (dev->checkpointByteOffset != 0) yaffs_CheckpointFlushBuffer(dev); - } else { + } else if(dev->checkpointBlockList){ 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) + int blk = dev->checkpointBlockList[i]; + yaffs_BlockInfo *bi = NULL; + if( dev->internalStartBlock <= blk && blk <= dev->internalEndBlock) + bi = yaffs_GetBlockInfo(dev, blk); + if (bi && bi->blockState == YAFFS_BLOCK_STATE_EMPTY) bi->blockState = YAFFS_BLOCK_STATE_CHECKPOINT; else { /* Todo this looks odd... */ @@ -390,13 +393,10 @@ int yaffs_CheckpointClose(yaffs_Device *dev) int yaffs_CheckpointInvalidateStream(yaffs_Device *dev) { - /* Erase the first checksum block */ + /* Erase the checkpoint data */ T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR))); - if (!yaffs_CheckpointSpaceOk(dev)) - return 0; - return yaffs_CheckpointErase(dev); }