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