140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* 240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * YAFFS: Yet another FFS. A NAND-flash specific file system. 340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * yaffs_guts.h: Configuration etc for yaffs_guts 440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Copyright (C) 2002 Aleph One Ltd. 640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * for Toby Churchill Ltd and Brightstar Engineering 740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Created by Charles Manning <charles@aleph1.co.uk> 940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 1040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * This program is free software; you can redistribute it and/or modify 1140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * it under the terms of the GNU Lesser General Public License version 2.1 as 1240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * published by the Free Software Foundation. 1340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 1440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 1540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Note: Only YAFFS headers are LGPL, YAFFS C code is covered by GPL. 1640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 1740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * $Id: yaffs_guts.h,v 1.25 2006/10/13 08:52:49 charles Exp $ 1840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 1940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 2040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifndef __YAFFS_GUTS_H__ 2140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define __YAFFS_GUTS_H__ 2240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 2340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#include "devextras.h" 2440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#include "yportenv.h" 2540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 2640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OK 1 2740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_FAIL 0 2840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 2940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Give us a Y=0x59, 3040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Give us an A=0x41, 3140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Give us an FF=0xFF 3240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Give us an S=0x53 3340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * And what have we got... 3440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 3540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAGIC 0x5941FF53 3640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 3740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_NTNODES_LEVEL0 16 3840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_TNODES_LEVEL0_BITS 4 3940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_TNODES_LEVEL0_MASK 0xf 4040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 4140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_NTNODES_INTERNAL (YAFFS_NTNODES_LEVEL0 / 2) 4240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_TNODES_INTERNAL_BITS (YAFFS_TNODES_LEVEL0_BITS - 1) 4340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_TNODES_INTERNAL_MASK 0x7 4440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_TNODES_MAX_LEVEL 6 4540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 4640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifndef CONFIG_YAFFS_NO_YAFFS1 4740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_BYTES_PER_SPARE 16 4840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_BYTES_PER_CHUNK 512 4940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_CHUNK_SIZE_SHIFT 9 5040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_CHUNKS_PER_BLOCK 32 5140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_BYTES_PER_BLOCK (YAFFS_CHUNKS_PER_BLOCK*YAFFS_BYTES_PER_CHUNK) 5240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 5340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 5440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MIN_YAFFS2_CHUNK_SIZE 1024 5540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MIN_YAFFS2_SPARE_SIZE 32 5640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 5740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_CHUNK_ID 0x000FFFFF 5840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 5940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_UNUSED_OBJECT_ID 0x0003FFFF 6040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 6140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_ALLOCATION_NOBJECTS 100 6240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_ALLOCATION_NTNODES 100 6340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_ALLOCATION_NLINKS 100 6440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 6540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_NOBJECT_BUCKETS 256 6640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 6740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 6840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECT_SPACE 0x40000 6940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 7040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_NCHECKPOINT_OBJECTS 5000 7140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 7240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_CHECKPOINT_VERSION 2 7340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 7440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_UNICODE 7540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_NAME_LENGTH 127 7640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_ALIAS_LENGTH 79 7740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 7840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_NAME_LENGTH 255 7940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_ALIAS_LENGTH 159 8040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 8140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 8240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_SHORT_NAME_LENGTH 15 8340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 8440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Some special object ids for pseudo objects */ 8540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_ROOT 1 8640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_LOSTNFOUND 2 8740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_UNLINKED 3 8840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_DELETED 4 8940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 9040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Sseudo object ids for checkpointing */ 9140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_SB_HEADER 0x10 9240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_OBJECTID_CHECKPOINT_DATA 0x20 9340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_SEQUENCE_CHECKPOINT_DATA 0x21 9440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 9540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* */ 9640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 9740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_MAX_SHORT_OP_CACHES 20 9840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 9940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_N_TEMP_BUFFERS 4 10040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 10140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Sequence numbers are used in YAFFS2 to determine block allocation order. 10240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * The range is limited slightly to help distinguish bad numbers from good. 10340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * This also allows us to perhaps in the future use special numbers for 10440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * special purposes. 10540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * EFFFFF00 allows the allocation of 8 blocks per second (~1Mbytes) for 15 years, 10640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * and is a larger number than the lifetime of a 2GB device. 10740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 10840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_LOWEST_SEQUENCE_NUMBER 0x00001000 10940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#define YAFFS_HIGHEST_SEQUENCE_NUMBER 0xEFFFFF00 11040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 11140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* ChunkCache is used for short read/write operations.*/ 11240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 11340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_ObjectStruct *object; 11440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkId; 11540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int lastUse; 11640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int dirty; 11740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBytes; /* Only valid if the cache is dirty */ 11840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int locked; /* Can't push out or flush while locked. */ 11940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_YAFFS2 12040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 *data; 12140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 12240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 data[YAFFS_BYTES_PER_CHUNK]; 12340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 12440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ChunkCache; 12540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 12640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 12740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 12840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Tags structures in RAM 12940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * NB This uses bitfield. Bitfields should not straddle a u32 boundary otherwise 13040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * the structure size will get blown out. 13140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 13240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 13340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifndef CONFIG_YAFFS_NO_YAFFS1 13440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 13540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned chunkId:20; 13640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned serialNumber:2; 13740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned byteCount:10; 13840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned objectId:18; 13940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned ecc:12; 14040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned unusedStuff:2; 14140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 14240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_Tags; 14340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 14440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef union { 14540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Tags asTags; 14640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 asBytes[8]; 14740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_TagsUnion; 14840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 14940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 15040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 15140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Stuff used for extended tags in YAFFS2 */ 15240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 15340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef enum { 15440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_ECC_RESULT_UNKNOWN, 15540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_ECC_RESULT_NO_ERROR, 15640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_ECC_RESULT_FIXED, 15740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_ECC_RESULT_UNFIXED 15840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ECCResult; 15940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 16040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef enum { 16140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_UNKNOWN, 16240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_FILE, 16340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_SYMLINK, 16440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_DIRECTORY, 16540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_HARDLINK, 16640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_OBJECT_TYPE_SPECIAL 16740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ObjectType; 16840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 16940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 17040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 17140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned validMarker0; 17240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned chunkUsed; /* Status of the chunk: used or unused */ 17340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned objectId; /* If 0 then this is not part of an object (unused) */ 17440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned chunkId; /* If 0 then this is a header, else a data chunk */ 17540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned byteCount; /* Only valid for data chunks */ 17640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 17740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* The following stuff only has meaning when we read */ 17840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ECCResult eccResult; 17940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned blockBad; 18040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 18140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* YAFFS 1 stuff */ 18240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned chunkDeleted; /* The chunk is marked deleted */ 18340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned serialNumber; /* Yaffs1 2-bit serial number */ 18440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 18540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* YAFFS2 stuff */ 18640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned sequenceNumber; /* The sequence number of this block */ 18740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 18840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Extra info if this is an object header (YAFFS2 only) */ 18940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 19040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraHeaderInfoAvailable; /* There is extra info available if this is not zero */ 19140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraParentObjectId; /* The parent object */ 19240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraIsShrinkHeader; /* Is it a shrink header? */ 19340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraShadows; /* Does this shadow another object? */ 19440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 19540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectType extraObjectType; /* What object type? */ 19640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 19740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraFileLength; /* Length if it is a file */ 19840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned extraEquivalentObjectId; /* Equivalent object Id if it is a hard link */ 19940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 20040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned validMarker1; 20140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 20240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ExtendedTags; 20340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 20440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Spare structure for YAFFS1 */ 20540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 20640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte0; 20740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte1; 20840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte2; 20940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte3; 21040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 pageStatus; /* set to 0 to delete the chunk */ 21140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 blockStatus; 21240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte4; 21340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte5; 21440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 ecc1[3]; 21540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte6; 21640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 tagByte7; 21740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 ecc2[3]; 21840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_Spare; 21940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 22040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*Special structure for passing through to mtd */ 22140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstruct yaffs_NANDSpare { 22240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Spare spare; 22340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int eccres1; 22440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int eccres2; 22540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 22640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 22740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Block data in RAM */ 22840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 22940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef enum { 23040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_UNKNOWN = 0, 23140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 23240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_SCANNING, 23340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_NEEDS_SCANNING, 23440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* The block might have something on it (ie it is allocating or full, perhaps empty) 23540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * but it needs to be scanned to determine its true state. 23640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * This state is only valid during yaffs_Scan. 23740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * NB We tolerate empty because the pre-scanner might be incapable of deciding 23840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * However, if this state is returned on a YAFFS2 device, then we expect a sequence number 23940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 24040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 24140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_EMPTY, 24240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* This block is empty */ 24340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 24440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_ALLOCATING, 24540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* This block is partially allocated. 24640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * At least one page holds valid data. 24740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * This is the one currently being used for page 24840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * allocation. Should never be more than one of these 24940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 25040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 25140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_FULL, 25240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* All the pages in this block have been allocated. 25340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 25440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 25540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_DIRTY, 25640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* All pages have been allocated and deleted. 25740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Erase me, reuse me. 25840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 25940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 26040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_CHECKPOINT, 26140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* This block is assigned to holding checkpoint data. 26240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 26340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 26440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_COLLECTING, 26540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* This block is being garbage collected */ 26640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 26740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YAFFS_BLOCK_STATE_DEAD 26840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* This block has failed and is not in use */ 26940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_BlockState; 27040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 27140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 27240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 27340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int softDeletions:10; /* number of soft deleted pages */ 27440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int pagesInUse:10; /* number of pages in use */ 27540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_BlockState blockState:4; /* One of the above block states */ 27640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 needsRetiring:1; /* Data has failed on this block, need to get valid data off */ 27740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* and retire the block. */ 27840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 skipErasedCheck: 1; /* If this is set we can skip the erased check on this block */ 27940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 gcPrioritise: 1; /* An ECC check or bank check has failed on this block. 28040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project It should be prioritised for GC */ 28140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 chunkErrorStrikes:3; /* How many times we've had ecc etc failures on this block and tried to reuse it */ 28240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 28340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_YAFFS2 28440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 hasShrinkHeader:1; /* This block has at least one shrink object header */ 28540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 sequenceNumber; /* block sequence number for yaffs2 */ 28640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 28740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 28840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_BlockInfo; 28940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 29040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* -------------------------- Object structure -------------------------------*/ 29140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* This is the object structure as stored on NAND */ 29240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 29340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 29440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectType type; 29540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 29640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Apply to everything */ 29740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int parentObjectId; 29840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u16 sum__NoLongerUsed; /* checksum of name. No longer used */ 29940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YCHAR name[YAFFS_MAX_NAME_LENGTH + 1]; 30040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 30140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Thes following apply to directories, files, symlinks - not hard links */ 30240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_mode; /* protection */ 30340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 30440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_WINCE 30540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 notForWinCE[5]; 30640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 30740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_uid; 30840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_gid; 30940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_atime; 31040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_mtime; 31140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_ctime; 31240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 31340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 31440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* File size applies to files only */ 31540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int fileSize; 31640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 31740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Equivalent object id applies to hard links only. */ 31840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int equivalentObjectId; 31940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 32040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Alias is for symlinks only. */ 32140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YCHAR alias[YAFFS_MAX_ALIAS_LENGTH + 1]; 32240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 32340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_rdev; /* device stuff for block and char devices (major/min) */ 32440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 32540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_WINCE 32640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_ctime[2]; 32740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_atime[2]; 32840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_mtime[2]; 32940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 roomToGrow[4]; 33040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 33140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 roomToGrow[10]; 33240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 33340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 33440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int shadowsObject; /* This object header shadows the specified object if > 0 */ 33540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 33640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* isShrink applies to object headers written when we shrink the file (ie resize) */ 33740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 isShrink; 33840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 33940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ObjectHeader; 34040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 34140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*--------------------------- Tnode -------------------------- */ 34240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 34340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectunion yaffs_Tnode_union { 34440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_TNODE_LIST_DEBUG 34540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL + 1]; 34640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 34740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project union yaffs_Tnode_union *internal[YAFFS_NTNODES_INTERNAL]; 34840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 34940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* __u16 level0[YAFFS_NTNODES_LEVEL0]; */ 35040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 35140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 35240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 35340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef union yaffs_Tnode_union yaffs_Tnode; 35440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 35540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstruct yaffs_TnodeList_struct { 35640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_TnodeList_struct *next; 35740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Tnode *tnodes; 35840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 35940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 36040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct yaffs_TnodeList_struct yaffs_TnodeList; 36140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 36240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*------------------------ Object -----------------------------*/ 36340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* An object can be one of: 36440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * - a directory (no data, has children links 36540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * - a regular file (data.... not prunes :->). 36640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * - a symlink [symbolic link] (the alias). 36740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * - a hard link 36840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 36940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 37040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 37140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 fileSize; 37240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 scannedFileSize; 37340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 shrinkSize; 37440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int topLevel; 37540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Tnode *top; 37640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_FileStructure; 37740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 37840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 37940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head children; /* list of child links */ 38040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_DirectoryStructure; 38140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 38240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 38340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YCHAR *alias; 38440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_SymLinkStructure; 38540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 38640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 38740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_ObjectStruct *equivalentObject; 38840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 equivalentObjectId; 38940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_HardLinkStructure; 39040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 39140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef union { 39240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_FileStructure fileVariant; 39340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_DirectoryStructure directoryVariant; 39440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_SymLinkStructure symLinkVariant; 39540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_HardLinkStructure hardLinkVariant; 39640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ObjectVariant; 39740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 39840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstruct yaffs_ObjectStruct { 39940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 deleted:1; /* This should only apply to unlinked files. */ 40040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 softDeleted:1; /* it has also been soft deleted */ 40140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 unlinked:1; /* An unlinked file. The file should be in the unlinked directory.*/ 40240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 fake:1; /* A fake object has no presence on NAND. */ 40340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 renameAllowed:1; /* Some objects are not allowed to be renamed. */ 40440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 unlinkAllowed:1; 40540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 dirty:1; /* the object needs to be written to flash */ 40640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 valid:1; /* When the file system is being loaded up, this 40740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * object might be created before the data 40840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * is available (ie. file data records appear before the header). 40940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 41040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 lazyLoaded:1; /* This object has been lazy loaded and is missing some detail */ 41140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 41240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 deferedFree:1; /* For Linux kernel. Object is removed from NAND, but is 41340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * still in the inode cache. Free of object is defered. 41440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * until the inode is released. 41540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 41640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 41740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 serial; /* serial number of chunk in NAND. Cached here */ 41840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u16 sum; /* sum of the name to speed searching */ 41940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 42040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_DeviceStruct *myDev; /* The device I'm on */ 42140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 42240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head hashLink; /* list of objects in this hash bucket */ 42340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 42440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head hardLinks; /* all the equivalent hard linked objects */ 42540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 42640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* directory structure stuff */ 42740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* also used for linking up the free list */ 42840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_ObjectStruct *parent; 42940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head siblings; 43040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 43140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Where's my object header in NAND? */ 43240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkId; 43340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 43440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDataChunks; /* Number of data chunks attached to the file. */ 43540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 43640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 objectId; /* the object id value */ 43740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 43840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_mode; 43940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 44040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_SHORT_NAMES_IN_RAM 44140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YCHAR shortName[YAFFS_SHORT_NAME_LENGTH + 1]; 44240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 44340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 44440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifndef __KERNEL__ 44540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 inUse; 44640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 44740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 44840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_WINCE 44940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_ctime[2]; 45040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_mtime[2]; 45140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 win_atime[2]; 45240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#else 45340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_uid; 45440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_gid; 45540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_atime; 45640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_mtime; 45740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_ctime; 45840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 45940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 46040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 yst_rdev; 46140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 46240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef __KERNEL__ 46340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct inode *myInode; 46440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 46540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 46640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 46740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectType variantType; 46840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 46940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectVariant variant; 47040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 47140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 47240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 47340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct yaffs_ObjectStruct yaffs_Object; 47440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 47540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstruct yaffs_ObjectList_struct { 47640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *objects; 47740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct yaffs_ObjectList_struct *next; 47840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 47940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 48040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct yaffs_ObjectList_struct yaffs_ObjectList; 48140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 48240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 48340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head list; 48440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int count; 48540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_ObjectBucket; 48640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 48740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 48840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* yaffs_CheckpointObject holds the definition of an object as dumped 48940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * by checkpointing. 49040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 49140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 49240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 49340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int structType; 49440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 objectId; 49540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 parentId; 49640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkId; 49740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 49840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectType variantType:3; 49940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 deleted:1; 50040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 softDeleted:1; 50140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 unlinked:1; 50240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 fake:1; 50340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 renameAllowed:1; 50440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 unlinkAllowed:1; 50540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 serial; 50640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 50740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDataChunks; 50840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 fileSizeOrEquivalentObjectId; 50940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 51040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}yaffs_CheckpointObject; 51140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 51240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*--------------------- Temporary buffers ---------------- 51340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * 51440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * These are chunk-sized working buffers. Each device has a few 51540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 51640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 51740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 51840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 *buffer; 51940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int line; /* track from whence this buffer was allocated */ 52040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int maxLine; 52140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_TempBuffer; 52240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 52340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*----------------- Device ---------------------------------*/ 52440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 52540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstruct yaffs_DeviceStruct { 52640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct list_head devList; 52740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project const char *name; 52840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 52940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Entry parameters set up way early. Yaffs sets up the rest.*/ 53040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDataBytesPerChunk; /* Should be a power of 2 >= 512 */ 53140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nChunksPerBlock; /* does not need to be a power of 2 */ 53240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBytesPerSpare; /* spare area size */ 53340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int startBlock; /* Start block we're allowed to use */ 53440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int endBlock; /* End block we're allowed to use */ 53540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nReservedBlocks; /* We want this tuneable so that we can reduce */ 53640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* reserved blocks on NOR and RAM. */ 53740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 53840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff used by the partitioned checkpointing mechanism */ 53940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointStartBlock; 54040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointEndBlock; 54140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 54240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff used by the shared space checkpointing mechanism */ 54340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* If this value is zero, then this mechanism is disabled */ 54440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 54540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nCheckpointReservedBlocks; /* Blocks to reserve for checkpoint data */ 54640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 54740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 54840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 54940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 55040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nShortOpCaches; /* If <= 0, then short op caching is disabled, else 55140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * the number of short op caches (don't use too many) 55240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 55340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 55440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int useHeaderFileSize; /* Flag to determine if we should use file sizes from the header */ 55540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 55640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int useNANDECC; /* Flag to decide whether or not to use NANDECC */ 55740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 55840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project void *genericDevice; /* Pointer to device context 55940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * On an mtd this holds the mtd pointer. 56040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 56140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project void *superBlock; 56240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 56340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* NAND access functions (Must be set before calling YAFFS)*/ 56440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 56540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*writeChunkToNAND) (struct yaffs_DeviceStruct * dev, 56640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkInNAND, const __u8 * data, 56740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project const yaffs_Spare * spare); 56840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*readChunkFromNAND) (struct yaffs_DeviceStruct * dev, 56940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkInNAND, __u8 * data, 57040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Spare * spare); 57140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*eraseBlockInNAND) (struct yaffs_DeviceStruct * dev, 57240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int blockInNAND); 57340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*initialiseNAND) (struct yaffs_DeviceStruct * dev); 57440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 57540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_YAFFS2 57640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*writeChunkWithTagsToNAND) (struct yaffs_DeviceStruct * dev, 57740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkInNAND, const __u8 * data, 57840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project const yaffs_ExtendedTags * tags); 57940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*readChunkWithTagsFromNAND) (struct yaffs_DeviceStruct * dev, 58040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkInNAND, __u8 * data, 58140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ExtendedTags * tags); 58240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*markNANDBlockBad) (struct yaffs_DeviceStruct * dev, int blockNo); 58340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*queryNANDBlock) (struct yaffs_DeviceStruct * dev, int blockNo, 58440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_BlockState * state, int *sequenceNumber); 58540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 58640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 58740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int isYaffs2; 58840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 58940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* The removeObjectCallback function must be supplied by OS flavours that 59040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * need it. The Linux kernel does not use this, but yaffs direct does use 59140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * it to implement the faster readdir 59240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 59340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project void (*removeObjectCallback)(struct yaffs_ObjectStruct *obj); 59440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 59540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Callback to mark the superblock dirsty */ 59640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project void (*markSuperBlockDirty)(void * superblock); 59740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 59840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int wideTnodesDisabled; /* Set to disable wide tnodes */ 59940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 60040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 60140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* End of stuff that must be set before initialisation. */ 60240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 60340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Runtime parameters. Set up by YAFFS. */ 60440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 60540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u16 chunkGroupBits; /* 0 for devices <= 32MB. else log2(nchunks) - 16 */ 60640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u16 chunkGroupSize; /* == 2^^chunkGroupBits */ 60740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 60840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff to support wide tnodes */ 60940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 tnodeWidth; 61040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 tnodeMask; 61140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 61240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff to support various file offses to chunk/offset translations */ 61340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* "Crumbs" for nDataBytesPerChunk not being a power of 2 */ 61440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 crumbMask; 61540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 crumbShift; 61640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 crumbsPerChunk; 61740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 61840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Straight shifting for nDataBytesPerChunk being a power of 2 */ 61940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 chunkShift; 62040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 chunkMask; 62140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 62240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 62340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef __KERNEL__ 62440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 62540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct semaphore sem; /* Semaphore for waiting on erasure.*/ 62640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project struct semaphore grossLock; /* Gross locking semaphore */ 62740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 *spareBuffer; /* For mtdif2 use. Don't know the size of the buffer 62840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * at compile time so we have to allocate it. 62940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 63040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project void (*putSuperFunc) (struct super_block * sb); 63140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 63240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 63340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int isMounted; 63440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 63540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int isCheckpointed; 63640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 63740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 63840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff to support block offsetting to support start block zero */ 63940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int internalStartBlock; 64040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int internalEndBlock; 64140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int blockOffset; 64240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkOffset; 64340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 64440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 64540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Runtime checkpointing stuff */ 64640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointPageSequence; /* running sequence number of checkpoint pages */ 64740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointByteCount; 64840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointByteOffset; 64940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 *checkpointBuffer; 65040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointOpenForWrite; 65140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int blocksInCheckpoint; 65240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointCurrentChunk; 65340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointCurrentBlock; 65440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointNextBlock; 65540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int *checkpointBlockList; 65640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointMaxBlocks; 65740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 65840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Block Info */ 65940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_BlockInfo *blockInfo; 66040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u8 *chunkBits; /* bitmap of chunks in use */ 66140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned blockInfoAlt:1; /* was allocated using alternative strategy */ 66240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned chunkBitsAlt:1; /* was allocated using alternative strategy */ 66340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int chunkBitmapStride; /* Number of bytes of chunkBits per block. 66440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * Must be consistent with nChunksPerBlock. 66540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 66640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 66740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nErasedBlocks; 66840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int allocationBlock; /* Current block being allocated off */ 66940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 allocationPage; 67040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int allocationBlockFinder; /* Used to search for next allocation block */ 67140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 67240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Runtime state */ 67340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nTnodesCreated; 67440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Tnode *freeTnodes; 67540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nFreeTnodes; 67640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_TnodeList *allocatedTnodeList; 67740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 67840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int isDoingGC; 67940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 68040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nObjectsCreated; 68140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *freeObjects; 68240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nFreeObjects; 68340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 68440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectList *allocatedObjectList; 68540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 68640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ObjectBucket objectBucket[YAFFS_NOBJECT_BUCKETS]; 68740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 68840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nFreeChunks; 68940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 69040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int currentDirtyChecker; /* Used to find current dirtiest block */ 69140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 69240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 *gcCleanupList; /* objects to delete at the end of a GC. */ 69340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 69440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Statistcs */ 69540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nPageWrites; 69640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nPageReads; 69740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBlockErasures; 69840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nErasureFailures; 69940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nGCCopies; 70040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int garbageCollections; 70140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int passiveGarbageCollections; 70240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nRetriedWrites; 70340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nRetiredBlocks; 70440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int eccFixed; 70540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int eccUnfixed; 70640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int tagsEccFixed; 70740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int tagsEccUnfixed; 70840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDeletions; 70940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nUnmarkedDeletions; 71040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 71140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int hasPendingPrioritisedGCs; /* We think this device might have pending prioritised gcs */ 71240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 71340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Special directories */ 71440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *rootDir; 71540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *lostNFoundDir; 71640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 71740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Buffer areas for storing data to recover from write failures TODO 71840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * __u8 bufferedData[YAFFS_CHUNKS_PER_BLOCK][YAFFS_BYTES_PER_CHUNK]; 71940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * yaffs_Spare bufferedSpare[YAFFS_CHUNKS_PER_BLOCK]; 72040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 72140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 72240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int bufferedBlock; /* Which block is buffered here? */ 72340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int doingBufferedBlockRewrite; 72440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 72540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_ChunkCache *srCache; 72640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int srLastUse; 72740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 72840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int cacheHits; 72940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 73040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* Stuff for background deletion and unlinked files.*/ 73140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *unlinkedDir; /* Directory where unlinked and deleted files live. */ 73240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *deletedDir; /* Directory where deleted objects are sent to disappear. */ 73340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object *unlinkedDeletion; /* Current file being background deleted.*/ 73440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDeletedFiles; /* Count of files awaiting deletion;*/ 73540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nUnlinkedFiles; /* Count of unlinked files. */ 73640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBackgroundDeletions; /* Count of background deletions. */ 73740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 73840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 73940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_TempBuffer tempBuffer[YAFFS_N_TEMP_BUFFERS]; 74040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int maxTemp; 74140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int unmanagedTempAllocations; 74240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int unmanagedTempDeallocations; 74340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 74440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* yaffs2 runtime stuff */ 74540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned sequenceNumber; /* Sequence number of currently allocating block */ 74640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned oldestDirtySequence; 74740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 74840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project}; 74940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 75040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct yaffs_DeviceStruct yaffs_Device; 75140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 75240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* The static layout of bllock usage etc is stored in the super block header */ 75340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 75440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int StructType; 75540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int version; 75640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointStartBlock; 75740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int checkpointEndBlock; 75840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int startBlock; 75940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int endBlock; 76040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int rfu[100]; 76140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_SuperBlockHeader; 76240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 76340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* The CheckpointDevice structure holds the device information that changes at runtime and 76440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project * must be preserved over unmount/mount cycles. 76540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project */ 76640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 76740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int structType; 76840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nErasedBlocks; 76940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int allocationBlock; /* Current block being allocated off */ 77040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 allocationPage; 77140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nFreeChunks; 77240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 77340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nDeletedFiles; /* Count of files awaiting deletion;*/ 77440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nUnlinkedFiles; /* Count of unlinked files. */ 77540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBackgroundDeletions; /* Count of background deletions. */ 77640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 77740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project /* yaffs2 runtime stuff */ 77840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned sequenceNumber; /* Sequence number of currently allocating block */ 77940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project unsigned oldestDirtySequence; 78040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 78140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_CheckpointDevice; 78240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 78340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 78440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projecttypedef struct { 78540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int structType; 78640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 magic; 78740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 version; 78840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 head; 78940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} yaffs_CheckpointValidity; 79040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 79140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Function to manipulate block info */ 79240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectstatic Y_INLINE yaffs_BlockInfo *yaffs_GetBlockInfo(yaffs_Device * dev, int blk) 79340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project{ 79440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project if (blk < dev->internalStartBlock || blk > dev->internalEndBlock) { 79540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project T(YAFFS_TRACE_ERROR, 79640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project (TSTR 79740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project ("**>> yaffs: getBlockInfo block %d is not valid" TENDSTR), 79840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project blk)); 79940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project YBUG(); 80040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project } 80140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project return &dev->blockInfo[blk - dev->internalStartBlock]; 80240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project} 80340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 80440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/*----------------------- YAFFS Functions -----------------------*/ 80540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 80640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GutsInitialise(yaffs_Device * dev); 80740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_Deinitialise(yaffs_Device * dev); 80840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 80940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetNumberOfFreeChunks(yaffs_Device * dev); 81040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 81140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_RenameObject(yaffs_Object * oldDir, const YCHAR * oldName, 81240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object * newDir, const YCHAR * newName); 81340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 81440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_Unlink(yaffs_Object * dir, const YCHAR * name); 81540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_DeleteFile(yaffs_Object * obj); 81640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 81740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetObjectName(yaffs_Object * obj, YCHAR * name, int buffSize); 81840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetObjectFileLength(yaffs_Object * obj); 81940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetObjectInode(yaffs_Object * obj); 82040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectunsigned yaffs_GetObjectType(yaffs_Object * obj); 82140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetObjectLinkCount(yaffs_Object * obj); 82240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 82340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_SetAttributes(yaffs_Object * obj, struct iattr *attr); 82440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_GetAttributes(yaffs_Object * obj, struct iattr *attr); 82540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 82640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* File operations */ 82740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_ReadDataFromFile(yaffs_Object * obj, __u8 * buffer, loff_t offset, 82840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBytes); 82940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_WriteDataToFile(yaffs_Object * obj, const __u8 * buffer, loff_t offset, 83040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int nBytes, int writeThrough); 83140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_ResizeFile(yaffs_Object * obj, loff_t newSize); 83240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 83340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_MknodFile(yaffs_Object * parent, const YCHAR * name, 83440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 mode, __u32 uid, __u32 gid); 83540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_FlushFile(yaffs_Object * obj, int updateTime); 83640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 83740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Flushing and checkpointing */ 83840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_FlushEntireDeviceCache(yaffs_Device *dev); 83940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 84040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_CheckpointSave(yaffs_Device *dev); 84140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_CheckpointRestore(yaffs_Device *dev); 84240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 84340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Directory operations */ 84440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_MknodDirectory(yaffs_Object * parent, const YCHAR * name, 84540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 mode, __u32 uid, __u32 gid); 84640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_FindObjectByName(yaffs_Object * theDir, const YCHAR * name); 84740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_ApplyToDirectoryChildren(yaffs_Object * theDir, 84840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project int (*fn) (yaffs_Object *)); 84940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 85040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_FindObjectByNumber(yaffs_Device * dev, __u32 number); 85140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 85240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Link operations */ 85340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_Link(yaffs_Object * parent, const YCHAR * name, 85440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project yaffs_Object * equivalentObject); 85540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 85640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_GetEquivalentObject(yaffs_Object * obj); 85740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 85840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Symlink operations */ 85940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_MknodSymLink(yaffs_Object * parent, const YCHAR * name, 86040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 mode, __u32 uid, __u32 gid, 86140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project const YCHAR * alias); 86240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source ProjectYCHAR *yaffs_GetSymlinkAlias(yaffs_Object * obj); 86340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 86440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Special inodes (fifos, sockets and devices) */ 86540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_MknodSpecial(yaffs_Object * parent, const YCHAR * name, 86640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project __u32 mode, __u32 uid, __u32 gid, __u32 rdev); 86740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 86840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Special directories */ 86940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_Root(yaffs_Device * dev); 87040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectyaffs_Object *yaffs_LostNFound(yaffs_Device * dev); 87140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 87240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef CONFIG_YAFFS_WINCE 87340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* CONFIG_YAFFS_WINCE special stuff */ 87440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yfsd_WinFileTimeNow(__u32 target[2]); 87540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 87640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 87740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#ifdef __KERNEL__ 87840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 87940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_HandleDeferedFree(yaffs_Object * obj); 88040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 88140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 88240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* Debug dump */ 88340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_DumpObject(yaffs_Object * obj); 88440c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 88540c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_GutsTest(yaffs_Device * dev); 88640c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 88740c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project/* A few useful functions */ 88840c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_InitialiseTags(yaffs_ExtendedTags * tags); 88940c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_DeleteChunk(yaffs_Device * dev, int chunkId, int markNAND, int lyn); 89040c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectint yaffs_CheckFF(__u8 * buffer, int nBytes); 89140c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Projectvoid yaffs_HandleChunkError(yaffs_Device *dev, yaffs_BlockInfo *bi); 89240c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project 89340c4004d07a37a9b140067f893930ce4436b9346The Android Open Source Project#endif 894