1*fe8c2806Swdenk /* 2*fe8c2806Swdenk * JFFS2 -- Journalling Flash File System, Version 2. 3*fe8c2806Swdenk * 4*fe8c2806Swdenk * Copyright (C) 2001 Red Hat, Inc. 5*fe8c2806Swdenk * 6*fe8c2806Swdenk * Created by David Woodhouse <dwmw2@cambridge.redhat.com> 7*fe8c2806Swdenk * 8*fe8c2806Swdenk * The original JFFS, from which the design for JFFS2 was derived, 9*fe8c2806Swdenk * was designed and implemented by Axis Communications AB. 10*fe8c2806Swdenk * 11*fe8c2806Swdenk * The contents of this file are subject to the Red Hat eCos Public 12*fe8c2806Swdenk * License Version 1.1 (the "Licence"); you may not use this file 13*fe8c2806Swdenk * except in compliance with the Licence. You may obtain a copy of 14*fe8c2806Swdenk * the Licence at http://www.redhat.com/ 15*fe8c2806Swdenk * 16*fe8c2806Swdenk * Software distributed under the Licence is distributed on an "AS IS" 17*fe8c2806Swdenk * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. 18*fe8c2806Swdenk * See the Licence for the specific language governing rights and 19*fe8c2806Swdenk * limitations under the Licence. 20*fe8c2806Swdenk * 21*fe8c2806Swdenk * The Original Code is JFFS2 - Journalling Flash File System, version 2 22*fe8c2806Swdenk * 23*fe8c2806Swdenk * Alternatively, the contents of this file may be used under the 24*fe8c2806Swdenk * terms of the GNU General Public License version 2 (the "GPL"), in 25*fe8c2806Swdenk * which case the provisions of the GPL are applicable instead of the 26*fe8c2806Swdenk * above. If you wish to allow the use of your version of this file 27*fe8c2806Swdenk * only under the terms of the GPL and not to allow others to use your 28*fe8c2806Swdenk * version of this file under the RHEPL, indicate your decision by 29*fe8c2806Swdenk * deleting the provisions above and replace them with the notice and 30*fe8c2806Swdenk * other provisions required by the GPL. If you do not delete the 31*fe8c2806Swdenk * provisions above, a recipient may use your version of this file 32*fe8c2806Swdenk * under either the RHEPL or the GPL. 33*fe8c2806Swdenk * 34*fe8c2806Swdenk * $Id: jffs2.h,v 1.2 2002/01/17 00:53:20 nyet Exp $ 35*fe8c2806Swdenk * 36*fe8c2806Swdenk */ 37*fe8c2806Swdenk 38*fe8c2806Swdenk #ifndef __LINUX_JFFS2_H__ 39*fe8c2806Swdenk #define __LINUX_JFFS2_H__ 40*fe8c2806Swdenk 41*fe8c2806Swdenk #include <asm/types.h> 42*fe8c2806Swdenk #include <jffs2/load_kernel.h> 43*fe8c2806Swdenk 44*fe8c2806Swdenk #define JFFS2_SUPER_MAGIC 0x72b6 45*fe8c2806Swdenk 46*fe8c2806Swdenk /* Values we may expect to find in the 'magic' field */ 47*fe8c2806Swdenk #define JFFS2_OLD_MAGIC_BITMASK 0x1984 48*fe8c2806Swdenk #define JFFS2_MAGIC_BITMASK 0x1985 49*fe8c2806Swdenk #define KSAMTIB_CIGAM_2SFFJ 0x5981 /* For detecting wrong-endian fs */ 50*fe8c2806Swdenk #define JFFS2_EMPTY_BITMASK 0xffff 51*fe8c2806Swdenk #define JFFS2_DIRTY_BITMASK 0x0000 52*fe8c2806Swdenk 53*fe8c2806Swdenk /* We only allow a single char for length, and 0xFF is empty flash so 54*fe8c2806Swdenk we don't want it confused with a real length. Hence max 254. 55*fe8c2806Swdenk */ 56*fe8c2806Swdenk #define JFFS2_MAX_NAME_LEN 254 57*fe8c2806Swdenk 58*fe8c2806Swdenk /* How small can we sensibly write nodes? */ 59*fe8c2806Swdenk #define JFFS2_MIN_DATA_LEN 128 60*fe8c2806Swdenk 61*fe8c2806Swdenk #define JFFS2_COMPR_NONE 0x00 62*fe8c2806Swdenk #define JFFS2_COMPR_ZERO 0x01 63*fe8c2806Swdenk #define JFFS2_COMPR_RTIME 0x02 64*fe8c2806Swdenk #define JFFS2_COMPR_RUBINMIPS 0x03 65*fe8c2806Swdenk #define JFFS2_COMPR_COPY 0x04 66*fe8c2806Swdenk #define JFFS2_COMPR_DYNRUBIN 0x05 67*fe8c2806Swdenk #define JFFS2_COMPR_ZLIB 0x06 68*fe8c2806Swdenk #define JFFS2_NUM_COMPR 7 69*fe8c2806Swdenk 70*fe8c2806Swdenk /* Compatibility flags. */ 71*fe8c2806Swdenk #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */ 72*fe8c2806Swdenk #define JFFS2_NODE_ACCURATE 0x2000 73*fe8c2806Swdenk /* INCOMPAT: Fail to mount the filesystem */ 74*fe8c2806Swdenk #define JFFS2_FEATURE_INCOMPAT 0xc000 75*fe8c2806Swdenk /* ROCOMPAT: Mount read-only */ 76*fe8c2806Swdenk #define JFFS2_FEATURE_ROCOMPAT 0x8000 77*fe8c2806Swdenk /* RWCOMPAT_COPY: Mount read/write, and copy the node when it's GC'd */ 78*fe8c2806Swdenk #define JFFS2_FEATURE_RWCOMPAT_COPY 0x4000 79*fe8c2806Swdenk /* RWCOMPAT_DELETE: Mount read/write, and delete the node when it's GC'd */ 80*fe8c2806Swdenk #define JFFS2_FEATURE_RWCOMPAT_DELETE 0x0000 81*fe8c2806Swdenk 82*fe8c2806Swdenk #define JFFS2_NODETYPE_DIRENT (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 1) 83*fe8c2806Swdenk #define JFFS2_NODETYPE_INODE (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 2) 84*fe8c2806Swdenk #define JFFS2_NODETYPE_CLEANMARKER (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) 85*fe8c2806Swdenk 86*fe8c2806Swdenk /* Maybe later... */ 87*fe8c2806Swdenk /*#define JFFS2_NODETYPE_CHECKPOINT (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3) */ 88*fe8c2806Swdenk /*#define JFFS2_NODETYPE_OPTIONS (JFFS2_FEATURE_RWCOMPAT_COPY | JFFS2_NODE_ACCURATE | 4) */ 89*fe8c2806Swdenk 90*fe8c2806Swdenk /* Same as the non_ECC versions, but with extra space for real 91*fe8c2806Swdenk * ECC instead of just the checksum. For use on NAND flash 92*fe8c2806Swdenk */ 93*fe8c2806Swdenk /*#define JFFS2_NODETYPE_DIRENT_ECC (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 5) */ 94*fe8c2806Swdenk /*#define JFFS2_NODETYPE_INODE_ECC (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 6) */ 95*fe8c2806Swdenk 96*fe8c2806Swdenk #define JFFS2_INO_FLAG_PREREAD 1 /* Do read_inode() for this one at 97*fe8c2806Swdenk mount time, don't wait for it to 98*fe8c2806Swdenk happen later */ 99*fe8c2806Swdenk #define JFFS2_INO_FLAG_USERCOMPR 2 /* User has requested a specific 100*fe8c2806Swdenk compression type */ 101*fe8c2806Swdenk 102*fe8c2806Swdenk 103*fe8c2806Swdenk struct jffs2_unknown_node 104*fe8c2806Swdenk { 105*fe8c2806Swdenk /* All start like this */ 106*fe8c2806Swdenk __u16 magic; 107*fe8c2806Swdenk __u16 nodetype; 108*fe8c2806Swdenk __u32 totlen; /* So we can skip over nodes we don't grok */ 109*fe8c2806Swdenk __u32 hdr_crc; 110*fe8c2806Swdenk } __attribute__((packed)); 111*fe8c2806Swdenk 112*fe8c2806Swdenk struct jffs2_raw_dirent 113*fe8c2806Swdenk { 114*fe8c2806Swdenk __u16 magic; 115*fe8c2806Swdenk __u16 nodetype; /* == JFFS_NODETYPE_DIRENT */ 116*fe8c2806Swdenk __u32 totlen; 117*fe8c2806Swdenk __u32 hdr_crc; 118*fe8c2806Swdenk __u32 pino; 119*fe8c2806Swdenk __u32 version; 120*fe8c2806Swdenk __u32 ino; /* == zero for unlink */ 121*fe8c2806Swdenk __u32 mctime; 122*fe8c2806Swdenk __u8 nsize; 123*fe8c2806Swdenk __u8 type; 124*fe8c2806Swdenk __u8 unused[2]; 125*fe8c2806Swdenk __u32 node_crc; 126*fe8c2806Swdenk __u32 name_crc; 127*fe8c2806Swdenk __u8 name[0]; 128*fe8c2806Swdenk } __attribute__((packed)); 129*fe8c2806Swdenk 130*fe8c2806Swdenk /* The JFFS2 raw inode structure: Used for storage on physical media. */ 131*fe8c2806Swdenk /* The uid, gid, atime, mtime and ctime members could be longer, but 132*fe8c2806Swdenk are left like this for space efficiency. If and when people decide 133*fe8c2806Swdenk they really need them extended, it's simple enough to add support for 134*fe8c2806Swdenk a new type of raw node. 135*fe8c2806Swdenk */ 136*fe8c2806Swdenk struct jffs2_raw_inode 137*fe8c2806Swdenk { 138*fe8c2806Swdenk __u16 magic; /* A constant magic number. */ 139*fe8c2806Swdenk __u16 nodetype; /* == JFFS_NODETYPE_INODE */ 140*fe8c2806Swdenk __u32 totlen; /* Total length of this node (inc data, etc.) */ 141*fe8c2806Swdenk __u32 hdr_crc; 142*fe8c2806Swdenk __u32 ino; /* Inode number. */ 143*fe8c2806Swdenk __u32 version; /* Version number. */ 144*fe8c2806Swdenk __u32 mode; /* The file's type or mode. */ 145*fe8c2806Swdenk __u16 uid; /* The file's owner. */ 146*fe8c2806Swdenk __u16 gid; /* The file's group. */ 147*fe8c2806Swdenk __u32 isize; /* Total resultant size of this inode (used for truncations) */ 148*fe8c2806Swdenk __u32 atime; /* Last access time. */ 149*fe8c2806Swdenk __u32 mtime; /* Last modification time. */ 150*fe8c2806Swdenk __u32 ctime; /* Change time. */ 151*fe8c2806Swdenk __u32 offset; /* Where to begin to write. */ 152*fe8c2806Swdenk __u32 csize; /* (Compressed) data size */ 153*fe8c2806Swdenk __u32 dsize; /* Size of the node's data. (after decompression) */ 154*fe8c2806Swdenk __u8 compr; /* Compression algorithm used */ 155*fe8c2806Swdenk __u8 usercompr; /* Compression algorithm requested by the user */ 156*fe8c2806Swdenk __u16 flags; /* See JFFS2_INO_FLAG_* */ 157*fe8c2806Swdenk __u32 data_crc; /* CRC for the (compressed) data. */ 158*fe8c2806Swdenk __u32 node_crc; /* CRC for the raw inode (excluding data) */ 159*fe8c2806Swdenk /* __u8 data[dsize]; */ 160*fe8c2806Swdenk } __attribute__((packed)); 161*fe8c2806Swdenk 162*fe8c2806Swdenk union jffs2_node_union { 163*fe8c2806Swdenk struct jffs2_raw_inode i; 164*fe8c2806Swdenk struct jffs2_raw_dirent d; 165*fe8c2806Swdenk struct jffs2_unknown_node u; 166*fe8c2806Swdenk } __attribute__((packed)); 167*fe8c2806Swdenk 168*fe8c2806Swdenk enum 169*fe8c2806Swdenk { 170*fe8c2806Swdenk DT_UNKNOWN = 0, 171*fe8c2806Swdenk # define DT_UNKNOWN DT_UNKNOWN 172*fe8c2806Swdenk DT_FIFO = 1, 173*fe8c2806Swdenk # define DT_FIFO DT_FIFO 174*fe8c2806Swdenk DT_CHR = 2, 175*fe8c2806Swdenk # define DT_CHR DT_CHR 176*fe8c2806Swdenk DT_DIR = 4, 177*fe8c2806Swdenk # define DT_DIR DT_DIR 178*fe8c2806Swdenk DT_BLK = 6, 179*fe8c2806Swdenk # define DT_BLK DT_BLK 180*fe8c2806Swdenk DT_REG = 8, 181*fe8c2806Swdenk # define DT_REG DT_REG 182*fe8c2806Swdenk DT_LNK = 10, 183*fe8c2806Swdenk # define DT_LNK DT_LNK 184*fe8c2806Swdenk DT_SOCK = 12, 185*fe8c2806Swdenk # define DT_SOCK DT_SOCK 186*fe8c2806Swdenk DT_WHT = 14 187*fe8c2806Swdenk # define DT_WHT DT_WHT 188*fe8c2806Swdenk }; 189*fe8c2806Swdenk 190*fe8c2806Swdenk 191*fe8c2806Swdenk u32 jffs2_1pass_ls(struct part_info *part,const char *fname); 192*fe8c2806Swdenk u32 jffs2_1pass_load(char *dest, struct part_info *part,const char *fname); 193*fe8c2806Swdenk u32 jffs2_1pass_info(struct part_info *part); 194*fe8c2806Swdenk 195*fe8c2806Swdenk void rtime_decompress(unsigned char *data_in, unsigned char *cpage_out, u32 196*fe8c2806Swdenk srclen, u32 destlen); 197*fe8c2806Swdenk void rubin_do_decompress(unsigned char *bits, unsigned char *in, unsigned char 198*fe8c2806Swdenk *page_out, __u32 destlen); 199*fe8c2806Swdenk void dynrubin_decompress(unsigned char *data_in, unsigned char *cpage_out, 200*fe8c2806Swdenk unsigned long sourcelen, unsigned long dstlen); 201*fe8c2806Swdenk long zlib_decompress(unsigned char *data_in, unsigned char *cpage_out, 202*fe8c2806Swdenk __u32 srclen, __u32 destlen); 203*fe8c2806Swdenk 204*fe8c2806Swdenk 205*fe8c2806Swdenk 206*fe8c2806Swdenk 207*fe8c2806Swdenk 208*fe8c2806Swdenk #endif /* __LINUX_JFFS2_H__ */ 209