xref: /openbmc/linux/fs/jffs2/summary.h (revision c00c310e)
1e631ddbaSFerenc Havasi /*
2e631ddbaSFerenc Havasi  * JFFS2 -- Journalling Flash File System, Version 2.
3e631ddbaSFerenc Havasi  *
4c00c310eSDavid Woodhouse  * Copyright © 2004  Ferenc Havasi <havasi@inf.u-szeged.hu>,
5e631ddbaSFerenc Havasi  *                   Zoltan Sogor <weth@inf.u-szeged.hu>,
6e631ddbaSFerenc Havasi  *                   Patrik Kluba <pajko@halom.u-szeged.hu>,
7e631ddbaSFerenc Havasi  *                   University of Szeged, Hungary
8e631ddbaSFerenc Havasi  *
9e631ddbaSFerenc Havasi  * For licensing information, see the file 'LICENCE' in this directory.
10e631ddbaSFerenc Havasi  *
11e631ddbaSFerenc Havasi  */
12e631ddbaSFerenc Havasi 
13e631ddbaSFerenc Havasi #ifndef JFFS2_SUMMARY_H
14e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_H
15e631ddbaSFerenc Havasi 
16e631ddbaSFerenc Havasi #include <linux/uio.h>
17e631ddbaSFerenc Havasi #include <linux/jffs2.h>
18e631ddbaSFerenc Havasi 
19e631ddbaSFerenc Havasi #define BLK_STATE_ALLFF		0
20e631ddbaSFerenc Havasi #define BLK_STATE_CLEAN		1
21e631ddbaSFerenc Havasi #define BLK_STATE_PARTDIRTY	2
22e631ddbaSFerenc Havasi #define BLK_STATE_CLEANMARKER	3
23e631ddbaSFerenc Havasi #define BLK_STATE_ALLDIRTY	4
24e631ddbaSFerenc Havasi #define BLK_STATE_BADBLOCK	5
25e631ddbaSFerenc Havasi 
26e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff
27e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash))
28e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x))
29aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash))
30aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash))
31e631ddbaSFerenc Havasi 
32e631ddbaSFerenc Havasi /* Summary structures used on flash */
33e631ddbaSFerenc Havasi 
34e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash
35e631ddbaSFerenc Havasi {
36e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
37e631ddbaSFerenc Havasi };
38e631ddbaSFerenc Havasi 
39e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash
40e631ddbaSFerenc Havasi {
41e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
42e631ddbaSFerenc Havasi 	jint32_t inode;		/* inode number */
43e631ddbaSFerenc Havasi 	jint32_t version;	/* inode version */
44e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
45e631ddbaSFerenc Havasi 	jint32_t totlen; 	/* record length */
46e631ddbaSFerenc Havasi } __attribute__((packed));
47e631ddbaSFerenc Havasi 
48e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash
49e631ddbaSFerenc Havasi {
50e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* == JFFS_NODETYPE_DIRENT */
51e631ddbaSFerenc Havasi 	jint32_t totlen;	/* record length */
52e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
53e631ddbaSFerenc Havasi 	jint32_t pino;		/* parent inode */
54e631ddbaSFerenc Havasi 	jint32_t version;	/* dirent version */
55e631ddbaSFerenc Havasi 	jint32_t ino; 		/* == zero for unlink */
56e631ddbaSFerenc Havasi 	uint8_t nsize;		/* dirent name size */
57e631ddbaSFerenc Havasi 	uint8_t type;		/* dirent type */
58e631ddbaSFerenc Havasi 	uint8_t name[0];	/* dirent name */
59e631ddbaSFerenc Havasi } __attribute__((packed));
60e631ddbaSFerenc Havasi 
61aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_flash
62aa98d7cfSKaiGai Kohei {
63aa98d7cfSKaiGai Kohei 	jint16_t nodetype;	/* == JFFS2_NODETYPE_XATR */
64aa98d7cfSKaiGai Kohei 	jint32_t xid;		/* xattr identifier */
65aa98d7cfSKaiGai Kohei 	jint32_t version;	/* version number */
66aa98d7cfSKaiGai Kohei 	jint32_t offset;	/* offset on jeb */
67aa98d7cfSKaiGai Kohei 	jint32_t totlen;	/* node length */
68aa98d7cfSKaiGai Kohei } __attribute__((packed));
69aa98d7cfSKaiGai Kohei 
70aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_flash
71aa98d7cfSKaiGai Kohei {
72aa98d7cfSKaiGai Kohei 	jint16_t nodetype;	/* == JFFS2_NODETYPE_XREF */
73aa98d7cfSKaiGai Kohei 	jint32_t offset;	/* offset on jeb */
74aa98d7cfSKaiGai Kohei } __attribute__((packed));
75aa98d7cfSKaiGai Kohei 
76e631ddbaSFerenc Havasi union jffs2_sum_flash
77e631ddbaSFerenc Havasi {
78e631ddbaSFerenc Havasi 	struct jffs2_sum_unknown_flash u;
79e631ddbaSFerenc Havasi 	struct jffs2_sum_inode_flash i;
80e631ddbaSFerenc Havasi 	struct jffs2_sum_dirent_flash d;
81aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xattr_flash x;
82aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xref_flash r;
83e631ddbaSFerenc Havasi };
84e631ddbaSFerenc Havasi 
85e631ddbaSFerenc Havasi /* Summary structures used in the memory */
86e631ddbaSFerenc Havasi 
87e631ddbaSFerenc Havasi struct jffs2_sum_unknown_mem
88e631ddbaSFerenc Havasi {
89e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
90e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
91e631ddbaSFerenc Havasi };
92e631ddbaSFerenc Havasi 
93e631ddbaSFerenc Havasi struct jffs2_sum_inode_mem
94e631ddbaSFerenc Havasi {
95e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
96e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
97e631ddbaSFerenc Havasi 	jint32_t inode;		/* inode number */
98e631ddbaSFerenc Havasi 	jint32_t version;	/* inode version */
99e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
100e631ddbaSFerenc Havasi 	jint32_t totlen; 	/* record length */
101e631ddbaSFerenc Havasi } __attribute__((packed));
102e631ddbaSFerenc Havasi 
103e631ddbaSFerenc Havasi struct jffs2_sum_dirent_mem
104e631ddbaSFerenc Havasi {
105e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
106e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* == JFFS_NODETYPE_DIRENT */
107e631ddbaSFerenc Havasi 	jint32_t totlen;	/* record length */
108e631ddbaSFerenc Havasi 	jint32_t offset;	/* ofset on jeb */
109e631ddbaSFerenc Havasi 	jint32_t pino;		/* parent inode */
110e631ddbaSFerenc Havasi 	jint32_t version;	/* dirent version */
111e631ddbaSFerenc Havasi 	jint32_t ino; 		/* == zero for unlink */
112e631ddbaSFerenc Havasi 	uint8_t nsize;		/* dirent name size */
113e631ddbaSFerenc Havasi 	uint8_t type;		/* dirent type */
114e631ddbaSFerenc Havasi 	uint8_t name[0];	/* dirent name */
115e631ddbaSFerenc Havasi } __attribute__((packed));
116e631ddbaSFerenc Havasi 
117aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_mem
118aa98d7cfSKaiGai Kohei {
119aa98d7cfSKaiGai Kohei 	union jffs2_sum_mem *next;
120aa98d7cfSKaiGai Kohei 	jint16_t nodetype;
121aa98d7cfSKaiGai Kohei 	jint32_t xid;
122aa98d7cfSKaiGai Kohei 	jint32_t version;
123aa98d7cfSKaiGai Kohei 	jint32_t offset;
124aa98d7cfSKaiGai Kohei 	jint32_t totlen;
125aa98d7cfSKaiGai Kohei } __attribute__((packed));
126aa98d7cfSKaiGai Kohei 
127aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_mem
128aa98d7cfSKaiGai Kohei {
129aa98d7cfSKaiGai Kohei 	union jffs2_sum_mem *next;
130aa98d7cfSKaiGai Kohei 	jint16_t nodetype;
131aa98d7cfSKaiGai Kohei 	jint32_t offset;
132aa98d7cfSKaiGai Kohei } __attribute__((packed));
133aa98d7cfSKaiGai Kohei 
134e631ddbaSFerenc Havasi union jffs2_sum_mem
135e631ddbaSFerenc Havasi {
136e631ddbaSFerenc Havasi 	struct jffs2_sum_unknown_mem u;
137e631ddbaSFerenc Havasi 	struct jffs2_sum_inode_mem i;
138e631ddbaSFerenc Havasi 	struct jffs2_sum_dirent_mem d;
139aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xattr_mem x;
140aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xref_mem r;
141e631ddbaSFerenc Havasi };
142e631ddbaSFerenc Havasi 
143e631ddbaSFerenc Havasi /* Summary related information stored in superblock */
144e631ddbaSFerenc Havasi 
145e631ddbaSFerenc Havasi struct jffs2_summary
146e631ddbaSFerenc Havasi {
147e631ddbaSFerenc Havasi 	uint32_t sum_size;      /* collected summary information for nextblock */
148e631ddbaSFerenc Havasi 	uint32_t sum_num;
149e631ddbaSFerenc Havasi 	uint32_t sum_padded;
150e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_head;
151e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_tail;
152e631ddbaSFerenc Havasi 
153e631ddbaSFerenc Havasi 	jint32_t *sum_buf;	/* buffer for writing out summary */
154e631ddbaSFerenc Havasi };
155e631ddbaSFerenc Havasi 
156e631ddbaSFerenc Havasi /* Summary marker is stored at the end of every sumarized erase block */
157e631ddbaSFerenc Havasi 
158e631ddbaSFerenc Havasi struct jffs2_sum_marker
159e631ddbaSFerenc Havasi {
160e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset of the summary node in the jeb */
161e631ddbaSFerenc Havasi 	jint32_t magic; 	/* == JFFS2_SUM_MAGIC */
162e631ddbaSFerenc Havasi };
163e631ddbaSFerenc Havasi 
1642bc9764cSFerenc Havasi #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker))
165e631ddbaSFerenc Havasi 
166e631ddbaSFerenc Havasi #ifdef CONFIG_JFFS2_SUMMARY	/* SUMMARY SUPPORT ENABLED */
167e631ddbaSFerenc Havasi 
168e631ddbaSFerenc Havasi #define jffs2_sum_active() (1)
169e631ddbaSFerenc Havasi int jffs2_sum_init(struct jffs2_sb_info *c);
170e631ddbaSFerenc Havasi void jffs2_sum_exit(struct jffs2_sb_info *c);
171e631ddbaSFerenc Havasi void jffs2_sum_disable_collecting(struct jffs2_summary *s);
172e631ddbaSFerenc Havasi int jffs2_sum_is_disabled(struct jffs2_summary *s);
173e631ddbaSFerenc Havasi void jffs2_sum_reset_collected(struct jffs2_summary *s);
174e631ddbaSFerenc Havasi void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s);
175e631ddbaSFerenc Havasi int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
176e631ddbaSFerenc Havasi 			unsigned long count,  uint32_t to);
177e631ddbaSFerenc Havasi int jffs2_sum_write_sumnode(struct jffs2_sb_info *c);
178e631ddbaSFerenc Havasi int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size);
179e631ddbaSFerenc Havasi int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs);
180e631ddbaSFerenc Havasi int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs);
181aa98d7cfSKaiGai Kohei int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs);
182aa98d7cfSKaiGai Kohei int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs);
183e631ddbaSFerenc Havasi int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
1849641b784SDavid Woodhouse 			   struct jffs2_raw_summary *summary, uint32_t sumlen,
1859641b784SDavid Woodhouse 			   uint32_t *pseudo_random);
186e631ddbaSFerenc Havasi 
187e631ddbaSFerenc Havasi #else				/* SUMMARY DISABLED */
188e631ddbaSFerenc Havasi 
189e631ddbaSFerenc Havasi #define jffs2_sum_active() (0)
190e631ddbaSFerenc Havasi #define jffs2_sum_init(a) (0)
191e631ddbaSFerenc Havasi #define jffs2_sum_exit(a)
192e631ddbaSFerenc Havasi #define jffs2_sum_disable_collecting(a)
193e631ddbaSFerenc Havasi #define jffs2_sum_is_disabled(a) (0)
194e631ddbaSFerenc Havasi #define jffs2_sum_reset_collected(a)
195e631ddbaSFerenc Havasi #define jffs2_sum_add_kvec(a,b,c,d) (0)
196e631ddbaSFerenc Havasi #define jffs2_sum_move_collected(a,b)
197e631ddbaSFerenc Havasi #define jffs2_sum_write_sumnode(a) (0)
198e631ddbaSFerenc Havasi #define jffs2_sum_add_padding_mem(a,b)
199e631ddbaSFerenc Havasi #define jffs2_sum_add_inode_mem(a,b,c)
200e631ddbaSFerenc Havasi #define jffs2_sum_add_dirent_mem(a,b,c)
201aa98d7cfSKaiGai Kohei #define jffs2_sum_add_xattr_mem(a,b,c)
202aa98d7cfSKaiGai Kohei #define jffs2_sum_add_xref_mem(a,b,c)
20306c6764bSDavid Woodhouse #define jffs2_sum_scan_sumnode(a,b,c,d,e) (0)
204e631ddbaSFerenc Havasi 
205e631ddbaSFerenc Havasi #endif /* CONFIG_JFFS2_SUMMARY */
206e631ddbaSFerenc Havasi 
207e631ddbaSFerenc Havasi #endif /* JFFS2_SUMMARY_H */
208