⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yaffs_guts.h

📁 yaffs2 lastest sourcecode~~
💻 H
📖 第 1 页 / 共 2 页
字号:
/* * YAFFS: Yet another Flash File System . A NAND-flash specific file system. * * Copyright (C) 2002-2007 Aleph One Ltd. *   for Toby Churchill Ltd and Brightstar Engineering * * Created by Charles Manning <charles@aleph1.co.uk> * * This program is free software; you can redistribute it and/or modify * 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. */#ifndef __YAFFS_GUTS_H__#define __YAFFS_GUTS_H__#include "devextras.h"#include "yportenv.h"#define YAFFS_OK	1#define YAFFS_FAIL  0/* 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#define YAFFS_TNODES_LEVEL0_BITS	4#define YAFFS_TNODES_LEVEL0_MASK	0xf#define YAFFS_NTNODES_INTERNAL 		(YAFFS_NTNODES_LEVEL0 / 2)#define YAFFS_TNODES_INTERNAL_BITS 	(YAFFS_TNODES_LEVEL0_BITS - 1)#define YAFFS_TNODES_INTERNAL_MASK	0x7#define YAFFS_TNODES_MAX_LEVEL		6#ifndef CONFIG_YAFFS_NO_YAFFS1#define YAFFS_BYTES_PER_SPARE		16#define YAFFS_BYTES_PER_CHUNK		512#define YAFFS_CHUNK_SIZE_SHIFT		9#define YAFFS_CHUNKS_PER_BLOCK		32#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#define YAFFS_ALLOCATION_NOBJECTS	100#define YAFFS_ALLOCATION_NTNODES	100#define YAFFS_ALLOCATION_NLINKS		100#define YAFFS_NOBJECT_BUCKETS		256#define YAFFS_OBJECT_SPACE		0x40000#define YAFFS_CHECKPOINT_VERSION 	3#ifdef CONFIG_YAFFS_UNICODE#define YAFFS_MAX_NAME_LENGTH		127#define YAFFS_MAX_ALIAS_LENGTH		79#else#define YAFFS_MAX_NAME_LENGTH		255#define YAFFS_MAX_ALIAS_LENGTH		159#endif#define YAFFS_SHORT_NAME_LENGTH		15/* Some special object ids for pseudo objects */#define YAFFS_OBJECTID_ROOT		1#define YAFFS_OBJECTID_LOSTNFOUND	2#define YAFFS_OBJECTID_UNLINKED		3#define YAFFS_OBJECTID_DELETED		4/* Sseudo object ids for checkpointing */#define YAFFS_OBJECTID_SB_HEADER	0x10#define YAFFS_OBJECTID_CHECKPOINT_DATA	0x20#define YAFFS_SEQUENCE_CHECKPOINT_DATA  0x21/* */#define YAFFS_MAX_SHORT_OP_CACHES	20#define YAFFS_N_TEMP_BUFFERS		6/* We limit the number attempts at sucessfully saving a chunk of data. * Small-page devices have 32 pages per block; large-page devices have 64. * Default to something in the order of 5 to 10 blocks worth of chunks. */#define YAFFS_WR_ATTEMPTS		(5*64)/* Sequence numbers are used in YAFFS2 to determine block allocation order. * The range is limited slightly to help distinguish bad numbers from good. * This also allows us to perhaps in the future use special numbers for * special purposes. * EFFFFF00 allows the allocation of 8 blocks per second (~1Mbytes) for 15 years, * and is a larger number than the lifetime of a 2GB device. */#define YAFFS_LOWEST_SEQUENCE_NUMBER	0x00001000#define YAFFS_HIGHEST_SEQUENCE_NUMBER	0xEFFFFF00/* Special sequence number for bad block that failed to be marked bad */#define YAFFS_SEQUENCE_BAD_BLOCK	0xFFFF0000/* ChunkCache is used for short read/write operations.*/typedef struct {	struct yaffs_ObjectStruct *object;	int chunkId;	int lastUse;	int dirty;	int nBytes;		/* Only valid if the cache is dirty */	int locked;		/* Can't push out or flush while locked. */#ifdef CONFIG_YAFFS_YAFFS2	__u8 *data;#else	__u8 data[YAFFS_BYTES_PER_CHUNK];#endif} yaffs_ChunkCache;/* Tags structures in RAM * NB This uses bitfield. Bitfields should not straddle a u32 boundary otherwise * the structure size will get blown out. */#ifndef CONFIG_YAFFS_NO_YAFFS1typedef struct {	unsigned chunkId:20;	unsigned serialNumber:2;	unsigned byteCountLSB:10;	unsigned objectId:18;	unsigned ecc:12;	unsigned byteCountMSB:2;} yaffs_Tags;typedef union {	yaffs_Tags asTags;	__u8 asBytes[8];} yaffs_TagsUnion;#endif/* Stuff used for extended tags in YAFFS2 */typedef enum {	YAFFS_ECC_RESULT_UNKNOWN,	YAFFS_ECC_RESULT_NO_ERROR,	YAFFS_ECC_RESULT_FIXED,	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;#define YAFFS_OBJECT_TYPE_MAX YAFFS_OBJECT_TYPE_SPECIALtypedef 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, else a data chunk */	unsigned byteCount;	/* Only valid for data chunks */	/* The following stuff only has meaning when we read */	yaffs_ECCResult eccResult;	unsigned blockBad;	/* YAFFS 1 stuff */	unsigned chunkDeleted;	/* The chunk is marked deleted */	unsigned serialNumber;	/* Yaffs1 2-bit serial number */	/* YAFFS2 stuff */	unsigned sequenceNumber;	/* The sequence number of this block */	/* Extra info if this is an object header (YAFFS2 only) */	unsigned extraHeaderInfoAvailable;	/* There is extra info available if this is not zero */	unsigned extraParentObjectId;	/* The parent object */	unsigned extraIsShrinkHeader;	/* Is it a shrink header? */	unsigned extraShadows;		/* Does this shadow another object? */	yaffs_ObjectType extraObjectType;	/* What object type? */	unsigned extraFileLength;		/* Length if it is a file */	unsigned extraEquivalentObjectId;	/* Equivalent object Id if it is a hard link */	unsigned validMarker1;} yaffs_ExtendedTags;/* Spare structure for YAFFS1 */typedef struct {	__u8 tagByte0;	__u8 tagByte1;	__u8 tagByte2;	__u8 tagByte3;	__u8 pageStatus;	/* set to 0 to delete the chunk */	__u8 blockStatus;	__u8 tagByte4;	__u8 tagByte5;	__u8 ecc1[3];	__u8 tagByte6;	__u8 tagByte7;	__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_UNKNOWN = 0,	YAFFS_BLOCK_STATE_SCANNING,	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	 */	YAFFS_BLOCK_STATE_EMPTY,	/* This block is empty */	YAFFS_BLOCK_STATE_ALLOCATING,	/* This block is partially allocated.	 * At least one page holds valid data.	 * This is the one currently being used for page	 * allocation. Should never be more than one of these	 */	YAFFS_BLOCK_STATE_FULL,	/* All the pages in this block have been allocated.	 */	YAFFS_BLOCK_STATE_DIRTY,	/* All pages have been allocated and deleted.	 * Erase me, reuse me.	 */	YAFFS_BLOCK_STATE_CHECKPOINT,	/* This block is assigned to holding checkpoint data.	 */	YAFFS_BLOCK_STATE_COLLECTING,	/* This block is being garbage collected */	YAFFS_BLOCK_STATE_DEAD	/* This block has failed and is not in use */} yaffs_BlockState;#define	YAFFS_NUMBER_OF_BLOCK_STATES (YAFFS_BLOCK_STATE_DEAD + 1)typedef struct {	int softDeletions:10;	/* number of soft deleted pages */	int pagesInUse:10;	/* number of pages in use */	unsigned blockState:4;	/* One of the above block states. NB use unsigned because enum is sometimes an int */	__u32 needsRetiring:1;	/* Data has failed on this block, need to get valid data off */				/* and retire the block. */	__u32 skipErasedCheck:1; /* If this is set we can skip the erased check on this block */	__u32 gcPrioritise:1; 	/* An ECC check or blank check has failed on this block.				   It should be prioritised for GC */	__u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */#ifdef CONFIG_YAFFS_YAFFS2	__u32 hasShrinkHeader:1; /* This block has at least one shrink object header */	__u32 sequenceNumber;	 /* block sequence number for yaffs2 */#endif} yaffs_BlockInfo;/* -------------------------- Object structure -------------------------------*//* This is the object structure as stored on NAND */typedef struct {	yaffs_ObjectType type;	/* Apply to everything  */	int parentObjectId;	__u16 sum__NoLongerUsed;        /* checksum of name. No longer used */	YCHAR name[YAFFS_MAX_NAME_LENGTH + 1];	/* The following apply to directories, files, symlinks - not hard links */	__u32 yst_mode;         /* protection */#ifdef CONFIG_YAFFS_WINCE	__u32 notForWinCE[5];#else	__u32 yst_uid;	__u32 yst_gid;	__u32 yst_atime;	__u32 yst_mtime;	__u32 yst_ctime;#endif	/* File size  applies to files only */	int fileSize;	/* Equivalent object id applies to hard links only. */	int equivalentObjectId;	/* Alias is for symlinks only. */	YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1];	__u32 yst_rdev;		/* device stuff for block and char devices (major/min) */#ifdef CONFIG_YAFFS_WINCE	__u32 win_ctime[2];	__u32 win_atime[2];	__u32 win_mtime[2];#else	__u32 roomToGrow[6];#endif	__u32 inbandShadowsObject;	__u32 inbandIsShrink;	__u32 reservedSpace[2];	int shadowsObject;	/* This object header shadows the specified object if > 0 */	/* isShrink applies to object headers written when we shrink the file (ie resize) */	__u32 isShrink;} yaffs_ObjectHeader;/*--------------------------- Tnode -------------------------- */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]; */};typedef union yaffs_Tnode_union yaffs_Tnode;struct yaffs_TnodeList_struct {	struct yaffs_TnodeList_struct *next;	yaffs_Tnode *tnodes;};typedef struct yaffs_TnodeList_struct yaffs_TnodeList;/*------------------------  Object -----------------------------*//* An object can be one of: * - a directory (no data, has children links * - a regular file (data.... not prunes :->). * - a symlink [symbolic link] (the alias). * - a hard link */typedef struct {	__u32 fileSize;	__u32 scannedFileSize;	__u32 shrinkSize;	int topLevel;	yaffs_Tnode *top;} yaffs_FileStructure;typedef struct {	struct ylist_head children;     /* list of child links */} yaffs_DirectoryStructure;typedef struct {	YCHAR *alias;} yaffs_SymLinkStructure;typedef struct {	struct yaffs_ObjectStruct *equivalentObject;	__u32 equivalentObjectId;} yaffs_HardLinkStructure;typedef union {	yaffs_FileStructure fileVariant;	yaffs_DirectoryStructure directoryVariant;	yaffs_SymLinkStructure symLinkVariant;	yaffs_HardLinkStructure hardLinkVariant;} yaffs_ObjectVariant;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 directory.*/	__u8 fake:1;		/* A fake object has no presence on NAND. */	__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 lazyLoaded:1;	/* This object has been lazy loaded and is missing some detail */	__u8 deferedFree:1;	/* For Linux kernel. Object is removed from NAND, but is				 * still in the inode cache. Free of object is defered.				 * until the inode is released.				 */	__u8 beingCreated:1;	/* This object is still being created so skip some checks. */	__u8 serial;		/* serial number of chunk in NAND. Cached here */	__u16 sum;		/* sum of the name to speed searching */	struct yaffs_DeviceStruct *myDev;       /* The device I'm on */	struct ylist_head hashLink;     /* list of objects in this hash bucket */	struct ylist_head hardLinks;    /* all the equivalent hard linked objects */	/* directory structure stuff */	/* also used for linking up the free list */	struct yaffs_ObjectStruct *parent;	struct ylist_head siblings;	/* Where's my object header in NAND? */	int hdrChunk;	int nDataChunks;	/* Number of data chunks attached to the file. */	__u32 objectId;		/* the object id value */	__u32 yst_mode;#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM	YCHAR shortName[YAFFS_SHORT_NAME_LENGTH + 1];#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -