Rolling in Ians and other changes
[yaffs2.git] / yaffs_guts.h
index cb9a8e09bce4d11beb29530ff6421ea455b5bae2..87b539b05b71284a20efcb9350ba5e653a8aecce 100644 (file)
@@ -1,8 +1,7 @@
 /*
- * YAFFS: Yet another FFS. A NAND-flash specific file system.
- * yaffs_guts.h: Configuration etc for yaffs_guts
+ * 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 <charles@aleph1.co.uk>
  * it under the terms of the GNU Lesser General Public License version 2.1 as
  * published by the Free Software Foundation.
  *
- *
  * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL.
- *
- * $Id: yaffs_guts.h,v 1.24 2006-10-03 10:13:03 charles Exp $
  */
 
 #ifndef __YAFFS_GUTS_H__
@@ -67,7 +63,7 @@
 
 #define YAFFS_OBJECT_SPACE             0x40000
 
-#define YAFFS_NCHECKPOINT_OBJECTS      5000
+#define YAFFS_CHECKPOINT_VERSION       3
 
 #ifdef CONFIG_YAFFS_UNICODE
 #define YAFFS_MAX_NAME_LENGTH          127
 
 #define YAFFS_N_TEMP_BUFFERS           4
 
+/* We limit the number attempts at sucessfully saving a chunk of data.
+ * Small-page devices have 32 pages per block; large-page devices have 64.
+ * Default to something in the order of 5 to 10 blocks worth of chunks.
+ */
+#define YAFFS_WR_ATTEMPTS              (5*64)
+
 /* Sequence numbers are used in YAFFS2 to determine block allocation order.
  * The range is limited slightly to help distinguish bad numbers from good.
  * This also allows us to perhaps in the future use special numbers for
@@ -164,6 +166,8 @@ typedef enum {
        YAFFS_OBJECT_TYPE_SPECIAL
 } yaffs_ObjectType;
 
+#define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIAL
+
 typedef struct {
 
        unsigned validMarker0;
@@ -266,16 +270,20 @@ typedef enum {
        /* This block has failed and is not in use */
 } yaffs_BlockState;
 
+#define        YAFFS_NUMBER_OF_BLOCK_STATES (YAFFS_BLOCK_STATE_DEAD + 1)
+
+
 typedef struct {
 
-       int softDeletions:12;   /* number of soft deleted pages */
-       int pagesInUse:12;      /* number of pages in use */
-       yaffs_BlockState blockState:4;  /* One of the above block states */
+       int softDeletions:10;   /* number of soft deleted pages */
+       int pagesInUse:10;      /* number of pages in use */
+       unsigned blockState:4;  /* One of the above block states. NB use unsigned because enum is sometimes an int */
        __u32 needsRetiring:1;  /* Data has failed on this block, need to get valid data off */
                                /* and retire the block. */
        __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */
-       __u32 gcPrioritise: 1;  /* An ECC check or bank check has failed on this block. 
+       __u32 gcPrioritise: 1;  /* An ECC check or blank check has failed on this block. 
                                   It should be prioritised for GC */
+        __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */
 
 #ifdef CONFIG_YAFFS_YAFFS2
        __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */
@@ -532,9 +540,6 @@ struct yaffs_DeviceStruct {
        int nReservedBlocks;    /* We want this tuneable so that we can reduce */
                                /* reserved blocks on NOR and RAM. */
        
-       /* Stuff used by the partitioned checkpointing mechanism */
-       int checkpointStartBlock;
-       int checkpointEndBlock;
        
        /* Stuff used by the shared space checkpointing mechanism */
        /* If this value is zero, then this mechanism is disabled */
@@ -596,6 +601,10 @@ struct yaffs_DeviceStruct {
        
 
        /* End of stuff that must be set before initialisation. */
+       
+       /* Checkpoint control. Can be set before or after initialisation */
+       __u8 skipCheckpointRead;
+       __u8 skipCheckpointWrite;
 
        /* Runtime parameters. Set up by YAFFS. */
 
@@ -651,6 +660,8 @@ struct yaffs_DeviceStruct {
        int checkpointNextBlock;
        int *checkpointBlockList;
        int checkpointMaxBlocks;
+       __u32 checkpointSum;
+       __u32 checkpointXor;
        
        /* Block Info */
        yaffs_BlockInfo *blockInfo;
@@ -687,6 +698,7 @@ struct yaffs_DeviceStruct {
        int currentDirtyChecker;        /* Used to find current dirtiest block */
 
        __u32 *gcCleanupList;   /* objects to delete at the end of a GC. */
+       int nonAggressiveSkip;  /* GC state/mode */
 
        /* Statistcs */
        int nPageWrites;
@@ -885,5 +897,6 @@ void yaffs_GutsTest(yaffs_Device * dev);
 void yaffs_InitialiseTags(yaffs_ExtendedTags * tags);
 void yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn);
 int yaffs_CheckFF(__u8 * buffer, int nBytes);
+void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
 
 #endif