Dr Andrew Scott G7VAV

My photo
 
June 2025
Mo Tu We Th Fr Sa Su
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 1 2 3 4 5 6


jffs2.h
001: /*
002:  * JFFS2 -- Journalling Flash File System, Version 2.
003:  *
004:  * Copyright © 2001-2007 Red Hat, Inc.
005:  * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
006:  *
007:  * Created by David Woodhouse <dwmw2@infradead.org>
008:  *
009:  * For licensing information, see the file 'LICENCE' in the
010:  * jffs2 directory.
011:  */
012: 
013: #ifndef __LINUX_JFFS2_H__
014: #define __LINUX_JFFS2_H__
015: 
016: #include <linux/types.h>
017: #include <linux/magic.h>
018: 
019: /* You must include something which defines the C99 uintXX_t types. 
020:    We don't do it from here because this file is used in too many
021:    different environments. */
022: 
023: /* Values we may expect to find in the 'magic' field */
024: #define JFFS2_OLD_MAGIC_BITMASK 0x1984
025: #define JFFS2_MAGIC_BITMASK 0x1985
026: #define KSAMTIB_CIGAM_2SFFJ 0x8519 /* For detecting wrong-endian fs */
027: #define JFFS2_EMPTY_BITMASK 0xffff
028: #define JFFS2_DIRTY_BITMASK 0x0000
029: 
030: /* Summary node MAGIC marker */
031: #define JFFS2_SUM_MAGIC 0x02851885
032: 
033: /* We only allow a single char for length, and 0xFF is empty flash so
034:    we don't want it confused with a real length. Hence max 254.
035: */
036: #define JFFS2_MAX_NAME_LEN 254
037: 
038: /* How small can we sensibly write nodes? */
039: #define JFFS2_MIN_DATA_LEN 128
040: 
041: #define JFFS2_COMPR_NONE        0x00
042: #define JFFS2_COMPR_ZERO        0x01
043: #define JFFS2_COMPR_RTIME       0x02
044: #define JFFS2_COMPR_RUBINMIPS   0x03
045: #define JFFS2_COMPR_COPY        0x04
046: #define JFFS2_COMPR_DYNRUBIN    0x05
047: #define JFFS2_COMPR_ZLIB        0x06
048: #define JFFS2_COMPR_LZO         0x07
049: /* Compatibility flags. */
050: #define JFFS2_COMPAT_MASK 0xc000      /* What do to if an unknown nodetype is found */
051: #define JFFS2_NODE_ACCURATE 0x2000
052: /* INCOMPAT: Fail to mount the filesystem */
053: #define JFFS2_FEATURE_INCOMPAT 0xc000
054: /* ROCOMPAT: Mount read-only */
055: #define JFFS2_FEATURE_ROCOMPAT 0x8000
056: /* RWCOMPAT_COPY: Mount read/write, and copy the node when it's GC'd */
057: #define JFFS2_FEATURE_RWCOMPAT_COPY 0x4000
058: /* RWCOMPAT_DELETE: Mount read/write, and delete the node when it's GC'd */
059: #define JFFS2_FEATURE_RWCOMPAT_DELETE 0x0000
060: 
061: #define JFFS2_NODETYPE_DIRENT (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 1)
062: #define JFFS2_NODETYPE_INODE (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 2)
063: #define JFFS2_NODETYPE_CLEANMARKER (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3)
064: #define JFFS2_NODETYPE_PADDING (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 4)
065: 
066: #define JFFS2_NODETYPE_SUMMARY (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 6)
067: 
068: #define JFFS2_NODETYPE_XATTR (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 8)
069: #define JFFS2_NODETYPE_XREF (JFFS2_FEATURE_INCOMPAT | JFFS2_NODE_ACCURATE | 9)
070: 
071: /* XATTR Related */
072: #define JFFS2_XPREFIX_USER              1       /* for "user." */
073: #define JFFS2_XPREFIX_SECURITY          2       /* for "security." */
074: #define JFFS2_XPREFIX_ACL_ACCESS        3       /* for "system.posix_acl_access" */
075: #define JFFS2_XPREFIX_ACL_DEFAULT       4       /* for "system.posix_acl_default" */
076: #define JFFS2_XPREFIX_TRUSTED           5       /* for "trusted.*" */
077: 
078: #define JFFS2_ACL_VERSION               0x0001
079: 
080: // Maybe later...
081: //#define JFFS2_NODETYPE_CHECKPOINT (JFFS2_FEATURE_RWCOMPAT_DELETE | JFFS2_NODE_ACCURATE | 3)
082: //#define JFFS2_NODETYPE_OPTIONS (JFFS2_FEATURE_RWCOMPAT_COPY | JFFS2_NODE_ACCURATE | 4)
083: 
084: 
085: #define JFFS2_INO_FLAG_PREREAD    1     /* Do read_inode() for this one at
086:                                            mount time, don't wait for it to
087:                                            happen later */
088: #define JFFS2_INO_FLAG_USERCOMPR  2     /* User has requested a specific
089:                                            compression type */
090: 
091: 
092: /* These can go once we've made sure we've caught all uses without
093:    byteswapping */
094: 
095: typedef struct {
096:         __u32 v32;
097: } __attribute__((packed)) jint32_t;
098: 
099: typedef struct {
100:         __u32 m;
101: } __attribute__((packed)) jmode_t;
102: 
103: typedef struct {
104:         __u16 v16;
105: } __attribute__((packed)) jint16_t;
106: 
107: struct jffs2_unknown_node
108: {
109:         /* All start like this */
110:         jint16_t magic;
111:         jint16_t nodetype;
112:         jint32_t totlen; /* So we can skip over nodes we don't grok */
113:         jint32_t hdr_crc;
114: };
115: 
116: struct jffs2_raw_dirent
117: {
118:         jint16_t magic;
119:         jint16_t nodetype;      /* == JFFS2_NODETYPE_DIRENT */
120:         jint32_t totlen;
121:         jint32_t hdr_crc;
122:         jint32_t pino;
123:         jint32_t version;
124:         jint32_t ino; /* == zero for unlink */
125:         jint32_t mctime;
126:         __u8 nsize;
127:         __u8 type;
128:         __u8 unused[2];
129:         jint32_t node_crc;
130:         jint32_t name_crc;
131:         __u8 name[0];
132: };
133: 
134: /* The JFFS2 raw inode structure: Used for storage on physical media.  */
135: /* The uid, gid, atime, mtime and ctime members could be longer, but
136:    are left like this for space efficiency. If and when people decide
137:    they really need them extended, it's simple enough to add support for
138:    a new type of raw node.
139: */
140: struct jffs2_raw_inode
141: {
142:         jint16_t magic;      /* A constant magic number.  */
143:         jint16_t nodetype;   /* == JFFS2_NODETYPE_INODE */
144:         jint32_t totlen;     /* Total length of this node (inc data, etc.) */
145:         jint32_t hdr_crc;
146:         jint32_t ino;        /* Inode number.  */
147:         jint32_t version;    /* Version number.  */
148:         jmode_t mode;       /* The file's type or mode.  */
149:         jint16_t uid;        /* The file's owner.  */
150:         jint16_t gid;        /* The file's group.  */
151:         jint32_t isize;      /* Total resultant size of this inode (used for truncations)  */
152:         jint32_t atime;      /* Last access time.  */
153:         jint32_t mtime;      /* Last modification time.  */
154:         jint32_t ctime;      /* Change time.  */
155:         jint32_t offset;     /* Where to begin to write.  */
156:         jint32_t csize;      /* (Compressed) data size */
157:         jint32_t dsize;      /* Size of the node's data. (after decompression) */
158:         __u8 compr;       /* Compression algorithm used */
159:         __u8 usercompr;   /* Compression algorithm requested by the user */
160:         jint16_t flags;      /* See JFFS2_INO_FLAG_* */
161:         jint32_t data_crc;   /* CRC for the (compressed) data.  */
162:         jint32_t node_crc;   /* CRC for the raw inode (excluding data)  */
163:         __u8 data[0];
164: };
165: 
166: struct jffs2_raw_xattr {
167:         jint16_t magic;
168:         jint16_t nodetype;      /* = JFFS2_NODETYPE_XATTR */
169:         jint32_t totlen;
170:         jint32_t hdr_crc;
171:         jint32_t xid;           /* XATTR identifier number */
172:         jint32_t version;
173:         __u8 xprefix;
174:         __u8 name_len;
175:         jint16_t value_len;
176:         jint32_t data_crc;
177:         jint32_t node_crc;
178:         __u8 data[0];
179: } __attribute__((packed));
180: 
181: struct jffs2_raw_xref
182: {
183:         jint16_t magic;
184:         jint16_t nodetype;      /* = JFFS2_NODETYPE_XREF */
185:         jint32_t totlen;
186:         jint32_t hdr_crc;
187:         jint32_t ino;           /* inode number */
188:         jint32_t xid;           /* XATTR identifier number */
189:         jint32_t xseqno;        /* xref sequential number */
190:         jint32_t node_crc;
191: } __attribute__((packed));
192: 
193: struct jffs2_raw_summary
194: {
195:         jint16_t magic;
196:         jint16_t nodetype;      /* = JFFS2_NODETYPE_SUMMARY */
197:         jint32_t totlen;
198:         jint32_t hdr_crc;
199:         jint32_t sum_num;       /* number of sum entries*/
200:         jint32_t cln_mkr;       /* clean marker size, 0 = no cleanmarker */
201:         jint32_t padded;        /* sum of the size of padding nodes */
202:         jint32_t sum_crc;       /* summary information crc */
203:         jint32_t node_crc;      /* node crc */
204:         jint32_t sum[0];        /* inode summary info */
205: };
206: 
207: union jffs2_node_union
208: {
209:         struct jffs2_raw_inode i;
210:         struct jffs2_raw_dirent d;
211:         struct jffs2_raw_xattr x;
212:         struct jffs2_raw_xref r;
213:         struct jffs2_raw_summary s;
214:         struct jffs2_unknown_node u;
215: };
216: 
217: /* Data payload for device nodes. */
218: union jffs2_device_node {
219:         jint16_t old_id;
220:         jint32_t new_id;
221: };
222: 
223: #endif /* __LINUX_JFFS2_H__ */
224: 


for client (none)
© Andrew Scott 2006 - 2025,
All Rights Reserved
http://www.andrew-scott.uk/
Andrew Scott
http://www.andrew-scott.co.uk/