X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.h;h=b770bde339d673ad786ac264ec27b77ba3c47d3a;hp=506ecd63c5ef9fd470f747a079aac4994a220e22;hb=1611f6f850584af2a33e790f2e7e652d77ec6526;hpb=6a4a7bfdb19f0d608d85f0103f90c6bbd265bf58 diff --git a/yaffs_guts.h b/yaffs_guts.h index 506ecd6..b770bde 100644 --- a/yaffs_guts.h +++ b/yaffs_guts.h @@ -1,5 +1,5 @@ /* - * YAFFS: Yet another FFS. A NAND-flash specific file system. + * YAFFS: Yet another FFS. A NAND-flash specific file system. * yaffs_guts.h: Configuration etc for yaffs_guts * * Copyright (C) 2002 Aleph One Ltd. @@ -14,7 +14,7 @@ * * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. * - * $Id: yaffs_guts.h,v 1.2 2004-11-16 02:36:15 charles Exp $ + * $Id: yaffs_guts.h,v 1.5 2005-07-03 10:32:40 charles Exp $ */ #ifndef __YAFFS_GUTS_H__ @@ -50,6 +50,9 @@ #define YAFFS_BYTES_PER_BLOCK (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK) #endif +#define YAFFS_MIN_YAFFS2_CHUNK_SIZE 1024 +#define YAFFS_MIN_YAFFS2_SPARE_SIZE 32 + #define YAFFS_MAX_CHUNK_ID 0x000FFFFF #define YAFFS_UNUSED_OBJECT_ID 0x0003FFFF @@ -143,14 +146,27 @@ typedef enum YAFFS_ECC_RESULT_UNFIXED } yaffs_ECCResult; +typedef enum +{ + YAFFS_OBJECT_TYPE_UNKNOWN, + YAFFS_OBJECT_TYPE_FILE, + YAFFS_OBJECT_TYPE_SYMLINK, + YAFFS_OBJECT_TYPE_DIRECTORY, + YAFFS_OBJECT_TYPE_HARDLINK, + YAFFS_OBJECT_TYPE_SPECIAL +} yaffs_ObjectType; + + typedef struct { unsigned validMarker0; unsigned chunkUsed; // Status of the chunk: used or unused unsigned objectId; // If 0 then this is not part of an object (unused) - unsigned chunkId; // If 0 then this is a header + unsigned chunkId; // If 0 then this is a header, else a data chunk unsigned byteCount; // Only valid for data chunks + + // The following stuff only has meaning when we read yaffs_ECCResult eccResult; // Only valid when we read. unsigned blockBad; // Only valid on reading @@ -162,6 +178,16 @@ typedef struct // YAFFS2 stuff unsigned sequenceNumber; // The sequence number of this block + // Extra info if this is an object header (YAFFS2 only) + unsigned extraHeaderInfoAvailable; + unsigned extraParentObjectId; + unsigned extraIsShrinkHeader; + + yaffs_ObjectType extraObjectType; + + unsigned extraFileLength; + unsigned extraEquivalentObjectId; + unsigned validMarker1; } yaffs_ExtendedTags; @@ -230,9 +256,9 @@ typedef enum { typedef struct { - int softDeletions:8; // number of soft deleted pages - int pagesInUse:8; // number of pages in use - __u32 blockState:4; // One of the above block states + int softDeletions:12; // number of soft deleted pages + int pagesInUse:12; // number of pages in use + yaffs_BlockState 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. #ifdef CONFIG_YAFFS_YAFFS2 @@ -246,16 +272,6 @@ typedef struct //////////////////// Object structure /////////////////////////// // This is the object structure as stored on NAND -typedef enum -{ - YAFFS_OBJECT_TYPE_UNKNOWN, - YAFFS_OBJECT_TYPE_FILE, - YAFFS_OBJECT_TYPE_SYMLINK, - YAFFS_OBJECT_TYPE_DIRECTORY, - YAFFS_OBJECT_TYPE_HARDLINK, - YAFFS_OBJECT_TYPE_SPECIAL -} yaffs_ObjectType; - typedef struct { yaffs_ObjectType type; @@ -342,6 +358,7 @@ typedef struct { __u32 fileSize; __u32 scannedFileSize; + __u32 shrinkSize; int topLevel; yaffs_Tnode *top; } yaffs_FileStructure; @@ -377,7 +394,7 @@ struct yaffs_ObjectStruct __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; + __u8 renameAllowed:1; // Some objects are not allowed to be renamed. __u8 unlinkAllowed:1; __u8 dirty:1; // the object needs to be written to flash __u8 valid:1; // When the file system is being loaded up, this @@ -387,9 +404,12 @@ struct yaffs_ObjectStruct __u8 deferedFree: 1; // For Linux kernel. Object is removed from NAND, but still in the inode cache. // Free of object is defered. + + __u8 lazyLoaded; // Vital info has been loaded from tags. Not all info available. + // - // read back the old one to update. - __u16 sum; // sum of the name to speed searching + // read back the old one to update. + __u16 sum; // sum of the name to speed searching struct yaffs_DeviceStruct *myDev; // The device I'm on @@ -404,10 +424,10 @@ struct yaffs_ObjectStruct struct list_head siblings; // siblings in a directory // also used for linking up the free list - // Where's my data in NAND? + // Where's my object header in NAND? int chunkId; // where it lives - int nDataChunks; + int nDataChunks; // Number of data chunks attached to the file. __u32 objectId; // the object id value @@ -532,9 +552,7 @@ struct yaffs_DeviceStruct struct semaphore sem;// Semaphore for waiting on erasure. struct semaphore grossLock; // Gross locking semaphore - -#endif -#ifdef __KERNEL__ + __u8 * spareBuffer; // For mtdif2 use. Don't know the size of the buffer at compile time so we have to allocate it. void (*putSuperFunc)(struct super_block *sb); #endif @@ -668,7 +686,7 @@ int yaffs_GetAttributes(yaffs_Object *obj, struct iattr *attr); // File operations int yaffs_ReadDataFromFile(yaffs_Object *obj, __u8 *buffer, __u32 offset, int nBytes); -int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, __u32 offset, int nBytes); +int yaffs_WriteDataToFile(yaffs_Object *obj, const __u8 *buffer, __u32 offset, int nBytes, int writeThrough); int yaffs_ResizeFile(yaffs_Object *obj, int newSize); yaffs_Object *yaffs_MknodFile(yaffs_Object *parent,const YCHAR *name, __u32 mode, __u32 uid, __u32 gid);