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