Merge branch 'master' of ssh://www.aleph1.co.uk/home/aleph1/git/yaffs2
[yaffs2.git] / yaffs_guts.h
index 7d2ab53011e909346de68de72bda99a8203400cf..cf193914b4044bd2790a6a5d818eb73a7dd9bd35 100644 (file)
@@ -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 {
@@ -597,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;
@@ -700,6 +702,7 @@ struct yaffs_DeviceStruct {
        yaffs_ObjectList *allocatedObjectList;
 
        yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
+       __u32 bucketFinder;
 
        int nFreeChunks;
 
@@ -747,24 +750,28 @@ struct yaffs_DeviceStruct {
        /* 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 garbageCollections;
+       __u32 passiveGarbageCollections;
+       __u32 nRetriedWrites;
+       __u32 nRetiredBlocks;
+       __u32 eccFixed;
+       __u32 eccUnfixed;
+       __u32 tagsEccFixed;
+       __u32 tagsEccUnfixed;
+       __u32 nDeletions;
+       __u32 nUnmarkedDeletions;
+       __u32 refreshCount;
+       __u32 cacheHits;
 
 };
 
@@ -797,7 +804,6 @@ typedef struct {
 
        /* yaffs2 runtime stuff */
        unsigned sequenceNumber;        /* Sequence number of currently allocating block */
-       unsigned oldestDirtySequence;
 
 } yaffs_CheckpointDevice;
 
@@ -886,6 +892,10 @@ void yfsd_WinFileTimeNow(__u32 target[2]);
 
 void yaffs_HandleDeferedFree(yaffs_Object *obj);
 
+
+void yaffs_UpdateDirtyDirectories(yaffs_Device *dev);
+
+
 /* Debug dump  */
 int yaffs_DumpObject(yaffs_Object *obj);
 
@@ -900,4 +910,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