xref: /linux/fs/jffs2/summary.h (revision 81af4b7b)
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 
16b7600dbaSDavid Woodhouse /* Limit summary size to 64KiB so that we can kmalloc it. If the summary
17b7600dbaSDavid Woodhouse    is larger than that, we have to just ditch it and avoid using summary
18b7600dbaSDavid Woodhouse    for the eraseblock in question... and it probably doesn't hurt us much
19b7600dbaSDavid Woodhouse    anyway. */
20b7600dbaSDavid Woodhouse #define MAX_SUMMARY_SIZE 65536
21b7600dbaSDavid Woodhouse 
22e631ddbaSFerenc Havasi #include <linux/uio.h>
23e631ddbaSFerenc Havasi #include <linux/jffs2.h>
24e631ddbaSFerenc Havasi 
25e631ddbaSFerenc Havasi #define BLK_STATE_ALLFF		0
26e631ddbaSFerenc Havasi #define BLK_STATE_CLEAN		1
27e631ddbaSFerenc Havasi #define BLK_STATE_PARTDIRTY	2
28e631ddbaSFerenc Havasi #define BLK_STATE_CLEANMARKER	3
29e631ddbaSFerenc Havasi #define BLK_STATE_ALLDIRTY	4
30e631ddbaSFerenc Havasi #define BLK_STATE_BADBLOCK	5
31e631ddbaSFerenc Havasi 
32e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff
33e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash))
34e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x))
35aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash))
36aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash))
37e631ddbaSFerenc Havasi 
38e631ddbaSFerenc Havasi /* Summary structures used on flash */
39e631ddbaSFerenc Havasi 
40e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash
41e631ddbaSFerenc Havasi {
42e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
43e631ddbaSFerenc Havasi };
44e631ddbaSFerenc Havasi 
45e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash
46e631ddbaSFerenc Havasi {
47e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
48e631ddbaSFerenc Havasi 	jint32_t inode;		/* inode number */
49e631ddbaSFerenc Havasi 	jint32_t version;	/* inode version */
50e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
51e631ddbaSFerenc Havasi 	jint32_t totlen; 	/* record length */
52e631ddbaSFerenc Havasi } __attribute__((packed));
53e631ddbaSFerenc Havasi 
54e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash
55e631ddbaSFerenc Havasi {
56e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* == JFFS_NODETYPE_DIRENT */
57e631ddbaSFerenc Havasi 	jint32_t totlen;	/* record length */
58e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
59e631ddbaSFerenc Havasi 	jint32_t pino;		/* parent inode */
60e631ddbaSFerenc Havasi 	jint32_t version;	/* dirent version */
61e631ddbaSFerenc Havasi 	jint32_t ino; 		/* == zero for unlink */
62e631ddbaSFerenc Havasi 	uint8_t nsize;		/* dirent name size */
63e631ddbaSFerenc Havasi 	uint8_t type;		/* dirent type */
646112bad7SGustavo A. R. Silva 	uint8_t name[];	/* dirent name */
65e631ddbaSFerenc Havasi } __attribute__((packed));
66e631ddbaSFerenc Havasi 
67aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_flash
68aa98d7cfSKaiGai Kohei {
69aa98d7cfSKaiGai Kohei 	jint16_t nodetype;	/* == JFFS2_NODETYPE_XATR */
70aa98d7cfSKaiGai Kohei 	jint32_t xid;		/* xattr identifier */
71aa98d7cfSKaiGai Kohei 	jint32_t version;	/* version number */
72aa98d7cfSKaiGai Kohei 	jint32_t offset;	/* offset on jeb */
73aa98d7cfSKaiGai Kohei 	jint32_t totlen;	/* node length */
74aa98d7cfSKaiGai Kohei } __attribute__((packed));
75aa98d7cfSKaiGai Kohei 
76aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_flash
77aa98d7cfSKaiGai Kohei {
78aa98d7cfSKaiGai Kohei 	jint16_t nodetype;	/* == JFFS2_NODETYPE_XREF */
79aa98d7cfSKaiGai Kohei 	jint32_t offset;	/* offset on jeb */
80aa98d7cfSKaiGai Kohei } __attribute__((packed));
81aa98d7cfSKaiGai Kohei 
82e631ddbaSFerenc Havasi union jffs2_sum_flash
83e631ddbaSFerenc Havasi {
84e631ddbaSFerenc Havasi 	struct jffs2_sum_unknown_flash u;
85e631ddbaSFerenc Havasi 	struct jffs2_sum_inode_flash i;
86e631ddbaSFerenc Havasi 	struct jffs2_sum_dirent_flash d;
87aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xattr_flash x;
88aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xref_flash r;
89e631ddbaSFerenc Havasi };
90e631ddbaSFerenc Havasi 
91e631ddbaSFerenc Havasi /* Summary structures used in the memory */
92e631ddbaSFerenc Havasi 
93e631ddbaSFerenc Havasi struct jffs2_sum_unknown_mem
94e631ddbaSFerenc Havasi {
95e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
96e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
97e631ddbaSFerenc Havasi };
98e631ddbaSFerenc Havasi 
99e631ddbaSFerenc Havasi struct jffs2_sum_inode_mem
100e631ddbaSFerenc Havasi {
101e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
102e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
103e631ddbaSFerenc Havasi 	jint32_t inode;		/* inode number */
104e631ddbaSFerenc Havasi 	jint32_t version;	/* inode version */
105e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
106e631ddbaSFerenc Havasi 	jint32_t totlen; 	/* record length */
107e631ddbaSFerenc Havasi } __attribute__((packed));
108e631ddbaSFerenc Havasi 
109e631ddbaSFerenc Havasi struct jffs2_sum_dirent_mem
110e631ddbaSFerenc Havasi {
111e631ddbaSFerenc Havasi 	union jffs2_sum_mem *next;
112e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* == JFFS_NODETYPE_DIRENT */
113e631ddbaSFerenc Havasi 	jint32_t totlen;	/* record length */
114e631ddbaSFerenc Havasi 	jint32_t offset;	/* ofset on jeb */
115e631ddbaSFerenc Havasi 	jint32_t pino;		/* parent inode */
116e631ddbaSFerenc Havasi 	jint32_t version;	/* dirent version */
117e631ddbaSFerenc Havasi 	jint32_t ino; 		/* == zero for unlink */
118e631ddbaSFerenc Havasi 	uint8_t nsize;		/* dirent name size */
119e631ddbaSFerenc Havasi 	uint8_t type;		/* dirent type */
1206112bad7SGustavo A. R. Silva 	uint8_t name[];	/* dirent name */
121e631ddbaSFerenc Havasi } __attribute__((packed));
122e631ddbaSFerenc Havasi 
123aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_mem
124aa98d7cfSKaiGai Kohei {
125aa98d7cfSKaiGai Kohei 	union jffs2_sum_mem *next;
126aa98d7cfSKaiGai Kohei 	jint16_t nodetype;
127aa98d7cfSKaiGai Kohei 	jint32_t xid;
128aa98d7cfSKaiGai Kohei 	jint32_t version;
129aa98d7cfSKaiGai Kohei 	jint32_t offset;
130aa98d7cfSKaiGai Kohei 	jint32_t totlen;
131aa98d7cfSKaiGai Kohei } __attribute__((packed));
132aa98d7cfSKaiGai Kohei 
133aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_mem
134aa98d7cfSKaiGai Kohei {
135aa98d7cfSKaiGai Kohei 	union jffs2_sum_mem *next;
136aa98d7cfSKaiGai Kohei 	jint16_t nodetype;
137aa98d7cfSKaiGai Kohei 	jint32_t offset;
138aa98d7cfSKaiGai Kohei } __attribute__((packed));
139aa98d7cfSKaiGai Kohei 
140e631ddbaSFerenc Havasi union jffs2_sum_mem
141e631ddbaSFerenc Havasi {
142e631ddbaSFerenc Havasi 	struct jffs2_sum_unknown_mem u;
143e631ddbaSFerenc Havasi 	struct jffs2_sum_inode_mem i;
144e631ddbaSFerenc Havasi 	struct jffs2_sum_dirent_mem d;
145aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xattr_mem x;
146aa98d7cfSKaiGai Kohei 	struct jffs2_sum_xref_mem r;
147e631ddbaSFerenc Havasi };
148e631ddbaSFerenc Havasi 
149e631ddbaSFerenc Havasi /* Summary related information stored in superblock */
150e631ddbaSFerenc Havasi 
151e631ddbaSFerenc Havasi struct jffs2_summary
152e631ddbaSFerenc Havasi {
153e631ddbaSFerenc Havasi 	uint32_t sum_size;      /* collected summary information for nextblock */
154e631ddbaSFerenc Havasi 	uint32_t sum_num;
155e631ddbaSFerenc Havasi 	uint32_t sum_padded;
156e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_head;
157e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_tail;
158e631ddbaSFerenc Havasi 
159e631ddbaSFerenc Havasi 	jint32_t *sum_buf;	/* buffer for writing out summary */
160e631ddbaSFerenc Havasi };
161e631ddbaSFerenc Havasi 
162e631ddbaSFerenc Havasi /* Summary marker is stored at the end of every sumarized erase block */
163e631ddbaSFerenc Havasi 
164e631ddbaSFerenc Havasi struct jffs2_sum_marker
165e631ddbaSFerenc Havasi {
166e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset of the summary node in the jeb */
167e631ddbaSFerenc Havasi 	jint32_t magic; 	/* == JFFS2_SUM_MAGIC */
168e631ddbaSFerenc Havasi };
169e631ddbaSFerenc Havasi 
1702bc9764cSFerenc Havasi #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker))
171e631ddbaSFerenc Havasi 
172e631ddbaSFerenc Havasi #ifdef CONFIG_JFFS2_SUMMARY	/* SUMMARY SUPPORT ENABLED */
173e631ddbaSFerenc Havasi 
174e631ddbaSFerenc Havasi #define jffs2_sum_active() (1)
175e631ddbaSFerenc Havasi int jffs2_sum_init(struct jffs2_sb_info *c);
176e631ddbaSFerenc Havasi void jffs2_sum_exit(struct jffs2_sb_info *c);
177e631ddbaSFerenc Havasi void jffs2_sum_disable_collecting(struct jffs2_summary *s);
178e631ddbaSFerenc Havasi int jffs2_sum_is_disabled(struct jffs2_summary *s);
179e631ddbaSFerenc Havasi void jffs2_sum_reset_collected(struct jffs2_summary *s);
180e631ddbaSFerenc Havasi void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s);
181e631ddbaSFerenc Havasi int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
182e631ddbaSFerenc Havasi 			unsigned long count,  uint32_t to);
183e631ddbaSFerenc Havasi int jffs2_sum_write_sumnode(struct jffs2_sb_info *c);
184e631ddbaSFerenc Havasi int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size);
185e631ddbaSFerenc Havasi int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs);
186e631ddbaSFerenc Havasi int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs);
187aa98d7cfSKaiGai Kohei int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs);
188aa98d7cfSKaiGai Kohei int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs);
189e631ddbaSFerenc Havasi int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
1909641b784SDavid Woodhouse 			   struct jffs2_raw_summary *summary, uint32_t sumlen,
1919641b784SDavid Woodhouse 			   uint32_t *pseudo_random);
192e631ddbaSFerenc Havasi 
193e631ddbaSFerenc Havasi #else				/* SUMMARY DISABLED */
194e631ddbaSFerenc Havasi 
195e631ddbaSFerenc Havasi #define jffs2_sum_active() (0)
196e631ddbaSFerenc Havasi #define jffs2_sum_init(a) (0)
197*81af4b7bSArnd Bergmann #define jffs2_sum_exit(a) do { } while (0)
198e631ddbaSFerenc Havasi #define jffs2_sum_disable_collecting(a)
199e631ddbaSFerenc Havasi #define jffs2_sum_is_disabled(a) (0)
200*81af4b7bSArnd Bergmann #define jffs2_sum_reset_collected(a) do { } while (0)
201e631ddbaSFerenc Havasi #define jffs2_sum_add_kvec(a,b,c,d) (0)
202*81af4b7bSArnd Bergmann #define jffs2_sum_move_collected(a,b) do { } while (0)
203e631ddbaSFerenc Havasi #define jffs2_sum_write_sumnode(a) (0)
204*81af4b7bSArnd Bergmann #define jffs2_sum_add_padding_mem(a,b) do { } while (0)
205*81af4b7bSArnd Bergmann #define jffs2_sum_add_inode_mem(a,b,c) do { } while (0)
206*81af4b7bSArnd Bergmann #define jffs2_sum_add_dirent_mem(a,b,c) do { } while (0)
207*81af4b7bSArnd Bergmann #define jffs2_sum_add_xattr_mem(a,b,c) do { } while (0)
208*81af4b7bSArnd Bergmann #define jffs2_sum_add_xref_mem(a,b,c) do { } while (0)
20906c6764bSDavid Woodhouse #define jffs2_sum_scan_sumnode(a,b,c,d,e) (0)
210e631ddbaSFerenc Havasi 
211e631ddbaSFerenc Havasi #endif /* CONFIG_JFFS2_SUMMARY */
212e631ddbaSFerenc Havasi 
213e631ddbaSFerenc Havasi #endif /* JFFS2_SUMMARY_H */
214