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