yaffs: Improve debug chunk erased checking, change refreshPeriod
[yaffs2.git] / yaffs_guts.h
index 3bae979134dfcd3fc7bb66f12d4bb6c78f65c39f..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>
@@ -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 {
@@ -597,13 +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 */
-
-       /* End of stuff that must be set before initialisation. */
+       int disableSoftDelete;  /* yaffs 1 only: Set to disable the use of softdeletion. */
+       
+       int deferDirectoryUpdate; /* Set to defer directory updates */
+       
 };
 
 typedef struct yaffs_DeviceParamStruct yaffs_DeviceParam;
@@ -683,10 +689,6 @@ struct yaffs_DeviceStruct {
        int nFreeTnodes;
        yaffs_TnodeList *allocatedTnodeList;
 
-       int isDoingGC;
-       int gcBlock;
-       int gcChunk;
-
        int nObjectsCreated;
        yaffs_Object *freeObjects;
        int nFreeObjects;
@@ -700,12 +702,18 @@ struct yaffs_DeviceStruct {
 
        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;
@@ -740,28 +748,35 @@ 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;
-       int refreshCount;
-       int cacheHits;
+       __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;
 
 };
 
@@ -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