1*9b707622SIlya Yanok /* 2*9b707622SIlya Yanok * JFFS2 -- Journalling Flash File System, Version 2. 3*9b707622SIlya Yanok * 4*9b707622SIlya Yanok * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, 5*9b707622SIlya Yanok * Zoltan Sogor <weth@inf.u-szeged.hu>, 6*9b707622SIlya Yanok * Patrik Kluba <pajko@halom.u-szeged.hu>, 7*9b707622SIlya Yanok * University of Szeged, Hungary 8*9b707622SIlya Yanok * 9*9b707622SIlya Yanok * For licensing information, see the file 'LICENCE' in this directory. 10*9b707622SIlya Yanok * 11*9b707622SIlya Yanok */ 12*9b707622SIlya Yanok 13*9b707622SIlya Yanok #ifndef JFFS2_SUMMARY_H 14*9b707622SIlya Yanok #define JFFS2_SUMMARY_H 15*9b707622SIlya Yanok 16*9b707622SIlya Yanok #define BLK_STATE_ALLFF 0 17*9b707622SIlya Yanok #define BLK_STATE_CLEAN 1 18*9b707622SIlya Yanok #define BLK_STATE_PARTDIRTY 2 19*9b707622SIlya Yanok #define BLK_STATE_CLEANMARKER 3 20*9b707622SIlya Yanok #define BLK_STATE_ALLDIRTY 4 21*9b707622SIlya Yanok #define BLK_STATE_BADBLOCK 5 22*9b707622SIlya Yanok 23*9b707622SIlya Yanok #define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff 24*9b707622SIlya Yanok #define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash)) 25*9b707622SIlya Yanok #define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x)) 26*9b707622SIlya Yanok #define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash)) 27*9b707622SIlya Yanok #define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash)) 28*9b707622SIlya Yanok 29*9b707622SIlya Yanok /* Summary structures used on flash */ 30*9b707622SIlya Yanok 31*9b707622SIlya Yanok struct jffs2_sum_unknown_flash 32*9b707622SIlya Yanok { 33*9b707622SIlya Yanok __u16 nodetype; /* node type */ 34*9b707622SIlya Yanok }; 35*9b707622SIlya Yanok 36*9b707622SIlya Yanok struct jffs2_sum_inode_flash 37*9b707622SIlya Yanok { 38*9b707622SIlya Yanok __u16 nodetype; /* node type */ 39*9b707622SIlya Yanok __u32 inode; /* inode number */ 40*9b707622SIlya Yanok __u32 version; /* inode version */ 41*9b707622SIlya Yanok __u32 offset; /* offset on jeb */ 42*9b707622SIlya Yanok __u32 totlen; /* record length */ 43*9b707622SIlya Yanok } __attribute__((packed)); 44*9b707622SIlya Yanok 45*9b707622SIlya Yanok struct jffs2_sum_dirent_flash 46*9b707622SIlya Yanok { 47*9b707622SIlya Yanok __u16 nodetype; /* == JFFS_NODETYPE_DIRENT */ 48*9b707622SIlya Yanok __u32 totlen; /* record length */ 49*9b707622SIlya Yanok __u32 offset; /* offset on jeb */ 50*9b707622SIlya Yanok __u32 pino; /* parent inode */ 51*9b707622SIlya Yanok __u32 version; /* dirent version */ 52*9b707622SIlya Yanok __u32 ino; /* == zero for unlink */ 53*9b707622SIlya Yanok uint8_t nsize; /* dirent name size */ 54*9b707622SIlya Yanok uint8_t type; /* dirent type */ 55*9b707622SIlya Yanok uint8_t name[0]; /* dirent name */ 56*9b707622SIlya Yanok } __attribute__((packed)); 57*9b707622SIlya Yanok 58*9b707622SIlya Yanok struct jffs2_sum_xattr_flash 59*9b707622SIlya Yanok { 60*9b707622SIlya Yanok __u16 nodetype; /* == JFFS2_NODETYPE_XATR */ 61*9b707622SIlya Yanok __u32 xid; /* xattr identifier */ 62*9b707622SIlya Yanok __u32 version; /* version number */ 63*9b707622SIlya Yanok __u32 offset; /* offset on jeb */ 64*9b707622SIlya Yanok __u32 totlen; /* node length */ 65*9b707622SIlya Yanok } __attribute__((packed)); 66*9b707622SIlya Yanok 67*9b707622SIlya Yanok struct jffs2_sum_xref_flash 68*9b707622SIlya Yanok { 69*9b707622SIlya Yanok __u16 nodetype; /* == JFFS2_NODETYPE_XREF */ 70*9b707622SIlya Yanok __u32 offset; /* offset on jeb */ 71*9b707622SIlya Yanok } __attribute__((packed)); 72*9b707622SIlya Yanok 73*9b707622SIlya Yanok union jffs2_sum_flash 74*9b707622SIlya Yanok { 75*9b707622SIlya Yanok struct jffs2_sum_unknown_flash u; 76*9b707622SIlya Yanok struct jffs2_sum_inode_flash i; 77*9b707622SIlya Yanok struct jffs2_sum_dirent_flash d; 78*9b707622SIlya Yanok struct jffs2_sum_xattr_flash x; 79*9b707622SIlya Yanok struct jffs2_sum_xref_flash r; 80*9b707622SIlya Yanok }; 81*9b707622SIlya Yanok 82*9b707622SIlya Yanok /* Summary structures used in the memory */ 83*9b707622SIlya Yanok 84*9b707622SIlya Yanok struct jffs2_sum_unknown_mem 85*9b707622SIlya Yanok { 86*9b707622SIlya Yanok union jffs2_sum_mem *next; 87*9b707622SIlya Yanok __u16 nodetype; /* node type */ 88*9b707622SIlya Yanok }; 89*9b707622SIlya Yanok 90*9b707622SIlya Yanok struct jffs2_sum_inode_mem 91*9b707622SIlya Yanok { 92*9b707622SIlya Yanok union jffs2_sum_mem *next; 93*9b707622SIlya Yanok __u16 nodetype; /* node type */ 94*9b707622SIlya Yanok __u32 inode; /* inode number */ 95*9b707622SIlya Yanok __u32 version; /* inode version */ 96*9b707622SIlya Yanok __u32 offset; /* offset on jeb */ 97*9b707622SIlya Yanok __u32 totlen; /* record length */ 98*9b707622SIlya Yanok } __attribute__((packed)); 99*9b707622SIlya Yanok 100*9b707622SIlya Yanok struct jffs2_sum_dirent_mem 101*9b707622SIlya Yanok { 102*9b707622SIlya Yanok union jffs2_sum_mem *next; 103*9b707622SIlya Yanok __u16 nodetype; /* == JFFS_NODETYPE_DIRENT */ 104*9b707622SIlya Yanok __u32 totlen; /* record length */ 105*9b707622SIlya Yanok __u32 offset; /* ofset on jeb */ 106*9b707622SIlya Yanok __u32 pino; /* parent inode */ 107*9b707622SIlya Yanok __u32 version; /* dirent version */ 108*9b707622SIlya Yanok __u32 ino; /* == zero for unlink */ 109*9b707622SIlya Yanok uint8_t nsize; /* dirent name size */ 110*9b707622SIlya Yanok uint8_t type; /* dirent type */ 111*9b707622SIlya Yanok uint8_t name[0]; /* dirent name */ 112*9b707622SIlya Yanok } __attribute__((packed)); 113*9b707622SIlya Yanok 114*9b707622SIlya Yanok struct jffs2_sum_xattr_mem 115*9b707622SIlya Yanok { 116*9b707622SIlya Yanok union jffs2_sum_mem *next; 117*9b707622SIlya Yanok __u16 nodetype; 118*9b707622SIlya Yanok __u32 xid; 119*9b707622SIlya Yanok __u32 version; 120*9b707622SIlya Yanok __u32 offset; 121*9b707622SIlya Yanok __u32 totlen; 122*9b707622SIlya Yanok } __attribute__((packed)); 123*9b707622SIlya Yanok 124*9b707622SIlya Yanok struct jffs2_sum_xref_mem 125*9b707622SIlya Yanok { 126*9b707622SIlya Yanok union jffs2_sum_mem *next; 127*9b707622SIlya Yanok __u16 nodetype; 128*9b707622SIlya Yanok __u32 offset; 129*9b707622SIlya Yanok } __attribute__((packed)); 130*9b707622SIlya Yanok 131*9b707622SIlya Yanok union jffs2_sum_mem 132*9b707622SIlya Yanok { 133*9b707622SIlya Yanok struct jffs2_sum_unknown_mem u; 134*9b707622SIlya Yanok struct jffs2_sum_inode_mem i; 135*9b707622SIlya Yanok struct jffs2_sum_dirent_mem d; 136*9b707622SIlya Yanok struct jffs2_sum_xattr_mem x; 137*9b707622SIlya Yanok struct jffs2_sum_xref_mem r; 138*9b707622SIlya Yanok }; 139*9b707622SIlya Yanok 140*9b707622SIlya Yanok /* Summary related information stored in superblock */ 141*9b707622SIlya Yanok 142*9b707622SIlya Yanok struct jffs2_summary 143*9b707622SIlya Yanok { 144*9b707622SIlya Yanok uint32_t sum_size; /* collected summary information for nextblock */ 145*9b707622SIlya Yanok uint32_t sum_num; 146*9b707622SIlya Yanok uint32_t sum_padded; 147*9b707622SIlya Yanok union jffs2_sum_mem *sum_list_head; 148*9b707622SIlya Yanok union jffs2_sum_mem *sum_list_tail; 149*9b707622SIlya Yanok 150*9b707622SIlya Yanok __u32 *sum_buf; /* buffer for writing out summary */ 151*9b707622SIlya Yanok }; 152*9b707622SIlya Yanok 153*9b707622SIlya Yanok /* Summary marker is stored at the end of every sumarized erase block */ 154*9b707622SIlya Yanok 155*9b707622SIlya Yanok struct jffs2_sum_marker 156*9b707622SIlya Yanok { 157*9b707622SIlya Yanok __u32 offset; /* offset of the summary node in the jeb */ 158*9b707622SIlya Yanok __u32 magic; /* == JFFS2_SUM_MAGIC */ 159*9b707622SIlya Yanok }; 160*9b707622SIlya Yanok 161*9b707622SIlya Yanok #define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker)) 162*9b707622SIlya Yanok 163*9b707622SIlya Yanok #endif /* JFFS2_SUMMARY_H */ 164