X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs2.git;a=blobdiff_plain;f=yaffs_guts.h;h=b770bde339d673ad786ac264ec27b77ba3c47d3a;hp=2d17f190f557352c4c0f3e863b133a935bdd4c69;hb=1611f6f850584af2a33e790f2e7e652d77ec6526;hpb=363520161b021b7ac870c269064606e3f16feeeb diff --git a/yaffs_guts.h b/yaffs_guts.h index 2d17f19..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.1 2004-11-03 08:14:07 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 @@ -103,7 +106,7 @@ typedef struct int dirty; int nBytes; // Only valid if the cache is dirty int locked; // Can't push out or flush while locked.. -#ifdef YAFFS2_DEFINES +#ifdef CONFIG_YAFFS_YAFFS2 __u8 *data; #else __u8 data[YAFFS_BYTES_PER_CHUNK]; @@ -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; @@ -197,16 +223,14 @@ struct yaffs_NANDSpare { typedef enum { YAFFS_BLOCK_STATE_UNKNOWN = 0, -#ifndef YAFFS2_DEFINES + YAFFS_BLOCK_STATE_SCANNING, -#else YAFFS_BLOCK_STATE_NEEDS_SCANNING,// The block might have something on it (ie it is allocating or full, perhaps empty) // but it needs to be scanned to determine its true state. // This state is only valid during yaffs_Scan. // NB We tolerate empty because the pre-scanner might be incapable of deciding // However, if this state is returned on a YAFFS2 device, then we expect a sequence number -#endif YAFFS_BLOCK_STATE_EMPTY, // This block is empty YAFFS_BLOCK_STATE_ALLOCATING, // This block is partially allocated. @@ -232,12 +256,12 @@ 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. -#ifndef CONFIG_YAFFS_NO_YAFFS2 +#ifdef CONFIG_YAFFS_YAFFS2 __u32 hasShrinkHeader:1;// This block has at least one object header that does a shrink __u32 sequenceNumber; // block sequence number for yaffs2 #endif @@ -248,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; @@ -344,6 +358,7 @@ typedef struct { __u32 fileSize; __u32 scannedFileSize; + __u32 shrinkSize; int topLevel; yaffs_Tnode *top; } yaffs_FileStructure; @@ -379,15 +394,22 @@ 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 // object might be created before the data // is available (ie. file data records appear before the header). __u8 serial; // serial number of chunk in NAND. Store here so we don't have to - // read back the old one to update. - __u16 sum; // sum of the name to speed searching + + __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 struct yaffs_DeviceStruct *myDev; // The device I'm on @@ -402,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 @@ -438,6 +460,7 @@ struct yaffs_ObjectStruct #ifdef __KERNEL__ struct inode *myInode; + #endif @@ -503,17 +526,15 @@ struct yaffs_DeviceStruct // NAND access functions (Must be set before calling YAFFS) -#ifndef CONFIG_YAFFS_NO_YAFFS1 + int (*writeChunkToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, const yaffs_Spare *spare); 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); -#endif -#ifndef CONFIG_YAFFS_NO_YAFFS2 - int (*writeChunkWithTagsToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_ExtendedTags *tags); - int (*readChunkWithTagsFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *data, yaffs_ExtendedTags *tags); int (*eraseBlockInNAND)(struct yaffs_DeviceStruct *dev,int blockInNAND); int (*initialiseNAND)(struct yaffs_DeviceStruct *dev); + +#ifdef CONFIG_YAFFS_YAFFS2 + int (*writeChunkWithTagsToNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, const __u8 *data, yaffs_ExtendedTags *tags); + int (*readChunkWithTagsFromNAND)(struct yaffs_DeviceStruct *dev,int chunkInNAND, __u8 *data, yaffs_ExtendedTags *tags); int (*markNANDBlockBad)(struct yaffs_DeviceStruct *dev, int blockNo); int (*queryNANDBlock)(struct yaffs_DeviceStruct *dev, int blockNo, yaffs_BlockState *state, int *sequenceNumber); #endif @@ -531,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 @@ -667,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); @@ -703,6 +722,13 @@ 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);