X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.h;h=d08a6f6e8126cbbbb93aacdc006537ee85b99a64;hp=7643dfc6d2805d9201ed29059275738ef0022ac5;hb=29e2dccbc8145ce3fd337a91a266d29e9b0f3f60;hpb=adf8ff155a242969024595f8750f191be6b8acaf diff --git a/yaffs_guts.h b/yaffs_guts.h index 7643dfc..d08a6f6 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 @@ -361,12 +361,6 @@ union yaffs_Tnode_union { typedef union yaffs_Tnode_union yaffs_Tnode; -struct yaffs_TnodeList_struct { - struct yaffs_TnodeList_struct *next; - yaffs_Tnode *tnodes; -}; - -typedef struct yaffs_TnodeList_struct yaffs_TnodeList; /*------------------------ Object -----------------------------*/ /* An object can be one of: @@ -479,13 +473,6 @@ struct yaffs_ObjectStruct { typedef struct yaffs_ObjectStruct yaffs_Object; -struct yaffs_ObjectList_struct { - yaffs_Object *objects; - struct yaffs_ObjectList_struct *next; -}; - -typedef struct yaffs_ObjectList_struct yaffs_ObjectList; - typedef struct { struct ylist_head list; int count; @@ -564,6 +551,8 @@ struct yaffs_DeviceParamStruct { __u8 skipCheckpointRead; __u8 skipCheckpointWrite; + int enableXattr; /* Enable xattribs */ + /* NAND access functions (Must be set before calling YAFFS)*/ int (*writeChunkToNAND) (struct yaffs_DeviceStruct *dev, @@ -598,11 +587,15 @@ 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 */ + int disableSoftDelete; /* yaffs 1 only: Set to disable the use of softdeletion. */ int deferDirectoryUpdate; /* Set to defer directory updates */ @@ -629,6 +622,7 @@ struct yaffs_DeviceStruct { /* Stuff to support wide tnodes */ __u32 tnodeWidth; __u32 tnodeMask; + __u32 tnodeSize; /* Stuff for figuring out file offset to chunk conversions */ __u32 chunkShift; /* Shift value */ @@ -680,34 +674,30 @@ struct yaffs_DeviceStruct { __u32 allocationPage; int allocationBlockFinder; /* Used to search for next allocation block */ - int nTnodesCreated; - yaffs_Tnode *freeTnodes; - int nFreeTnodes; - yaffs_TnodeList *allocatedTnodeList; - - int isDoingGC; - int gcBlock; - int gcChunk; - - int nObjectsCreated; - yaffs_Object *freeObjects; - int nFreeObjects; + /* Object and Tnode memory management */ + void *allocator; + int nObjects; + int nTnodes; int nHardLinks; - yaffs_ObjectList *allocatedObjectList; - yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS]; __u32 bucketFinder; 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; @@ -742,6 +732,7 @@ 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. */ @@ -751,23 +742,25 @@ struct yaffs_DeviceStruct { /* 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; }; @@ -877,6 +870,12 @@ YCHAR *yaffs_GetSymlinkAlias(yaffs_Object *obj); yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent, const YCHAR *name, __u32 mode, __u32 uid, __u32 gid, __u32 rdev); + +int yaffs_SetXAttribute(yaffs_Object *obj, const char *name, const void * value, int size, int flags); +int yaffs_GetXAttribute(yaffs_Object *obj, const char *name, void *value, int size); +int yaffs_ListXAttributes(yaffs_Object *obj, char *buffer, int size); +int yaffs_RemoveXAttribute(yaffs_Object *obj, const char *name); + /* Special directories */ yaffs_Object *yaffs_Root(yaffs_Device *dev); yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); @@ -888,9 +887,9 @@ 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);