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 * 11e631ddbaSFerenc Havasi * $Id: summary.h,v 1.1 2005/09/07 08:34:54 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)) 48e631ddbaSFerenc Havasi 49e631ddbaSFerenc Havasi /* Summary structures used on flash */ 50e631ddbaSFerenc Havasi 51e631ddbaSFerenc Havasi struct jffs2_sum_unknown_flash 52e631ddbaSFerenc Havasi { 53e631ddbaSFerenc Havasi jint16_t nodetype; /* node type */ 54e631ddbaSFerenc Havasi }; 55e631ddbaSFerenc Havasi 56e631ddbaSFerenc Havasi struct jffs2_sum_inode_flash 57e631ddbaSFerenc Havasi { 58e631ddbaSFerenc Havasi jint16_t nodetype; /* node type */ 59e631ddbaSFerenc Havasi jint32_t inode; /* inode number */ 60e631ddbaSFerenc Havasi jint32_t version; /* inode version */ 61e631ddbaSFerenc Havasi jint32_t offset; /* offset on jeb */ 62e631ddbaSFerenc Havasi jint32_t totlen; /* record length */ 63e631ddbaSFerenc Havasi } __attribute__((packed)); 64e631ddbaSFerenc Havasi 65e631ddbaSFerenc Havasi struct jffs2_sum_dirent_flash 66e631ddbaSFerenc Havasi { 67e631ddbaSFerenc Havasi jint16_t nodetype; /* == JFFS_NODETYPE_DIRENT */ 68e631ddbaSFerenc Havasi jint32_t totlen; /* record length */ 69e631ddbaSFerenc Havasi jint32_t offset; /* offset on jeb */ 70e631ddbaSFerenc Havasi jint32_t pino; /* parent inode */ 71e631ddbaSFerenc Havasi jint32_t version; /* dirent version */ 72e631ddbaSFerenc Havasi jint32_t ino; /* == zero for unlink */ 73e631ddbaSFerenc Havasi uint8_t nsize; /* dirent name size */ 74e631ddbaSFerenc Havasi uint8_t type; /* dirent type */ 75e631ddbaSFerenc Havasi uint8_t name[0]; /* dirent name */ 76e631ddbaSFerenc Havasi } __attribute__((packed)); 77e631ddbaSFerenc Havasi 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; 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 117e631ddbaSFerenc Havasi union jffs2_sum_mem 118e631ddbaSFerenc Havasi { 119e631ddbaSFerenc Havasi struct jffs2_sum_unknown_mem u; 120e631ddbaSFerenc Havasi struct jffs2_sum_inode_mem i; 121e631ddbaSFerenc Havasi struct jffs2_sum_dirent_mem d; 122e631ddbaSFerenc Havasi }; 123e631ddbaSFerenc Havasi 124e631ddbaSFerenc Havasi /* Summary related information stored in superblock */ 125e631ddbaSFerenc Havasi 126e631ddbaSFerenc Havasi struct jffs2_summary 127e631ddbaSFerenc Havasi { 128e631ddbaSFerenc Havasi uint32_t sum_size; /* collected summary information for nextblock */ 129e631ddbaSFerenc Havasi uint32_t sum_num; 130e631ddbaSFerenc Havasi uint32_t sum_padded; 131e631ddbaSFerenc Havasi union jffs2_sum_mem *sum_list_head; 132e631ddbaSFerenc Havasi union jffs2_sum_mem *sum_list_tail; 133e631ddbaSFerenc Havasi 134e631ddbaSFerenc Havasi jint32_t *sum_buf; /* buffer for writing out summary */ 135e631ddbaSFerenc Havasi }; 136e631ddbaSFerenc Havasi 137e631ddbaSFerenc Havasi /* Summary marker is stored at the end of every sumarized erase block */ 138e631ddbaSFerenc Havasi 139e631ddbaSFerenc Havasi struct jffs2_sum_marker 140e631ddbaSFerenc Havasi { 141e631ddbaSFerenc Havasi jint32_t offset; /* offset of the summary node in the jeb */ 142e631ddbaSFerenc Havasi jint32_t magic; /* == JFFS2_SUM_MAGIC */ 143e631ddbaSFerenc Havasi }; 144e631ddbaSFerenc Havasi 145e631ddbaSFerenc Havasi #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_summary_node) + sizeof(struct jffs2_sum_marker)) 146e631ddbaSFerenc Havasi 147e631ddbaSFerenc Havasi #ifdef CONFIG_JFFS2_SUMMARY /* SUMMARY SUPPORT ENABLED */ 148e631ddbaSFerenc Havasi 149e631ddbaSFerenc Havasi #define jffs2_sum_active() (1) 150e631ddbaSFerenc Havasi int jffs2_sum_init(struct jffs2_sb_info *c); 151e631ddbaSFerenc Havasi void jffs2_sum_exit(struct jffs2_sb_info *c); 152e631ddbaSFerenc Havasi void jffs2_sum_disable_collecting(struct jffs2_summary *s); 153e631ddbaSFerenc Havasi int jffs2_sum_is_disabled(struct jffs2_summary *s); 154e631ddbaSFerenc Havasi void jffs2_sum_reset_collected(struct jffs2_summary *s); 155e631ddbaSFerenc Havasi void jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s); 156e631ddbaSFerenc Havasi int jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs, 157e631ddbaSFerenc Havasi unsigned long count, uint32_t to); 158e631ddbaSFerenc Havasi int jffs2_sum_write_sumnode(struct jffs2_sb_info *c); 159e631ddbaSFerenc Havasi int jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size); 160e631ddbaSFerenc Havasi int jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs); 161e631ddbaSFerenc Havasi int jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs); 162e631ddbaSFerenc Havasi int jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 163e631ddbaSFerenc Havasi uint32_t ofs, uint32_t *pseudo_random); 164e631ddbaSFerenc Havasi 165e631ddbaSFerenc Havasi #else /* SUMMARY DISABLED */ 166e631ddbaSFerenc Havasi 167e631ddbaSFerenc Havasi #define jffs2_sum_active() (0) 168e631ddbaSFerenc Havasi #define jffs2_sum_init(a) (0) 169e631ddbaSFerenc Havasi #define jffs2_sum_exit(a) 170e631ddbaSFerenc Havasi #define jffs2_sum_disable_collecting(a) 171e631ddbaSFerenc Havasi #define jffs2_sum_is_disabled(a) (0) 172e631ddbaSFerenc Havasi #define jffs2_sum_reset_collected(a) 173e631ddbaSFerenc Havasi #define jffs2_sum_add_kvec(a,b,c,d) (0) 174e631ddbaSFerenc Havasi #define jffs2_sum_move_collected(a,b) 175e631ddbaSFerenc Havasi #define jffs2_sum_write_sumnode(a) (0) 176e631ddbaSFerenc Havasi #define jffs2_sum_add_padding_mem(a,b) 177e631ddbaSFerenc Havasi #define jffs2_sum_add_inode_mem(a,b,c) 178e631ddbaSFerenc Havasi #define jffs2_sum_add_dirent_mem(a,b,c) 179e631ddbaSFerenc Havasi #define jffs2_sum_scan_sumnode(a,b,c,d) (0) 180e631ddbaSFerenc Havasi 181e631ddbaSFerenc Havasi #endif /* CONFIG_JFFS2_SUMMARY */ 182e631ddbaSFerenc Havasi 183e631ddbaSFerenc Havasi #endif /* JFFS2_SUMMARY_H */ 184