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