Add cache write through and some benign fixes
[yaffs2.git] / yaffs_guts.h
index 506ecd63c5ef9fd470f747a079aac4994a220e22..b770bde339d673ad786ac264ec27b77ba3c47d3a 100644 (file)
@@ -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);