Rolling in Ians and other changes
[yaffs2.git] / yaffs_guts.h
index 9ef651d0f4475a31daf153c7b74d493b384ef683..87b539b05b71284a20efcb9350ba5e653a8aecce 100644 (file)
@@ -63,9 +63,7 @@
 
 #define YAFFS_OBJECT_SPACE             0x40000
 
-#define YAFFS_NCHECKPOINT_OBJECTS      5000
-
-#define YAFFS_CHECKPOINT_VERSION       2
+#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
@@ -162,6 +166,8 @@ typedef enum {
        YAFFS_OBJECT_TYPE_SPECIAL
 } yaffs_ObjectType;
 
+#define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIAL
+
 typedef struct {
 
        unsigned validMarker0;
@@ -264,15 +270,18 @@ 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:10;   /* number of soft deleted pages */
        int pagesInUse:10;      /* number of pages in use */
-       yaffs_BlockState blockState:4;  /* One of the above block states */
+       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 */
 
@@ -531,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 */
@@ -595,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. */
 
@@ -650,6 +660,8 @@ struct yaffs_DeviceStruct {
        int checkpointNextBlock;
        int *checkpointBlockList;
        int checkpointMaxBlocks;
+       __u32 checkpointSum;
+       __u32 checkpointXor;
        
        /* Block Info */
        yaffs_BlockInfo *blockInfo;
@@ -686,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;