/*
* 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>
typedef struct {
struct ylist_head children; /* list of child links */
+ struct ylist_head dirty; /* Entry for list of dirty directories */
} yaffs_DirectoryStructure;
typedef struct {
/* 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;
int nFreeTnodes;
yaffs_TnodeList *allocatedTnodeList;
- int isDoingGC;
- int gcBlock;
- int gcChunk;
-
int nObjectsCreated;
yaffs_Object *freeObjects;
int nFreeObjects;
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;
/* 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;
};
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);
__u8 *yaffs_GetTempBuffer(yaffs_Device *dev, int lineNo);
void yaffs_ReleaseTempBuffer(yaffs_Device *dev, __u8 *buffer, int lineNo);
+
#endif