1*10465441SEvalZero /* 2*10465441SEvalZero * JFFS2 -- Journalling Flash File System, Version 2. 3*10465441SEvalZero * 4*10465441SEvalZero * Copyright (C) 2001-2003 Red Hat, Inc. 5*10465441SEvalZero * 6*10465441SEvalZero * Created by David Woodhouse <[email protected]> 7*10465441SEvalZero * 8*10465441SEvalZero * For licensing information, see the file 'LICENCE' in the 9*10465441SEvalZero * jffs2 directory. 10*10465441SEvalZero * 11*10465441SEvalZero * $Id: jffs2.h,v 1.36 2005/07/26 13:19:36 havasi Exp $ 12*10465441SEvalZero * 13*10465441SEvalZero */ 14*10465441SEvalZero 15*10465441SEvalZero #ifndef __LINUX_JFFS2_H__ 16*10465441SEvalZero #define __LINUX_JFFS2_H__ 17*10465441SEvalZero 18*10465441SEvalZero /* You must include something which defines the C99 uintXX_t types. 19*10465441SEvalZero We don't do it from here because this file is used in too many 20*10465441SEvalZero different environments. */ 21*10465441SEvalZero 22*10465441SEvalZero #define JFFS2_SUPER_MAGIC 0x72b6 23*10465441SEvalZero 24*10465441SEvalZero /* Values we may expect to find in the 'magic' field */ 25*10465441SEvalZero #define JFFS2_OLD_MAGIC_BITMASK 0x1984 26*10465441SEvalZero #define JFFS2_MAGIC_BITMASK 0x1985 27*10465441SEvalZero #define KSAMTIB_CIGAM_2SFFJ 0x8519 /* For detecting wrong-endian fs */ 28*10465441SEvalZero #define JFFS2_EMPTY_BITMASK 0xffff 29*10465441SEvalZero #define JFFS2_DIRTY_BITMASK 0x0000 30*10465441SEvalZero 31*10465441SEvalZero /* We only allow a single char for length, and 0xFF is empty flash so 32*10465441SEvalZero we don't want it confused with a real length. Hence max 254. 33*10465441SEvalZero */ 34*10465441SEvalZero #define JFFS2_MAX_NAME_LEN 254 35*10465441SEvalZero 36*10465441SEvalZero /* How small can we sensibly write nodes? */ 37*10465441SEvalZero #define JFFS2_MIN_DATA_LEN 128 38*10465441SEvalZero 39*10465441SEvalZero #define JFFS2_COMPR_NONE 0x00 40*10465441SEvalZero #define JFFS2_COMPR_ZERO 0x01 41*10465441SEvalZero #define JFFS2_COMPR_RTIME 0x02 42*10465441SEvalZero #define JFFS2_COMPR_RUBINMIPS 0x03 43*10465441SEvalZero #define JFFS2_COMPR_COPY 0x04 44*10465441SEvalZero #define JFFS2_COMPR_DYNRUBIN 0x05 45*10465441SEvalZero #define JFFS2_COMPR_ZLIB 0x06 46*10465441SEvalZero /* Compatibility flags. */ 47*10465441SEvalZero #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ 48*10465441SEvalZero #define JFFS2_NODE_ACCURATE 0x2000 49*10465441SEvalZero /* INCOMPAT: Fail to mount the filesystem */ 50*10465441SEvalZero #define JFFS2_FEATURE_INCOMPAT 0xc000 51*10465441SEvalZero /* ROCOMPAT: Mount read-only */ 52*10465441SEvalZero #define JFFS2_FEATURE_ROCOMPAT 0x8000 53*10465441SEvalZero /* RWCOMPAT_COPY: Mount read/write, and copy the node when it's GC'd */ 54*10465441SEvalZero #define JFFS2_FEATURE_RWCOMPAT_COPY 0x4000 55*10465441SEvalZero /* RWCOMPAT_DELETE: Mount read/write, and delete the node when it's GC'd */ 56*10465441SEvalZero #define JFFS2_FEATURE_RWCOMPAT_DELETE 0x0000 57*10465441SEvalZero 58*10465441SEvalZero #define JFFS2_NODETYPE_DIRENT (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 1) 59*10465441SEvalZero #define JFFS2_NODETYPE_INODE (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 2) 60*10465441SEvalZero #define JFFS2_NODETYPE_CLEANMARKER (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) 61*10465441SEvalZero #define JFFS2_NODETYPE_PADDING (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 4) 62*10465441SEvalZero 63*10465441SEvalZero // Maybe later... 64*10465441SEvalZero //#define JFFS2_NODETYPE_CHECKPOINT (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) 65*10465441SEvalZero //#define JFFS2_NODETYPE_OPTIONS (JFFS2_FEATURE_RWCOMPAT_COPY | JFFS2_NODE_ACCURATE | 4) 66*10465441SEvalZero 67*10465441SEvalZero 68*10465441SEvalZero #define JFFS2_INO_FLAG_PREREAD 1 /* Do read_inode() for this one at 69*10465441SEvalZero mount time, don't wait for it to 70*10465441SEvalZero happen later */ 71*10465441SEvalZero #define JFFS2_INO_FLAG_USERCOMPR 2 /* User has requested a specific 72*10465441SEvalZero compression type */ 73*10465441SEvalZero 74*10465441SEvalZero 75*10465441SEvalZero /* These can go once we've made sure we've caught all uses without 76*10465441SEvalZero byteswapping */ 77*10465441SEvalZero #include <stdint.h> 78*10465441SEvalZero 79*10465441SEvalZero #if defined(__GNUC__) || (__CC_ARM) 80*10465441SEvalZero typedef struct { 81*10465441SEvalZero uint32_t v32; 82*10465441SEvalZero } __attribute__((packed)) jint32_t; 83*10465441SEvalZero 84*10465441SEvalZero typedef struct { 85*10465441SEvalZero uint32_t m; 86*10465441SEvalZero } __attribute__((packed)) jmode_t; 87*10465441SEvalZero 88*10465441SEvalZero typedef struct { 89*10465441SEvalZero uint16_t v16; 90*10465441SEvalZero } __attribute__((packed)) jint16_t; 91*10465441SEvalZero 92*10465441SEvalZero struct jffs2_unknown_node 93*10465441SEvalZero { 94*10465441SEvalZero /* All start like this */ 95*10465441SEvalZero jint16_t magic; 96*10465441SEvalZero jint16_t nodetype; 97*10465441SEvalZero jint32_t totlen; /* So we can skip over nodes we don't grok */ 98*10465441SEvalZero jint32_t hdr_crc; 99*10465441SEvalZero } __attribute__((packed)); 100*10465441SEvalZero 101*10465441SEvalZero struct jffs2_raw_dirent 102*10465441SEvalZero { 103*10465441SEvalZero jint16_t magic; 104*10465441SEvalZero jint16_t nodetype; /* == JFFS2_NODETYPE_DIRENT */ 105*10465441SEvalZero jint32_t totlen; 106*10465441SEvalZero jint32_t hdr_crc; 107*10465441SEvalZero jint32_t pino; 108*10465441SEvalZero jint32_t version; 109*10465441SEvalZero jint32_t ino; /* == zero for unlink */ 110*10465441SEvalZero jint32_t mctime; 111*10465441SEvalZero uint8_t nsize; 112*10465441SEvalZero uint8_t type; 113*10465441SEvalZero uint8_t unused[2]; 114*10465441SEvalZero jint32_t node_crc; 115*10465441SEvalZero jint32_t name_crc; 116*10465441SEvalZero uint8_t name[0]; 117*10465441SEvalZero } __attribute__((packed)); 118*10465441SEvalZero 119*10465441SEvalZero /* The JFFS2 raw inode structure: Used for storage on physical media. */ 120*10465441SEvalZero /* The uid, gid, atime, mtime and ctime members could be longer, but 121*10465441SEvalZero are left like this for space efficiency. If and when people decide 122*10465441SEvalZero they really need them extended, it's simple enough to add support for 123*10465441SEvalZero a new type of raw node. 124*10465441SEvalZero */ 125*10465441SEvalZero struct jffs2_raw_inode 126*10465441SEvalZero { 127*10465441SEvalZero jint16_t magic; /* A constant magic number. */ 128*10465441SEvalZero jint16_t nodetype; /* == JFFS2_NODETYPE_INODE */ 129*10465441SEvalZero jint32_t totlen; /* Total length of this node (inc data, etc.) */ 130*10465441SEvalZero jint32_t hdr_crc; 131*10465441SEvalZero jint32_t ino; /* Inode number. */ 132*10465441SEvalZero jint32_t version; /* Version number. */ 133*10465441SEvalZero jmode_t mode; /* The file's type or mode. */ 134*10465441SEvalZero jint16_t uid; /* The file's owner. */ 135*10465441SEvalZero jint16_t gid; /* The file's group. */ 136*10465441SEvalZero jint32_t isize; /* Total resultant size of this inode (used for truncations) */ 137*10465441SEvalZero jint32_t atime; /* Last access time. */ 138*10465441SEvalZero jint32_t mtime; /* Last modification time. */ 139*10465441SEvalZero jint32_t ctime; /* Change time. */ 140*10465441SEvalZero jint32_t offset; /* Where to begin to write. */ 141*10465441SEvalZero jint32_t csize; /* (Compressed) data size */ 142*10465441SEvalZero jint32_t dsize; /* Size of the node's data. (after decompression) */ 143*10465441SEvalZero uint8_t compr; /* Compression algorithm used */ 144*10465441SEvalZero uint8_t usercompr; /* Compression algorithm requested by the user */ 145*10465441SEvalZero jint16_t flags; /* See JFFS2_INO_FLAG_* */ 146*10465441SEvalZero jint32_t data_crc; /* CRC for the (compressed) data. */ 147*10465441SEvalZero jint32_t node_crc; /* CRC for the raw inode (excluding data) */ 148*10465441SEvalZero uint8_t data[0]; 149*10465441SEvalZero } __attribute__((packed)); 150*10465441SEvalZero 151*10465441SEvalZero #elif defined (MSVC) 152*10465441SEvalZero typedef uint32_t jint32_t; 153*10465441SEvalZero //typedef uint32_t jmode_t; 154*10465441SEvalZero typedef struct { 155*10465441SEvalZero uint32_t m; 156*10465441SEvalZero } jmode_t; 157*10465441SEvalZero typedef uint16_t jint16_t; 158*10465441SEvalZero 159*10465441SEvalZero #pragma pack(1) 160*10465441SEvalZero struct jffs2_unknown_node 161*10465441SEvalZero { 162*10465441SEvalZero /* All start like this */ 163*10465441SEvalZero jint16_t magic; 164*10465441SEvalZero jint16_t nodetype; 165*10465441SEvalZero jint32_t totlen; /* So we can skip over nodes we don't grok */ 166*10465441SEvalZero jint32_t hdr_crc; 167*10465441SEvalZero }; 168*10465441SEvalZero 169*10465441SEvalZero struct jffs2_raw_dirent 170*10465441SEvalZero { 171*10465441SEvalZero jint16_t magic; 172*10465441SEvalZero jint16_t nodetype; /* == JFFS2_NODETYPE_DIRENT */ 173*10465441SEvalZero jint32_t totlen; 174*10465441SEvalZero jint32_t hdr_crc; 175*10465441SEvalZero jint32_t pino; 176*10465441SEvalZero jint32_t version; 177*10465441SEvalZero jint32_t ino; /* == zero for unlink */ 178*10465441SEvalZero jint32_t mctime; 179*10465441SEvalZero uint8_t nsize; 180*10465441SEvalZero uint8_t type; 181*10465441SEvalZero uint8_t unused[2]; 182*10465441SEvalZero jint32_t node_crc; 183*10465441SEvalZero jint32_t name_crc; 184*10465441SEvalZero uint8_t name[0]; 185*10465441SEvalZero }; 186*10465441SEvalZero 187*10465441SEvalZero /* The JFFS2 raw inode structure: Used for storage on physical media. */ 188*10465441SEvalZero /* The uid, gid, atime, mtime and ctime members could be longer, but 189*10465441SEvalZero are left like this for space efficiency. If and when people decide 190*10465441SEvalZero they really need them extended, it's simple enough to add support for 191*10465441SEvalZero a new type of raw node. 192*10465441SEvalZero */ 193*10465441SEvalZero struct jffs2_raw_inode 194*10465441SEvalZero { 195*10465441SEvalZero jint16_t magic; /* A constant magic number. */ 196*10465441SEvalZero jint16_t nodetype; /* == JFFS2_NODETYPE_INODE */ 197*10465441SEvalZero jint32_t totlen; /* Total length of this node (inc data, etc.) */ 198*10465441SEvalZero jint32_t hdr_crc; 199*10465441SEvalZero jint32_t ino; /* Inode number. */ 200*10465441SEvalZero jint32_t version; /* Version number. */ 201*10465441SEvalZero jmode_t mode; /* The file's type or mode. */ 202*10465441SEvalZero jint16_t uid; /* The file's owner. */ 203*10465441SEvalZero jint16_t gid; /* The file's group. */ 204*10465441SEvalZero jint32_t isize; /* Total resultant size of this inode (used for truncations) */ 205*10465441SEvalZero jint32_t atime; /* Last access time. */ 206*10465441SEvalZero jint32_t mtime; /* Last modification time. */ 207*10465441SEvalZero jint32_t ctime; /* Change time. */ 208*10465441SEvalZero jint32_t offset; /* Where to begin to write. */ 209*10465441SEvalZero jint32_t csize; /* (Compressed) data size */ 210*10465441SEvalZero jint32_t dsize; /* Size of the node's data. (after decompression) */ 211*10465441SEvalZero uint8_t compr; /* Compression algorithm used */ 212*10465441SEvalZero uint8_t usercompr; /* Compression algorithm requested by the user */ 213*10465441SEvalZero jint16_t flags; /* See JFFS2_INO_FLAG_* */ 214*10465441SEvalZero jint32_t data_crc; /* CRC for the (compressed) data. */ 215*10465441SEvalZero jint32_t node_crc; /* CRC for the raw inode (excluding data) */ 216*10465441SEvalZero uint8_t data[0]; 217*10465441SEvalZero }; 218*10465441SEvalZero #pragma pack() 219*10465441SEvalZero #else 220*10465441SEvalZero #endif 221*10465441SEvalZero 222*10465441SEvalZero 223*10465441SEvalZero union jffs2_node_union { 224*10465441SEvalZero struct jffs2_raw_inode i; 225*10465441SEvalZero struct jffs2_raw_dirent d; 226*10465441SEvalZero struct jffs2_unknown_node u; 227*10465441SEvalZero }; 228*10465441SEvalZero 229*10465441SEvalZero #endif /* __LINUX_JFFS2_H__ */ 230