X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=yaffs_guts.h;h=03f8d0de9bca39b8f606288fe24fcae66052fa7e;hp=3ab41f70b29349db3dae36751b5113c6ca56c69b;hb=9f5e5dc8f9b59a6949c8500f32efa9389d67fd38;hpb=3d5f3cc536fd1e1c2ce477c4f3ba5147eb8678be diff --git a/yaffs_guts.h b/yaffs_guts.h index 3ab41f7..03f8d0d 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -14,14 +14,13 @@ * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. * - * $Id: yaffs_guts.h,v 1.13 2002-12-13 00:13:06 charles Exp $ + * $Id: yaffs_guts.h,v 1.19 2005-03-29 22:43:38 charles Exp $ */ #ifndef __YAFFS_GUTS_H__ #define __YAFFS_GUTS_H__ -#include "devextras.h" - +#include "yportenv.h" #define YAFFS_OK 1 #define YAFFS_FAIL 0 @@ -42,10 +41,11 @@ #define YAFFS_TNODES_INTERNAL_MASK 0x7 #define YAFFS_TNODES_MAX_LEVEL 6 +#define YAFFS_BYTES_PER_SPARE 16 + #define YAFFS_BYTES_PER_CHUNK 512 -#define YAFFS_CHUNK_SIZE_SHIFT 9 +//#define YAFFS_CHUNK_SIZE_SHIFT 9 -#define YAFFS_BYTES_PER_SPARE 16 #define YAFFS_CHUNKS_PER_BLOCK 32 #define YAFFS_BYTES_PER_BLOCK (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK) @@ -61,8 +61,6 @@ #define YAFFS_NOBJECT_BUCKETS 256 -#define YAFFS_RESERVED_BLOCKS 8 - #define YAFFS_OBJECT_SPACE 0x40000 #define YAFFS_MAX_NAME_LENGTH 255 #define YAFFS_SHORT_NAME_LENGTH 15 @@ -73,14 +71,7 @@ #define YAFFS_OBJECTID_LOSTNFOUND 2 #define YAFFS_OBJECTID_UNLINKED 3 -#define YAFFS_N_CACHE_CHUNKS 10 - -#ifdef CONFIG_YAFFS_WINCE - -// Force the short operation cache on for WinCE - -#define CONFIG_YAFFS_SHORT_OP_CACHE -#endif +#define YAFFS_MAX_SHORT_OP_CACHES 20 // ChunkCache is used for short read/write operations. @@ -90,11 +81,12 @@ typedef struct int chunkId; int lastUse; int dirty; + int nBytes; // Only valid if the cache is dirty __u8 data[YAFFS_BYTES_PER_CHUNK]; } yaffs_ChunkCache; // Tags structures in RAM -// NB This uses bitfield. Bitfields should not stradle a u32 boundary otherwise +// NB This uses bitfield. Bitfields should not straddle a u32 boundary otherwise // the structure size will get blown out. typedef struct @@ -131,10 +123,17 @@ typedef struct __u8 ecc2[3]; } yaffs_Spare; +//Special structure for passing through to mtd +struct yaffs_NANDSpare { + yaffs_Spare spare; + int eccres1; + int eccres2; +}; + // Block data in RAM typedef enum { - YAFFS_BLOCK_STATE_UddNKNOWN = 0, + YAFFS_BLOCK_STATE_UNKNOWN = 0, YAFFS_BLOCK_STATE_SCANNING, // Used while the block is being scanned. // NB Don't erase blocks while they're being scanned @@ -151,7 +150,7 @@ typedef enum { YAFFS_BLOCK_STATE_DIRTY, // All pages have been allocated and deleted. // Erase me, reuse me. - YAFFS_BLOCK_STATE_DEAD = 0x77 // This block has failed and is not in use + YAFFS_BLOCK_STATE_DEAD // This block has failed and is not in use } yaffs_BlockState; @@ -160,10 +159,13 @@ typedef enum { typedef struct { - __u32 pageBits; // bitmap of pages in use - __u8 blockState; // One of the above block states - __u8 pagesInUse; // number of pages in use - __u8 needsRetiring:1; // Data has failed on this block, need to get valid data off +#ifndef CONFIG_YAFFS_NO_YAFFS2 + __u32 sequenceNumber; // block sequence number for yaffs2 +#endif + int softDeletions:12; // number of soft deleted pages + int pagesInUse:12; // number of pages in use + __u32 blockState:4; // One of the above block states + __u32 needsRetiring:1; // Data has failed on this block, need to get valid data off // and retire the block. } yaffs_BlockInfo; @@ -231,7 +233,11 @@ typedef struct union yaffs_Tnode_union { +#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG + union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL+1]; +#else union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL]; +#endif __u16 level0[YAFFS_NTNODES_LEVEL0]; }; @@ -292,6 +298,7 @@ typedef union struct yaffs_ObjectStruct { __u8 deleted: 1; // This should only apply to unlinked files. + __u8 softDeleted: 1; // it has also been soft deleted __u8 unlinked: 1; // An unlinked file. The file should be in the unlinked pseudo directory. __u8 fake:1; // A fake object has no presence on NAND. __u8 renameAllowed:1; @@ -331,9 +338,11 @@ struct yaffs_ObjectStruct char shortName[YAFFS_SHORT_NAME_LENGTH+1]; #endif -#ifdef CONFIG_YAFFS_WINCE +#ifndef __KERNEL__ __u32 inUse; +#endif +#ifdef CONFIG_YAFFS_WINCE __u32 win_ctime[2]; __u32 win_mtime[2]; __u32 win_atime[2]; @@ -343,14 +352,16 @@ struct yaffs_ObjectStruct __u32 st_atime; // time of last access __u32 st_mtime; // time of last modification __u32 st_ctime; // time of last change - __u32 st_rdev; // device stuff for block and char devices #endif + __u32 st_rdev; // device stuff for block and char devices #ifdef __KERNEL__ struct inode *myInode; + __u8 deferedFree; // YAFFS has removed the object from NAND, but it is being kept + // Alive until the inode is cleared to prevent inode inconsistencies. #endif @@ -386,23 +397,21 @@ typedef struct struct yaffs_DeviceStruct { // Entry parameters set up way early. Yaffs sets up the rest. - int startBlock; // Start block we're allowed to use - int endBlock; // End block we're allowed to use - __u16 chunkGroupBits; // 0 for devices <= 32MB. else log2(nchunks) - 16 - __u16 chunkGroupSize; // == 2^^chunkGroupBits + int nBytesPerChunk; // Should be a power of 2 >= 512 + int nChunksPerBlock; // does not need to be a power of 2 + int startBlock; // Start block we're allowed to use + int endBlock; // End block we're allowed to use + int nReservedBlocks; // We want this tuneable so that we can reduce + // reserved blocks on NOR and RAM. + + int useNANDECC; // Flag to decide whether or not to use NANDECC + int nShortOpCaches; // If <= 0, then short op caching is disabled, else + // the number of short op caches (don't use too many). void *genericDevice; // Pointer to device context // On an mtd this holds the mtd pointer. - -#ifdef __KERNEL__ - struct semaphore sem;// Semaphore for waiting on erasure. - struct semaphore grossLock; // Gross locking semaphore - -#endif - - // NAND access functions (Must be set before calling YAFFS) int (*writeChunkToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_Spare *spare); @@ -410,16 +419,34 @@ struct yaffs_DeviceStruct int (*eraseBlockInNAND)(struct yaffs_DeviceStruct *dev,int blockInNAND); int (*initialiseNAND)(struct yaffs_DeviceStruct *dev); + // Runtime parameters. Set up by YAFFS. + + __u16 chunkGroupBits; // 0 for devices <= 32MB. else log2(nchunks) - 16 + __u16 chunkGroupSize; // == 2^^chunkGroupBits + +#ifdef __KERNEL__ + + struct semaphore sem;// Semaphore for waiting on erasure. + struct semaphore grossLock; // Gross locking semaphore + +#endif #ifdef __KERNEL__ void (*putSuperFunc)(struct super_block *sb); #endif - // Runtime parameters. + int isMounted; + + // Block Info yaffs_BlockInfo *blockInfo; + __u8 *chunkBits; // bitmap of chunks in use + int chunkBitmapStride; // Number of bytes of chunkBits per block. + // Must be consistent with nChunksPerBlock. + + int nErasedBlocks; - int allocationBlock; + int allocationBlock; // Current block being allocated off __u32 allocationPage; - int allocationBlockFinder; + int allocationBlockFinder; // Used to search for next allocation block // Runtime state int nTnodesCreated; @@ -440,7 +467,6 @@ struct yaffs_DeviceStruct int currentDirtyChecker; // Used to find current dirtiest block - int garbageCollectionRequired; // Operations since mount int nPageWrites; @@ -448,28 +474,28 @@ struct yaffs_DeviceStruct int nBlockErasures; int nGCCopies; int garbageCollections; + int passiveGarbageCollections; int nRetriedWrites; int nRetiredBlocks; int eccFixed; int eccUnfixed; int tagsEccFixed; int tagsEccUnfixed; + int nDeletions; + int nUnmarkedDeletions; yaffs_Object *rootDir; yaffs_Object *lostNFoundDir; // Buffer areas for storing data to recover from write failures - __u8 bufferedData[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; - yaffs_Spare bufferedSpare[YAFFS_CHUNKS_PER_BLOCK]; +// __u8 bufferedData[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; +// yaffs_Spare bufferedSpare[YAFFS_CHUNKS_PER_BLOCK]; int bufferedBlock; // Which block is buffered here? int doingBufferedBlockRewrite; - - int blockSelectedForGC; -#ifdef CONFIG_YAFFS_SHORT_OP_CACHE - yaffs_ChunkCache srCache[YAFFS_N_CACHE_CHUNKS]; + yaffs_ChunkCache *srCache; int srLastUse; -#endif + int cacheHits; // Stuff for background deletion and unlinked files. @@ -519,7 +545,7 @@ int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, __u32 offset, i int yaffs_ResizeFile(yaffs_Object *obj, int newSize); yaffs_Object *yaffs_MknodFile(yaffs_Object *parent,const char *name, __u32 mode, __u32 uid, __u32 gid); -int yaffs_FlushFile(yaffs_Object *obj); +int yaffs_FlushFile(yaffs_Object *obj,int updateTime); // Directory operations @@ -551,6 +577,9 @@ yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); void yfsd_WinFileTimeNow(__u32 target[2]); #endif +#ifdef __KERNEL__ +void yaffs_HandleDeferedFree(yaffs_Object *obj); +#endif // Debug dump int yaffs_DumpObject(yaffs_Object *obj); @@ -560,3 +589,5 @@ void yaffs_GutsTest(yaffs_Device *dev); #endif + +