xref: /openbmc/linux/fs/jffs2/summary.h (revision 2bc9764c)
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))
48e631ddbaSFerenc Havasi 
49e631ddbaSFerenc Havasi /* Summary structures used on flash */
50e631ddbaSFerenc Havasi 
51e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash
52e631ddbaSFerenc Havasi {
53e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
54e631ddbaSFerenc Havasi };
55e631ddbaSFerenc Havasi 
56e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash
57e631ddbaSFerenc Havasi {
58e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* node type */
59e631ddbaSFerenc Havasi 	jint32_t inode;		/* inode number */
60e631ddbaSFerenc Havasi 	jint32_t version;	/* inode version */
61e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
62e631ddbaSFerenc Havasi 	jint32_t totlen; 	/* record length */
63e631ddbaSFerenc Havasi } __attribute__((packed));
64e631ddbaSFerenc Havasi 
65e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash
66e631ddbaSFerenc Havasi {
67e631ddbaSFerenc Havasi 	jint16_t nodetype;	/* == JFFS_NODETYPE_DIRENT */
68e631ddbaSFerenc Havasi 	jint32_t totlen;	/* record length */
69e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset on jeb */
70e631ddbaSFerenc Havasi 	jint32_t pino;		/* parent inode */
71e631ddbaSFerenc Havasi 	jint32_t version;	/* dirent version */
72e631ddbaSFerenc Havasi 	jint32_t ino; 		/* == zero for unlink */
73e631ddbaSFerenc Havasi 	uint8_t nsize;		/* dirent name size */
74e631ddbaSFerenc Havasi 	uint8_t type;		/* dirent type */
75e631ddbaSFerenc Havasi 	uint8_t name[0];	/* dirent name */
76e631ddbaSFerenc Havasi } __attribute__((packed));
77e631ddbaSFerenc Havasi 
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;
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 
117e631ddbaSFerenc Havasi union jffs2_sum_mem
118e631ddbaSFerenc Havasi {
119e631ddbaSFerenc Havasi 	struct jffs2_sum_unknown_mem u;
120e631ddbaSFerenc Havasi 	struct jffs2_sum_inode_mem i;
121e631ddbaSFerenc Havasi 	struct jffs2_sum_dirent_mem d;
122e631ddbaSFerenc Havasi };
123e631ddbaSFerenc Havasi 
124e631ddbaSFerenc Havasi /* Summary related information stored in superblock */
125e631ddbaSFerenc Havasi 
126e631ddbaSFerenc Havasi struct jffs2_summary
127e631ddbaSFerenc Havasi {
128e631ddbaSFerenc Havasi 	uint32_t sum_size;      /* collected summary information for nextblock */
129e631ddbaSFerenc Havasi 	uint32_t sum_num;
130e631ddbaSFerenc Havasi 	uint32_t sum_padded;
131e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_head;
132e631ddbaSFerenc Havasi 	union jffs2_sum_mem *sum_list_tail;
133e631ddbaSFerenc Havasi 
134e631ddbaSFerenc Havasi 	jint32_t *sum_buf;	/* buffer for writing out summary */
135e631ddbaSFerenc Havasi };
136e631ddbaSFerenc Havasi 
137e631ddbaSFerenc Havasi /* Summary marker is stored at the end of every sumarized erase block */
138e631ddbaSFerenc Havasi 
139e631ddbaSFerenc Havasi struct jffs2_sum_marker
140e631ddbaSFerenc Havasi {
141e631ddbaSFerenc Havasi 	jint32_t offset;	/* offset of the summary node in the jeb */
142e631ddbaSFerenc Havasi 	jint32_t magic; 	/* == JFFS2_SUM_MAGIC */
143e631ddbaSFerenc Havasi };
144e631ddbaSFerenc Havasi 
1452bc9764cSFerenc Havasi #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker))
146e631ddbaSFerenc Havasi 
147e631ddbaSFerenc Havasi #ifdef CONFIG_JFFS2_SUMMARY	/* SUMMARY SUPPORT ENABLED */
148e631ddbaSFerenc Havasi 
149e631ddbaSFerenc Havasi #define jffs2_sum_active() (1)
150e631ddbaSFerenc Havasi int jffs2_sum_init(struct jffs2_sb_info *c);
151e631ddbaSFerenc Havasi void jffs2_sum_exit(struct jffs2_sb_info *c);
152e631ddbaSFerenc Havasi void jffs2_sum_disable_collecting(struct jffs2_summary *s);
153e631ddbaSFerenc Havasi int jffs2_sum_is_disabled(struct jffs2_summary *s);
154e631ddbaSFerenc Havasi void jffs2_sum_reset_collected(struct jffs2_summary *s);
155e631ddbaSFerenc Havasi void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s);
156e631ddbaSFerenc Havasi int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs,
157e631ddbaSFerenc Havasi 			unsigned long count,  uint32_t to);
158e631ddbaSFerenc Havasi int jffs2_sum_write_sumnode(struct jffs2_sb_info *c);
159e631ddbaSFerenc Havasi int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size);
160e631ddbaSFerenc Havasi int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs);
161e631ddbaSFerenc Havasi int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs);
162e631ddbaSFerenc Havasi int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb,
163e631ddbaSFerenc Havasi 			uint32_t ofs, uint32_t *pseudo_random);
164e631ddbaSFerenc Havasi 
165e631ddbaSFerenc Havasi #else				/* SUMMARY DISABLED */
166e631ddbaSFerenc Havasi 
167e631ddbaSFerenc Havasi #define jffs2_sum_active() (0)
168e631ddbaSFerenc Havasi #define jffs2_sum_init(a) (0)
169e631ddbaSFerenc Havasi #define jffs2_sum_exit(a)
170e631ddbaSFerenc Havasi #define jffs2_sum_disable_collecting(a)
171e631ddbaSFerenc Havasi #define jffs2_sum_is_disabled(a) (0)
172e631ddbaSFerenc Havasi #define jffs2_sum_reset_collected(a)
173e631ddbaSFerenc Havasi #define jffs2_sum_add_kvec(a,b,c,d) (0)
174e631ddbaSFerenc Havasi #define jffs2_sum_move_collected(a,b)
175e631ddbaSFerenc Havasi #define jffs2_sum_write_sumnode(a) (0)
176e631ddbaSFerenc Havasi #define jffs2_sum_add_padding_mem(a,b)
177e631ddbaSFerenc Havasi #define jffs2_sum_add_inode_mem(a,b,c)
178e631ddbaSFerenc Havasi #define jffs2_sum_add_dirent_mem(a,b,c)
179e631ddbaSFerenc Havasi #define jffs2_sum_scan_sumnode(a,b,c,d) (0)
180e631ddbaSFerenc Havasi 
181e631ddbaSFerenc Havasi #endif /* CONFIG_JFFS2_SUMMARY */
182e631ddbaSFerenc Havasi 
183e631ddbaSFerenc Havasi #endif /* JFFS2_SUMMARY_H */
184