xref: /openbmc/u-boot/fs/jffs2/summary.h (revision be4880ebe4355e8782be4af4b337a1b98dffcbe3)
1*9b707622SIlya Yanok /*
2*9b707622SIlya Yanok  * JFFS2 -- Journalling Flash File System, Version 2.
3*9b707622SIlya Yanok  *
4*9b707622SIlya Yanok  * Copyright © 2004  Ferenc Havasi <havasi@inf.u-szeged.hu>,
5*9b707622SIlya Yanok  *		     Zoltan Sogor <weth@inf.u-szeged.hu>,
6*9b707622SIlya Yanok  *		     Patrik Kluba <pajko@halom.u-szeged.hu>,
7*9b707622SIlya Yanok  *		     University of Szeged, Hungary
8*9b707622SIlya Yanok  *
9*9b707622SIlya Yanok  * For licensing information, see the file 'LICENCE' in this directory.
10*9b707622SIlya Yanok  *
11*9b707622SIlya Yanok  */
12*9b707622SIlya Yanok 
13*9b707622SIlya Yanok #ifndef JFFS2_SUMMARY_H
14*9b707622SIlya Yanok #define JFFS2_SUMMARY_H
15*9b707622SIlya Yanok 
16*9b707622SIlya Yanok #define BLK_STATE_ALLFF		0
17*9b707622SIlya Yanok #define BLK_STATE_CLEAN		1
18*9b707622SIlya Yanok #define BLK_STATE_PARTDIRTY	2
19*9b707622SIlya Yanok #define BLK_STATE_CLEANMARKER	3
20*9b707622SIlya Yanok #define BLK_STATE_ALLDIRTY	4
21*9b707622SIlya Yanok #define BLK_STATE_BADBLOCK	5
22*9b707622SIlya Yanok 
23*9b707622SIlya Yanok #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff
24*9b707622SIlya Yanok #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash))
25*9b707622SIlya Yanok #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x))
26*9b707622SIlya Yanok #define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash))
27*9b707622SIlya Yanok #define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash))
28*9b707622SIlya Yanok 
29*9b707622SIlya Yanok /* Summary structures used on flash */
30*9b707622SIlya Yanok 
31*9b707622SIlya Yanok struct jffs2_sum_unknown_flash
32*9b707622SIlya Yanok {
33*9b707622SIlya Yanok 	__u16 nodetype;	/* node type */
34*9b707622SIlya Yanok };
35*9b707622SIlya Yanok 
36*9b707622SIlya Yanok struct jffs2_sum_inode_flash
37*9b707622SIlya Yanok {
38*9b707622SIlya Yanok 	__u16 nodetype;	/* node type */
39*9b707622SIlya Yanok 	__u32 inode;		/* inode number */
40*9b707622SIlya Yanok 	__u32 version;	/* inode version */
41*9b707622SIlya Yanok 	__u32 offset;	/* offset on jeb */
42*9b707622SIlya Yanok 	__u32 totlen; 	/* record length */
43*9b707622SIlya Yanok } __attribute__((packed));
44*9b707622SIlya Yanok 
45*9b707622SIlya Yanok struct jffs2_sum_dirent_flash
46*9b707622SIlya Yanok {
47*9b707622SIlya Yanok 	__u16 nodetype;	/* == JFFS_NODETYPE_DIRENT */
48*9b707622SIlya Yanok 	__u32 totlen;	/* record length */
49*9b707622SIlya Yanok 	__u32 offset;	/* offset on jeb */
50*9b707622SIlya Yanok 	__u32 pino;		/* parent inode */
51*9b707622SIlya Yanok 	__u32 version;	/* dirent version */
52*9b707622SIlya Yanok 	__u32 ino; 		/* == zero for unlink */
53*9b707622SIlya Yanok 	uint8_t nsize;		/* dirent name size */
54*9b707622SIlya Yanok 	uint8_t type;		/* dirent type */
55*9b707622SIlya Yanok 	uint8_t name[0];	/* dirent name */
56*9b707622SIlya Yanok } __attribute__((packed));
57*9b707622SIlya Yanok 
58*9b707622SIlya Yanok struct jffs2_sum_xattr_flash
59*9b707622SIlya Yanok {
60*9b707622SIlya Yanok 	__u16 nodetype;	/* == JFFS2_NODETYPE_XATR */
61*9b707622SIlya Yanok 	__u32 xid;		/* xattr identifier */
62*9b707622SIlya Yanok 	__u32 version;	/* version number */
63*9b707622SIlya Yanok 	__u32 offset;	/* offset on jeb */
64*9b707622SIlya Yanok 	__u32 totlen;	/* node length */
65*9b707622SIlya Yanok } __attribute__((packed));
66*9b707622SIlya Yanok 
67*9b707622SIlya Yanok struct jffs2_sum_xref_flash
68*9b707622SIlya Yanok {
69*9b707622SIlya Yanok 	__u16 nodetype;	/* == JFFS2_NODETYPE_XREF */
70*9b707622SIlya Yanok 	__u32 offset;	/* offset on jeb */
71*9b707622SIlya Yanok } __attribute__((packed));
72*9b707622SIlya Yanok 
73*9b707622SIlya Yanok union jffs2_sum_flash
74*9b707622SIlya Yanok {
75*9b707622SIlya Yanok 	struct jffs2_sum_unknown_flash u;
76*9b707622SIlya Yanok 	struct jffs2_sum_inode_flash i;
77*9b707622SIlya Yanok 	struct jffs2_sum_dirent_flash d;
78*9b707622SIlya Yanok 	struct jffs2_sum_xattr_flash x;
79*9b707622SIlya Yanok 	struct jffs2_sum_xref_flash r;
80*9b707622SIlya Yanok };
81*9b707622SIlya Yanok 
82*9b707622SIlya Yanok /* Summary structures used in the memory */
83*9b707622SIlya Yanok 
84*9b707622SIlya Yanok struct jffs2_sum_unknown_mem
85*9b707622SIlya Yanok {
86*9b707622SIlya Yanok 	union jffs2_sum_mem *next;
87*9b707622SIlya Yanok 	__u16 nodetype;	/* node type */
88*9b707622SIlya Yanok };
89*9b707622SIlya Yanok 
90*9b707622SIlya Yanok struct jffs2_sum_inode_mem
91*9b707622SIlya Yanok {
92*9b707622SIlya Yanok 	union jffs2_sum_mem *next;
93*9b707622SIlya Yanok 	__u16 nodetype;	/* node type */
94*9b707622SIlya Yanok 	__u32 inode;		/* inode number */
95*9b707622SIlya Yanok 	__u32 version;	/* inode version */
96*9b707622SIlya Yanok 	__u32 offset;	/* offset on jeb */
97*9b707622SIlya Yanok 	__u32 totlen; 	/* record length */
98*9b707622SIlya Yanok } __attribute__((packed));
99*9b707622SIlya Yanok 
100*9b707622SIlya Yanok struct jffs2_sum_dirent_mem
101*9b707622SIlya Yanok {
102*9b707622SIlya Yanok 	union jffs2_sum_mem *next;
103*9b707622SIlya Yanok 	__u16 nodetype;	/* == JFFS_NODETYPE_DIRENT */
104*9b707622SIlya Yanok 	__u32 totlen;	/* record length */
105*9b707622SIlya Yanok 	__u32 offset;	/* ofset on jeb */
106*9b707622SIlya Yanok 	__u32 pino;		/* parent inode */
107*9b707622SIlya Yanok 	__u32 version;	/* dirent version */
108*9b707622SIlya Yanok 	__u32 ino; 		/* == zero for unlink */
109*9b707622SIlya Yanok 	uint8_t nsize;		/* dirent name size */
110*9b707622SIlya Yanok 	uint8_t type;		/* dirent type */
111*9b707622SIlya Yanok 	uint8_t name[0];	/* dirent name */
112*9b707622SIlya Yanok } __attribute__((packed));
113*9b707622SIlya Yanok 
114*9b707622SIlya Yanok struct jffs2_sum_xattr_mem
115*9b707622SIlya Yanok {
116*9b707622SIlya Yanok 	union jffs2_sum_mem *next;
117*9b707622SIlya Yanok 	__u16 nodetype;
118*9b707622SIlya Yanok 	__u32 xid;
119*9b707622SIlya Yanok 	__u32 version;
120*9b707622SIlya Yanok 	__u32 offset;
121*9b707622SIlya Yanok 	__u32 totlen;
122*9b707622SIlya Yanok } __attribute__((packed));
123*9b707622SIlya Yanok 
124*9b707622SIlya Yanok struct jffs2_sum_xref_mem
125*9b707622SIlya Yanok {
126*9b707622SIlya Yanok 	union jffs2_sum_mem *next;
127*9b707622SIlya Yanok 	__u16 nodetype;
128*9b707622SIlya Yanok 	__u32 offset;
129*9b707622SIlya Yanok } __attribute__((packed));
130*9b707622SIlya Yanok 
131*9b707622SIlya Yanok union jffs2_sum_mem
132*9b707622SIlya Yanok {
133*9b707622SIlya Yanok 	struct jffs2_sum_unknown_mem u;
134*9b707622SIlya Yanok 	struct jffs2_sum_inode_mem i;
135*9b707622SIlya Yanok 	struct jffs2_sum_dirent_mem d;
136*9b707622SIlya Yanok 	struct jffs2_sum_xattr_mem x;
137*9b707622SIlya Yanok 	struct jffs2_sum_xref_mem r;
138*9b707622SIlya Yanok };
139*9b707622SIlya Yanok 
140*9b707622SIlya Yanok /* Summary related information stored in superblock */
141*9b707622SIlya Yanok 
142*9b707622SIlya Yanok struct jffs2_summary
143*9b707622SIlya Yanok {
144*9b707622SIlya Yanok 	uint32_t sum_size;      /* collected summary information for nextblock */
145*9b707622SIlya Yanok 	uint32_t sum_num;
146*9b707622SIlya Yanok 	uint32_t sum_padded;
147*9b707622SIlya Yanok 	union jffs2_sum_mem *sum_list_head;
148*9b707622SIlya Yanok 	union jffs2_sum_mem *sum_list_tail;
149*9b707622SIlya Yanok 
150*9b707622SIlya Yanok 	__u32 *sum_buf;	/* buffer for writing out summary */
151*9b707622SIlya Yanok };
152*9b707622SIlya Yanok 
153*9b707622SIlya Yanok /* Summary marker is stored at the end of every sumarized erase block */
154*9b707622SIlya Yanok 
155*9b707622SIlya Yanok struct jffs2_sum_marker
156*9b707622SIlya Yanok {
157*9b707622SIlya Yanok 	__u32 offset;	/* offset of the summary node in the jeb */
158*9b707622SIlya Yanok 	__u32 magic; 	/* == JFFS2_SUM_MAGIC */
159*9b707622SIlya Yanok };
160*9b707622SIlya Yanok 
161*9b707622SIlya Yanok #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker))
162*9b707622SIlya Yanok 
163*9b707622SIlya Yanok #endif /* JFFS2_SUMMARY_H */
164