| 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 */ |