Prevent corner case of a block changing state during a partial gc
authorcharles <charles>
Wed, 29 Jul 2009 04:30:24 +0000 (04:30 +0000)
committercharles <charles>
Wed, 29 Jul 2009 04:30:24 +0000 (04:30 +0000)
yaffs_guts.c

index 81ae37a..9872305 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 const char *yaffs_guts_c_version =
-    "$Id: yaffs_guts.c,v 1.86 2009-07-28 03:04:54 charles Exp $";
+    "$Id: yaffs_guts.c,v 1.87 2009-07-29 04:30:24 charles Exp $";
 
 #include "yportenv.h"
 
@@ -2969,7 +2969,6 @@ static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
 
        isCheckpointBlock = (bi->blockState == YAFFS_BLOCK_STATE_CHECKPOINT);
 
-       bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
 
        T(YAFFS_TRACE_TRACING,
                        (TSTR("Collecting block %d, in use %d, shrink %d, wholeBlock %d" TENDSTR),
@@ -2980,6 +2979,9 @@ static int yaffs_GarbageCollectBlock(yaffs_Device *dev, int block,
 
        /*yaffs_VerifyFreeChunks(dev); */
 
+       if(bi->blockState == YAFFS_BLOCK_STATE_FULL)
+               bi->blockState = YAFFS_BLOCK_STATE_COLLECTING;
+       
        bi->hasShrinkHeader = 0;        /* clear the flag so that the block can erase */
 
        /* Take off the number of soft deleted entries because