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