#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
typedef struct {
struct ylist_head children; /* list of child links */
+ struct ylist_head dirty; /* Entry for list of dirty directories */
} yaffs_DirectoryStructure;
typedef struct {
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;
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 */
-
-
- /* End of stuff that must be set before initialisation. */
+ int deferDirectoryUpdate; /* Set to defer directory updates */
+
};
typedef struct yaffs_DeviceParamStruct yaffs_DeviceParam;
yaffs_ObjectList *allocatedObjectList;
yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS];
+ __u32 bucketFinder;
int nFreeChunks;
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. */
int nUnlinkedFiles; /* Count of unlinked files. */
int nBackgroundDeletions; /* Count of background deletions. */
-
/* Temporary buffer management */
yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS];
int maxTemp;
/* yaffs2 runtime stuff */
unsigned sequenceNumber; /* Sequence number of currently allocating block */
unsigned oldestDirtySequence;
-
+
+ /* 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 garbageCollections;
+ __u32 passiveGarbageCollections;
+ __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;
/* yaffs2 runtime stuff */
unsigned sequenceNumber; /* Sequence number of currently allocating block */
- unsigned oldestDirtySequence;
} yaffs_CheckpointDevice;
void yaffs_HandleDeferedFree(yaffs_Object *obj);
+
+void yaffs_UpdateDirtyDirectories(yaffs_Device *dev);
+
+
/* 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