yaffs: Improve debug chunk erased checking, change refreshPeriod
[yaffs2.git] / yaffs_guts.h
index 53ab280aa67173d3dec74dba29b42805b34c77ca..3647d6bce6cd629dfcc483edead75c5519809a17 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * YAFFS: Yet another Flash File System . A NAND-flash specific file system.
  *
- * Copyright (C) 2002-2007 Aleph One Ltd.
+ * Copyright (C) 2002-2010 Aleph One Ltd.
  *   for Toby Churchill Ltd and Brightstar Engineering
  *
  * Created by Charles Manning <charles@aleph1.co.uk>
@@ -63,7 +63,7 @@
 
 #define YAFFS_OBJECT_SPACE             0x40000
 
-#define YAFFS_CHECKPOINT_VERSION       3
+#define YAFFS_CHECKPOINT_VERSION       4
 
 #ifdef CONFIG_YAFFS_UNICODE
 #define YAFFS_MAX_NAME_LENGTH          127
@@ -386,6 +386,7 @@ typedef struct {
 
 typedef struct {
        struct ylist_head children;     /* list of child links */
+       struct ylist_head dirty;        /* Entry for list of dirty directories */
 } yaffs_DirectoryStructure;
 
 typedef struct {
@@ -557,6 +558,8 @@ struct yaffs_DeviceParamStruct {
 
        int emptyLostAndFound;  /* Auto-empty lost+found directory on mount */
 
+       int refreshPeriod;      /* How often we should check to do a block refresh */
+
        /* Checkpoint control. Can be set before or after initialisation */
        __u8 skipCheckpointRead;
        __u8 skipCheckpointWrite;
@@ -595,17 +598,18 @@ struct yaffs_DeviceParamStruct {
 
        /* Callback to mark the superblock dirty */
        void (*markSuperBlockDirty)(struct yaffs_DeviceStruct *dev);
+       
+       /*  Callback to control garbage collection. */
+       unsigned (*gcControl)(struct yaffs_DeviceStruct *dev);
 
         /* Debug control flags. Don't use unless you know what you're doing */
        int useHeaderFileSize;  /* Flag to determine if we should use file sizes from the header */
        int disableLazyLoad;    /* Disable lazy loading on this device */
        int wideTnodesDisabled; /* Set to disable wide tnodes */
-
-       YCHAR *pathDividers;    /* String of legal path dividers */
-
+       int disableSoftDelete;  /* yaffs 1 only: Set to disable the use of softdeletion. */
+       
+       int deferDirectoryUpdate; /* Set to defer directory updates */
        
-
-       /* End of stuff that must be set before initialisation. */
 };
 
 typedef struct yaffs_DeviceParamStruct yaffs_DeviceParam;
@@ -685,10 +689,6 @@ struct yaffs_DeviceStruct {
        int nFreeTnodes;
        yaffs_TnodeList *allocatedTnodeList;
 
-       int isDoingGC;
-       int gcBlock;
-       int gcChunk;
-
        int nObjectsCreated;
        yaffs_Object *freeObjects;
        int nFreeObjects;
@@ -698,15 +698,22 @@ struct yaffs_DeviceStruct {
        yaffs_ObjectList *allocatedObjectList;
 
        yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
+       __u32 bucketFinder;
 
        int nFreeChunks;
 
-       int currentDirtyChecker;        /* Used to find current dirtiest block */
-
+       /* Garbage collection control */
        __u32 *gcCleanupList;   /* objects to delete at the end of a GC. */
-       int nonAggressiveSkip;  /* GC state/mode */
 
-       int hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */
+       unsigned hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */
+       unsigned gcDisable;
+       unsigned gcBlockFinder;
+       unsigned gcDirtiest;
+       unsigned gcPagesInUse;
+       unsigned gcNotDone;
+       unsigned gcBlock;
+       unsigned gcChunk;
+       unsigned gcSkip;
 
        /* Special directories */
        yaffs_Object *rootDir;
@@ -723,8 +730,6 @@ struct yaffs_DeviceStruct {
        yaffs_ChunkCache *srCache;
        int srLastUse;
 
-       int cacheHits;
-
        /* Stuff for background deletion and unlinked files.*/
        yaffs_Object *unlinkedDir;      /* Directory where unlinked and deleted files live. */
        yaffs_Object *deletedDir;       /* Directory where deleted objects are sent to disappear. */
@@ -733,7 +738,6 @@ struct yaffs_DeviceStruct {
        int nUnlinkedFiles;             /* Count of unlinked files. */
        int nBackgroundDeletions;       /* Count of background deletions. */
 
-
        /* Temporary buffer management */
        yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS];
        int maxTemp;
@@ -744,24 +748,36 @@ struct yaffs_DeviceStruct {
        /* yaffs2 runtime stuff */
        unsigned sequenceNumber;        /* Sequence number of currently allocating block */
        unsigned oldestDirtySequence;
-       
+       unsigned oldestDirtyBlock;
+
+       /* Block refreshing */
+       int refreshSkip;        /* A skip down counter. Refresh happens when this gets to zero. */
+
+       /* Dirty directory handling */
+       struct ylist_head dirtyDirectories; /* List of dirty directories */
+
 
        /* Statistcs */
-       int nPageWrites;
-       int nPageReads;
-       int nBlockErasures;
-       int nErasureFailures;
-       int nGCCopies;
-       int garbageCollections;
-       int passiveGarbageCollections;
-       int nRetriedWrites;
-       int nRetiredBlocks;
-       int eccFixed;
-       int eccUnfixed;
-       int tagsEccFixed;
-       int tagsEccUnfixed;
-       int nDeletions;
-       int nUnmarkedDeletions;
+       __u32 nPageWrites;
+       __u32 nPageReads;
+       __u32 nBlockErasures;
+       __u32 nErasureFailures;
+       __u32 nGCCopies;
+       __u32 allGCs;
+       __u32 passiveGCs;
+       __u32 oldestDirtyGCs;
+       __u32 backgroundGCs;
+       __u32 nRetriedWrites;
+       __u32 nRetiredBlocks;
+       __u32 eccFixed;
+       __u32 eccUnfixed;
+       __u32 tagsEccFixed;
+       __u32 tagsEccUnfixed;
+       __u32 nDeletions;
+       __u32 nUnmarkedDeletions;
+       __u32 refreshCount;
+       __u32 cacheHits;
+
 };
 
 typedef struct yaffs_DeviceStruct yaffs_Device;
@@ -793,7 +809,6 @@ typedef struct {
 
        /* yaffs2 runtime stuff */
        unsigned sequenceNumber;        /* Sequence number of currently allocating block */
-       unsigned oldestDirtySequence;
 
 } yaffs_CheckpointDevice;
 
@@ -882,6 +897,10 @@ void yfsd_WinFileTimeNow(__u32 target[2]);
 
 void yaffs_HandleDeferedFree(yaffs_Object *obj);
 
+void yaffs_UpdateDirtyDirectories(yaffs_Device *dev);
+
+int yaffs_BackgroundGarbageCollect(yaffs_Device *dev, unsigned urgency);
+
 /* Debug dump  */
 int yaffs_DumpObject(yaffs_Object *obj);
 
@@ -896,4 +915,5 @@ void yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi);
 __u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo);
 void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo);
 
+
 #endif