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