Revert "Fix yaffs checkpoint out of space crash"
author黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 14:45:08 +0000 (22:45 +0800)
committer黄涛 <huangtao@rock-chips.com>
Sat, 30 Jul 2011 14:45:08 +0000 (22:45 +0800)
This reverts commit 8ff4860c2778c0be92a63808036de337d13fa864.

fs/yaffs2/yaffs_checkptrw.c
fs/yaffs2/yaffs_guts.c

index 7b69a640f4b02126c061e3a01451dd1268b56064..66a4e7d9f0f968fd50e506eece37c3e170f44242 100644 (file)
@@ -130,9 +130,6 @@ 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 ||
@@ -150,6 +147,9 @@ int yaffs_CheckpointOpen(yaffs_Device *dev, int forWriting)
 
 
        dev->checkpointPageSequence = 0;
+
+       dev->checkpointOpenForWrite = forWriting;
+
        dev->checkpointByteCount = 0;
        dev->checkpointSum = 0;
        dev->checkpointXor = 0;
@@ -358,14 +358,11 @@ int yaffs_CheckpointClose(yaffs_Device *dev)
        if (dev->checkpointOpenForWrite) {
                if (dev->checkpointByteOffset != 0)
                        yaffs_CheckpointFlushBuffer(dev);
-       } else if(dev->checkpointBlockList){
+       } else {
                int i;
                for (i = 0; i < dev->blocksInCheckpoint && dev->checkpointBlockList[i] >= 0; i++) {
-                       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)
+                       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... */
@@ -393,10 +390,15 @@ int yaffs_CheckpointClose(yaffs_Device *dev)
 
 int yaffs_CheckpointInvalidateStream(yaffs_Device *dev)
 {
-       /* Erase the checkpoint data */
+       /* Erase the first checksum block */
+
+       T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate"TENDSTR)));
 
-       T(YAFFS_TRACE_CHECKPOINT, (TSTR("checkpoint invalidate of %d blocks"TENDSTR),
-               dev->blocksInCheckpoint));
+       if (!yaffs_CheckpointSpaceOk(dev))
+               return 0;
 
        return yaffs_CheckpointErase(dev);
 }
+
+
+
index 05ff48d1bc468e0ef2b582dcd0f796bd937be673..155b74643eb8044671704097444d109725f07ff5 100644 (file)
@@ -7436,9 +7436,6 @@ int yaffs_GutsInitialise(yaffs_Device *dev)
        yaffs_VerifyFreeChunks(dev);
        yaffs_VerifyBlocks(dev);
 
-       /* Clean up any aborted checkpoint data */
-       if (!dev->isCheckpointed && dev->blocksInCheckpoint > 0)
-               yaffs_InvalidateCheckpoint(dev);
 
        T(YAFFS_TRACE_TRACING,
          (TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR)));