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 16e631ddbaSFerenc Havasi #include <linux/uio.h> 17e631ddbaSFerenc Havasi #include <linux/jffs2.h> 18e631ddbaSFerenc Havasi 19e631ddbaSFerenc Havasi #define BLK_STATE_ALLFF 0 20e631ddbaSFerenc Havasi #define BLK_STATE_CLEAN 1 21e631ddbaSFerenc Havasi #define BLK_STATE_PARTDIRTY 2 22e631ddbaSFerenc Havasi #define BLK_STATE_CLEANMARKER 3 23e631ddbaSFerenc Havasi #define BLK_STATE_ALLDIRTY 4 24e631ddbaSFerenc Havasi #define BLK_STATE_BADBLOCK 5 25e631ddbaSFerenc Havasi 26e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff 27e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash)) 28e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x)) 29aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash)) 30aa98d7cfSKaiGai Kohei #define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash)) 31e631ddbaSFerenc Havasi 32e631ddbaSFerenc Havasi /* Summary structures used on flash */ 33e631ddbaSFerenc Havasi 34e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash 35e631ddbaSFerenc Havasi { 36e631ddbaSFerenc Havasi jint16_t nodetype; /* node type */ 37e631ddbaSFerenc Havasi }; 38e631ddbaSFerenc Havasi 39e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash 40e631ddbaSFerenc Havasi { 41e631ddbaSFerenc Havasi jint16_t nodetype; /* node type */ 42e631ddbaSFerenc Havasi jint32_t inode; /* inode number */ 43e631ddbaSFerenc Havasi jint32_t version; /* inode version */ 44e631ddbaSFerenc Havasi jint32_t offset; /* offset on jeb */ 45e631ddbaSFerenc Havasi jint32_t totlen; /* record length */ 46e631ddbaSFerenc Havasi } __attribute__((packed)); 47e631ddbaSFerenc Havasi 48e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash 49e631ddbaSFerenc Havasi { 50e631ddbaSFerenc Havasi jint16_t nodetype; /* == JFFS_NODETYPE_DIRENT */ 51e631ddbaSFerenc Havasi jint32_t totlen; /* record length */ 52e631ddbaSFerenc Havasi jint32_t offset; /* offset on jeb */ 53e631ddbaSFerenc Havasi jint32_t pino; /* parent inode */ 54e631ddbaSFerenc Havasi jint32_t version; /* dirent version */ 55e631ddbaSFerenc Havasi jint32_t ino; /* == zero for unlink */ 56e631ddbaSFerenc Havasi uint8_t nsize; /* dirent name size */ 57e631ddbaSFerenc Havasi uint8_t type; /* dirent type */ 58e631ddbaSFerenc Havasi uint8_t name[0]; /* dirent name */ 59e631ddbaSFerenc Havasi } __attribute__((packed)); 60e631ddbaSFerenc Havasi 61aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_flash 62aa98d7cfSKaiGai Kohei { 63aa98d7cfSKaiGai Kohei jint16_t nodetype; /* == JFFS2_NODETYPE_XATR */ 64aa98d7cfSKaiGai Kohei jint32_t xid; /* xattr identifier */ 65aa98d7cfSKaiGai Kohei jint32_t version; /* version number */ 66aa98d7cfSKaiGai Kohei jint32_t offset; /* offset on jeb */ 67aa98d7cfSKaiGai Kohei jint32_t totlen; /* node length */ 68aa98d7cfSKaiGai Kohei } __attribute__((packed)); 69aa98d7cfSKaiGai Kohei 70aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_flash 71aa98d7cfSKaiGai Kohei { 72aa98d7cfSKaiGai Kohei jint16_t nodetype; /* == JFFS2_NODETYPE_XREF */ 73aa98d7cfSKaiGai Kohei jint32_t offset; /* offset on jeb */ 74aa98d7cfSKaiGai Kohei } __attribute__((packed)); 75aa98d7cfSKaiGai Kohei 76e631ddbaSFerenc Havasi union jffs2_sum_flash 77e631ddbaSFerenc Havasi { 78e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash u; 79e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash i; 80e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash d; 81aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_flash x; 82aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_flash r; 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 117aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_mem 118aa98d7cfSKaiGai Kohei { 119aa98d7cfSKaiGai Kohei union jffs2_sum_mem *next; 120aa98d7cfSKaiGai Kohei jint16_t nodetype; 121aa98d7cfSKaiGai Kohei jint32_t xid; 122aa98d7cfSKaiGai Kohei jint32_t version; 123aa98d7cfSKaiGai Kohei jint32_t offset; 124aa98d7cfSKaiGai Kohei jint32_t totlen; 125aa98d7cfSKaiGai Kohei } __attribute__((packed)); 126aa98d7cfSKaiGai Kohei 127aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_mem 128aa98d7cfSKaiGai Kohei { 129aa98d7cfSKaiGai Kohei union jffs2_sum_mem *next; 130aa98d7cfSKaiGai Kohei jint16_t nodetype; 131aa98d7cfSKaiGai Kohei jint32_t offset; 132aa98d7cfSKaiGai Kohei } __attribute__((packed)); 133aa98d7cfSKaiGai Kohei 134e631ddbaSFerenc Havasi union jffs2_sum_mem 135e631ddbaSFerenc Havasi { 136e631ddbaSFerenc Havasi struct jffs2_sum_unknown_mem u; 137e631ddbaSFerenc Havasi struct jffs2_sum_inode_mem i; 138e631ddbaSFerenc Havasi struct jffs2_sum_dirent_mem d; 139aa98d7cfSKaiGai Kohei struct jffs2_sum_xattr_mem x; 140aa98d7cfSKaiGai Kohei struct jffs2_sum_xref_mem r; 141e631ddbaSFerenc Havasi }; 142e631ddbaSFerenc Havasi 143e631ddbaSFerenc Havasi /* Summary related information stored in superblock */ 144e631ddbaSFerenc Havasi 145e631ddbaSFerenc Havasi struct jffs2_summary 146e631ddbaSFerenc Havasi { 147e631ddbaSFerenc Havasi uint32_t sum_size; /* collected summary information for nextblock */ 148e631ddbaSFerenc Havasi uint32_t sum_num; 149e631ddbaSFerenc Havasi uint32_t sum_padded; 150e631ddbaSFerenc Havasi union jffs2_sum_mem *sum_list_head; 151e631ddbaSFerenc Havasi union jffs2_sum_mem *sum_list_tail; 152e631ddbaSFerenc Havasi 153e631ddbaSFerenc Havasi jint32_t *sum_buf; /* buffer for writing out summary */ 154e631ddbaSFerenc Havasi }; 155e631ddbaSFerenc Havasi 156e631ddbaSFerenc Havasi /* Summary marker is stored at the end of every sumarized erase block */ 157e631ddbaSFerenc Havasi 158e631ddbaSFerenc Havasi struct jffs2_sum_marker 159e631ddbaSFerenc Havasi { 160e631ddbaSFerenc Havasi jint32_t offset; /* offset of the summary node in the jeb */ 161e631ddbaSFerenc Havasi jint32_t magic; /* == JFFS2_SUM_MAGIC */ 162e631ddbaSFerenc Havasi }; 163e631ddbaSFerenc Havasi 1642bc9764cSFerenc Havasi #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker)) 165e631ddbaSFerenc Havasi 166e631ddbaSFerenc Havasi #ifdef CONFIG_JFFS2_SUMMARY /* SUMMARY SUPPORT ENABLED */ 167e631ddbaSFerenc Havasi 168e631ddbaSFerenc Havasi #define jffs2_sum_active() (1) 169e631ddbaSFerenc Havasi int jffs2_sum_init(struct jffs2_sb_info *c); 170e631ddbaSFerenc Havasi void jffs2_sum_exit(struct jffs2_sb_info *c); 171e631ddbaSFerenc Havasi void jffs2_sum_disable_collecting(struct jffs2_summary *s); 172e631ddbaSFerenc Havasi int jffs2_sum_is_disabled(struct jffs2_summary *s); 173e631ddbaSFerenc Havasi void jffs2_sum_reset_collected(struct jffs2_summary *s); 174e631ddbaSFerenc Havasi void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s); 175e631ddbaSFerenc Havasi int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs, 176e631ddbaSFerenc Havasi unsigned long count, uint32_t to); 177e631ddbaSFerenc Havasi int jffs2_sum_write_sumnode(struct jffs2_sb_info *c); 178e631ddbaSFerenc Havasi int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size); 179e631ddbaSFerenc Havasi int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs); 180e631ddbaSFerenc Havasi int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs); 181aa98d7cfSKaiGai Kohei int jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs); 182aa98d7cfSKaiGai Kohei int jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs); 183e631ddbaSFerenc Havasi int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 1849641b784SDavid Woodhouse struct jffs2_raw_summary *summary, uint32_t sumlen, 1859641b784SDavid Woodhouse uint32_t *pseudo_random); 186e631ddbaSFerenc Havasi 187e631ddbaSFerenc Havasi #else /* SUMMARY DISABLED */ 188e631ddbaSFerenc Havasi 189e631ddbaSFerenc Havasi #define jffs2_sum_active() (0) 190e631ddbaSFerenc Havasi #define jffs2_sum_init(a) (0) 191e631ddbaSFerenc Havasi #define jffs2_sum_exit(a) 192e631ddbaSFerenc Havasi #define jffs2_sum_disable_collecting(a) 193e631ddbaSFerenc Havasi #define jffs2_sum_is_disabled(a) (0) 194e631ddbaSFerenc Havasi #define jffs2_sum_reset_collected(a) 195e631ddbaSFerenc Havasi #define jffs2_sum_add_kvec(a,b,c,d) (0) 196e631ddbaSFerenc Havasi #define jffs2_sum_move_collected(a,b) 197e631ddbaSFerenc Havasi #define jffs2_sum_write_sumnode(a) (0) 198e631ddbaSFerenc Havasi #define jffs2_sum_add_padding_mem(a,b) 199e631ddbaSFerenc Havasi #define jffs2_sum_add_inode_mem(a,b,c) 200e631ddbaSFerenc Havasi #define jffs2_sum_add_dirent_mem(a,b,c) 201aa98d7cfSKaiGai Kohei #define jffs2_sum_add_xattr_mem(a,b,c) 202aa98d7cfSKaiGai Kohei #define jffs2_sum_add_xref_mem(a,b,c) 20306c6764bSDavid Woodhouse #define jffs2_sum_scan_sumnode(a,b,c,d,e) (0) 204e631ddbaSFerenc Havasi 205e631ddbaSFerenc Havasi #endif /* CONFIG_JFFS2_SUMMARY */ 206e631ddbaSFerenc Havasi 207e631ddbaSFerenc Havasi #endif /* JFFS2_SUMMARY_H */ 208