X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=yaffs_guts.h;h=08cc362819f4557e50313238e474e647016156c6;hb=572f34a1cc2b7bddbd8d66f64be95ba158703a2e;hp=e6f74ddbc72daa600a13cc19951eaa5f8e65fdaa;hpb=54a94b218fce5de9c076266fc34c9de5bfcd656b;p=yaffs%2F.git diff --git a/yaffs_guts.h b/yaffs_guts.h index e6f74dd..08cc362 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -8,9 +8,13 @@ * Created by Charles Manning * * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as + * it under the terms of the GNU Lesser General Public License version 2.1 as * published by the Free Software Foundation. * + * + * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. + * + * $Id: yaffs_guts.h,v 1.11 2002-11-08 07:19:42 charles Exp $ */ #ifndef __YAFFS_GUTS_H__ @@ -22,7 +26,11 @@ #define YAFFS_OK 1 #define YAFFS_FAIL 0 -// Y=0x59, A=0x41, S=0x53 +// Give us a Y=0x59, +// Give us an A=0x41, +// Give us an FF=0xFF +// Give us an S=0x53 +// And what have we got... #define YAFFS_MAGIC 0x5941FF53 #define YAFFS_NTNODES_LEVEL0 16 @@ -53,17 +61,37 @@ #define YAFFS_NOBJECT_BUCKETS 256 -#define YAFFS_RESERVED_BLOCKS 5 +#define YAFFS_RESERVED_BLOCKS 8 #define YAFFS_OBJECT_SPACE 0x40000 -#define YAFFS_MAX_NAME_LENGTH 255 +#define YAFFS_MAX_NAME_LENGTH 255 +#define YAFFS_SHORT_NAME_LENGTH 15 -#define YAFFS_MAX_ALIAS_LENGTH 211 +#define YAFFS_MAX_ALIAS_LENGTH 159 #define YAFFS_OBJECTID_ROOT 1 -#define YAFFS_ROOT_MODE 0666 #define YAFFS_OBJECTID_LOSTNFOUND 2 -#define YAFFS_LOSTNFOUND_NAME "lost+found" +#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 + + +// ChunkCache is used for short read/write operations. +typedef struct +{ + struct yaffs_ObjectStruct *object; + int chunkId; + int lastUse; + int 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 @@ -93,9 +121,7 @@ typedef struct __u8 tagByte1; __u8 tagByte2; __u8 tagByte3; - __u8 pageStatus; // Currently unused, but sort of set aside to distinguish - // unused - vs- used -vs- deleted chunks. We achieve this by - // using the objectId tags. + __u8 pageStatus; // set to 0 to delete the chunk __u8 blockStatus; __u8 tagByte4; __u8 tagByte5; @@ -108,7 +134,9 @@ typedef struct // Block data in RAM typedef enum { - YAFFS_BLOCK_STATE_UNKNOWN = 0, + YAFFS_BLOCK_STATE_UddNKNOWN = 0, + YAFFS_BLOCK_STATE_SCANNING, // Used while the block is being scanned. + // NB Don't erase blocks while they're being scanned YAFFS_BLOCK_STATE_EMPTY, // This block is empty @@ -123,7 +151,7 @@ typedef enum { YAFFS_BLOCK_STATE_DIRTY, // All pages have been allocated and deleted. // Erase me, reuse me. - YAFFS_BLOCK_STATE_DEAD = 0x99 // This block has failed and is not in use + YAFFS_BLOCK_STATE_DEAD = 0x77 // This block has failed and is not in use } yaffs_BlockState; @@ -135,6 +163,8 @@ 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 + // and retire the block. } yaffs_BlockInfo; @@ -147,7 +177,8 @@ typedef enum YAFFS_OBJECT_TYPE_FILE, YAFFS_OBJECT_TYPE_SYMLINK, YAFFS_OBJECT_TYPE_DIRECTORY, - YAFFS_OBJECT_TYPE_HARDLINK + YAFFS_OBJECT_TYPE_HARDLINK, + YAFFS_OBJECT_TYPE_SPECIAL } yaffs_ObjectType; typedef struct @@ -156,24 +187,41 @@ typedef struct // Apply to everything int parentObjectId; - __u16 sum; // checksum of name + __u16 sum__NoLongerUsed; // checksum of name. Calc this off the name to prevent inconsistencies char name[YAFFS_MAX_NAME_LENGTH + 1]; // Thes following apply to directories, files, symlinks - not hard links __u32 st_mode; // protection + +#ifdef CONFIG_YAFFS_WINCE + __u32 notForWinCE[5]; +#else __u32 st_uid; // user ID of owner __u32 st_gid; // group ID of owner __u32 st_atime; // time of last access __u32 st_mtime; // time of last modification __u32 st_ctime; // time of last change - +#endif + // File size applies to files only int fileSize; // Equivalent object id applies to hard links only. int equivalentObjectId; + + // Alias is for symlinks only. char alias[YAFFS_MAX_ALIAS_LENGTH + 1]; + __u32 st_rdev; // device stuff for block and char devices (maj/min) + +#ifdef CONFIG_YAFFS_WINCE + __u32 win_ctime[2]; + __u32 win_atime[2]; + __u32 win_mtime[2]; + __u32 roomToGrow[6]; +#else + __u32 roomToGrow[12]; +#endif } yaffs_ObjectHeader; @@ -211,7 +259,8 @@ typedef struct yaffs_TnodeList_struct yaffs_TnodeList; typedef struct { __u32 fileSize; - __u32 topLevel; + __u32 scannedFileSize; + int topLevel; yaffs_Tnode *top; } yaffs_FileStructure; @@ -242,6 +291,8 @@ typedef union struct yaffs_ObjectStruct { + __u8 deleted: 1; // This should only apply to unlinked files. + __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; __u8 unlinkAllowed:1; @@ -268,16 +319,40 @@ struct yaffs_ObjectStruct // Where's my data in NAND? int chunkId; // where it lives + + int nDataChunks; __u32 objectId; // the object id value - __u32 st_mode; // protection + __u32 st_mode; // protection + +#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM + char shortName[YAFFS_SHORT_NAME_LENGTH+1]; +#endif + +#ifdef CONFIG_YAFFS_WINCE + __u32 inUse; + + __u32 win_ctime[2]; + __u32 win_mtime[2]; + __u32 win_atime[2]; +#else __u32 st_uid; // user ID of owner __u32 st_gid; // group ID of owner __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 + + + + +#ifdef __KERNEL__ + struct inode *myInode; +#endif + yaffs_ObjectType variantType; @@ -302,7 +377,7 @@ typedef struct yaffs_ObjectList_struct yaffs_ObjectList; typedef struct { struct list_head list; - __u32 count; + int count; } yaffs_ObjectBucket; @@ -311,9 +386,8 @@ typedef struct struct yaffs_DeviceStruct { // Entry parameters set up way early. Yaffs sets up the rest. - __u32 nBlocks; // Size of whole device in blocks - __u32 startBlock; // Start block we're allowed to use - __u32 endBlock; // End block we're allowed to use + 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 @@ -324,6 +398,7 @@ struct yaffs_DeviceStruct #ifdef __KERNEL__ struct semaphore sem;// Semaphore for waiting on erasure. + struct semaphore grossLock; // Gross locking semaphore #endif @@ -334,9 +409,11 @@ struct yaffs_DeviceStruct int (*readChunkFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare); int (*eraseBlockInNAND)(struct yaffs_DeviceStruct *dev,int blockInNAND); int (*initialiseNAND)(struct yaffs_DeviceStruct *dev); - - +#ifdef __KERNEL__ + void (*putSuperFunc)(struct super_block *sb); +#endif + // Runtime parameters. yaffs_BlockInfo *blockInfo; int nErasedBlocks; @@ -364,13 +441,46 @@ struct yaffs_DeviceStruct int garbageCollectionRequired; + // Operations since mount + int nPageWrites; + int nPageReads; + int nBlockErasures; + int nGCCopies; + int garbageCollections; + int nRetriedWrites; + int nRetiredBlocks; + int eccFixed; + int eccUnfixed; + int tagsEccFixed; + int tagsEccUnfixed; + 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]; + int bufferedBlock; // Which block is buffered here? + int doingBufferedBlockRewrite; + + int blockSelectedForGC; + +#ifdef CONFIG_YAFFS_SHORT_OP_CACHE + yaffs_ChunkCache srCache[YAFFS_N_CACHE_CHUNKS]; + int srLastUse; +#endif + int cacheHits; + + // Stuff for background deletion and unlinked files. + yaffs_Object *unlinkedDir; // Directory where unlinked and deleted files live. + yaffs_Object *unlinkedDeletion; // Current file being background deleted. + int nDeletedFiles; // Count of files awaiting deletion; + int nUnlinkedFiles; // Count of unlinked files. + int nBackgroundDeletions; // Count of background deletions. }; - typedef struct yaffs_DeviceStruct yaffs_Device; +typedef struct yaffs_DeviceStruct yaffs_Device; @@ -387,6 +497,7 @@ int yaffs_RenameObject(yaffs_Object *oldDir, const char *oldName, yaffs_Object * // generic Object functions int yaffs_Unlink(yaffs_Object *dir, const char *name); +int yaffs_DeleteFile(yaffs_Object *obj); // Object access functions. int yaffs_GetObjectName(yaffs_Object *obj,char *name,int buffSize); @@ -413,19 +524,29 @@ yaffs_Object *yaffs_MknodDirectory(yaffs_Object *parent,const char *name, __u32 yaffs_Object *yaffs_FindObjectByName(yaffs_Object *theDir,const char *name); int yaffs_ApplyToDirectoryChildren(yaffs_Object *theDir,int (*fn)(yaffs_Object *)); -yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev,int number); +yaffs_Object *yaffs_FindObjectByNumber(yaffs_Device *dev,__u32 number); // Link operations yaffs_Object *yaffs_Link(yaffs_Object *parent, const char *name, yaffs_Object *equivalentObject); +yaffs_Object *yaffs_GetEquivalentObject(yaffs_Object *obj); + // Symlink operations yaffs_Object *yaffs_MknodSymLink(yaffs_Object *parent, const char *name, __u32 mode, __u32 uid, __u32 gid, const char *alias); char *yaffs_GetSymlinkAlias(yaffs_Object *obj); +// Special inodes (fifos, sockets and devices) +yaffs_Object *yaffs_MknodSpecial(yaffs_Object *parent,const char *name, __u32 mode, __u32 uid, __u32 gid,__u32 rdev); + // Special directories yaffs_Object *yaffs_Root(yaffs_Device *dev); -yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); +yaffs_Object *yaffs_LostNFound(yaffs_Device *dev); + +#ifdef CONFIG_YAFFS_WINCE +// CONFIG_YAFFS_WINCE special stuff +void yfsd_WinFileTimeNow(__u32 target[2]); +#endif // Debug dump