X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.h;h=3647d6bce6cd629dfcc483edead75c5519809a17;hp=3bae979134dfcd3fc7bb66f12d4bb6c78f65c39f;hb=401f9eb48ce20b18902ad9a4a8039d43e363d2ec;hpb=9dc68bf9810613883954fc50d26ed6f9c2c87ac0 diff --git a/yaffs_guts.h b/yaffs_guts.h index 3bae979..3647d6b 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -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 @@ -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