162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * JFFS2 -- Journalling Flash File System, Version 2. 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, 562306a36Sopenharmony_ci * Zoltan Sogor <weth@inf.u-szeged.hu>, 662306a36Sopenharmony_ci * Patrik Kluba <pajko@halom.u-szeged.hu>, 762306a36Sopenharmony_ci * University of Szeged, Hungary 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * For licensing information, see the file 'LICENCE' in this directory. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifndef JFFS2_SUMMARY_H 1462306a36Sopenharmony_ci#define JFFS2_SUMMARY_H 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Limit summary size to 64KiB so that we can kmalloc it. If the summary 1762306a36Sopenharmony_ci is larger than that, we have to just ditch it and avoid using summary 1862306a36Sopenharmony_ci for the eraseblock in question... and it probably doesn't hurt us much 1962306a36Sopenharmony_ci anyway. */ 2062306a36Sopenharmony_ci#define MAX_SUMMARY_SIZE 65536 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <linux/uio.h> 2362306a36Sopenharmony_ci#include <linux/jffs2.h> 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define BLK_STATE_ALLFF 0 2662306a36Sopenharmony_ci#define BLK_STATE_CLEAN 1 2762306a36Sopenharmony_ci#define BLK_STATE_PARTDIRTY 2 2862306a36Sopenharmony_ci#define BLK_STATE_CLEANMARKER 3 2962306a36Sopenharmony_ci#define BLK_STATE_ALLDIRTY 4 3062306a36Sopenharmony_ci#define BLK_STATE_BADBLOCK 5 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#define JFFS2_SUMMARY_NOSUM_SIZE 0xffffffff 3362306a36Sopenharmony_ci#define JFFS2_SUMMARY_INODE_SIZE (sizeof(struct jffs2_sum_inode_flash)) 3462306a36Sopenharmony_ci#define JFFS2_SUMMARY_DIRENT_SIZE(x) (sizeof(struct jffs2_sum_dirent_flash) + (x)) 3562306a36Sopenharmony_ci#define JFFS2_SUMMARY_XATTR_SIZE (sizeof(struct jffs2_sum_xattr_flash)) 3662306a36Sopenharmony_ci#define JFFS2_SUMMARY_XREF_SIZE (sizeof(struct jffs2_sum_xref_flash)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci/* Summary structures used on flash */ 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct jffs2_sum_unknown_flash 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci jint16_t nodetype; /* node type */ 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cistruct jffs2_sum_inode_flash 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci jint16_t nodetype; /* node type */ 4862306a36Sopenharmony_ci jint32_t inode; /* inode number */ 4962306a36Sopenharmony_ci jint32_t version; /* inode version */ 5062306a36Sopenharmony_ci jint32_t offset; /* offset on jeb */ 5162306a36Sopenharmony_ci jint32_t totlen; /* record length */ 5262306a36Sopenharmony_ci} __attribute__((packed)); 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct jffs2_sum_dirent_flash 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci jint16_t nodetype; /* == JFFS_NODETYPE_DIRENT */ 5762306a36Sopenharmony_ci jint32_t totlen; /* record length */ 5862306a36Sopenharmony_ci jint32_t offset; /* offset on jeb */ 5962306a36Sopenharmony_ci jint32_t pino; /* parent inode */ 6062306a36Sopenharmony_ci jint32_t version; /* dirent version */ 6162306a36Sopenharmony_ci jint32_t ino; /* == zero for unlink */ 6262306a36Sopenharmony_ci uint8_t nsize; /* dirent name size */ 6362306a36Sopenharmony_ci uint8_t type; /* dirent type */ 6462306a36Sopenharmony_ci uint8_t name[]; /* dirent name */ 6562306a36Sopenharmony_ci} __attribute__((packed)); 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistruct jffs2_sum_xattr_flash 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci jint16_t nodetype; /* == JFFS2_NODETYPE_XATR */ 7062306a36Sopenharmony_ci jint32_t xid; /* xattr identifier */ 7162306a36Sopenharmony_ci jint32_t version; /* version number */ 7262306a36Sopenharmony_ci jint32_t offset; /* offset on jeb */ 7362306a36Sopenharmony_ci jint32_t totlen; /* node length */ 7462306a36Sopenharmony_ci} __attribute__((packed)); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistruct jffs2_sum_xref_flash 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci jint16_t nodetype; /* == JFFS2_NODETYPE_XREF */ 7962306a36Sopenharmony_ci jint32_t offset; /* offset on jeb */ 8062306a36Sopenharmony_ci} __attribute__((packed)); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ciunion jffs2_sum_flash 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci struct jffs2_sum_unknown_flash u; 8562306a36Sopenharmony_ci struct jffs2_sum_inode_flash i; 8662306a36Sopenharmony_ci struct jffs2_sum_dirent_flash d; 8762306a36Sopenharmony_ci struct jffs2_sum_xattr_flash x; 8862306a36Sopenharmony_ci struct jffs2_sum_xref_flash r; 8962306a36Sopenharmony_ci}; 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* Summary structures used in the memory */ 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistruct jffs2_sum_unknown_mem 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci union jffs2_sum_mem *next; 9662306a36Sopenharmony_ci jint16_t nodetype; /* node type */ 9762306a36Sopenharmony_ci}; 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_cistruct jffs2_sum_inode_mem 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci union jffs2_sum_mem *next; 10262306a36Sopenharmony_ci jint16_t nodetype; /* node type */ 10362306a36Sopenharmony_ci jint32_t inode; /* inode number */ 10462306a36Sopenharmony_ci jint32_t version; /* inode version */ 10562306a36Sopenharmony_ci jint32_t offset; /* offset on jeb */ 10662306a36Sopenharmony_ci jint32_t totlen; /* record length */ 10762306a36Sopenharmony_ci} __attribute__((packed)); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistruct jffs2_sum_dirent_mem 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci union jffs2_sum_mem *next; 11262306a36Sopenharmony_ci jint16_t nodetype; /* == JFFS_NODETYPE_DIRENT */ 11362306a36Sopenharmony_ci jint32_t totlen; /* record length */ 11462306a36Sopenharmony_ci jint32_t offset; /* ofset on jeb */ 11562306a36Sopenharmony_ci jint32_t pino; /* parent inode */ 11662306a36Sopenharmony_ci jint32_t version; /* dirent version */ 11762306a36Sopenharmony_ci jint32_t ino; /* == zero for unlink */ 11862306a36Sopenharmony_ci uint8_t nsize; /* dirent name size */ 11962306a36Sopenharmony_ci uint8_t type; /* dirent type */ 12062306a36Sopenharmony_ci uint8_t name[]; /* dirent name */ 12162306a36Sopenharmony_ci} __attribute__((packed)); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistruct jffs2_sum_xattr_mem 12462306a36Sopenharmony_ci{ 12562306a36Sopenharmony_ci union jffs2_sum_mem *next; 12662306a36Sopenharmony_ci jint16_t nodetype; 12762306a36Sopenharmony_ci jint32_t xid; 12862306a36Sopenharmony_ci jint32_t version; 12962306a36Sopenharmony_ci jint32_t offset; 13062306a36Sopenharmony_ci jint32_t totlen; 13162306a36Sopenharmony_ci} __attribute__((packed)); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_cistruct jffs2_sum_xref_mem 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci union jffs2_sum_mem *next; 13662306a36Sopenharmony_ci jint16_t nodetype; 13762306a36Sopenharmony_ci jint32_t offset; 13862306a36Sopenharmony_ci} __attribute__((packed)); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ciunion jffs2_sum_mem 14162306a36Sopenharmony_ci{ 14262306a36Sopenharmony_ci struct jffs2_sum_unknown_mem u; 14362306a36Sopenharmony_ci struct jffs2_sum_inode_mem i; 14462306a36Sopenharmony_ci struct jffs2_sum_dirent_mem d; 14562306a36Sopenharmony_ci struct jffs2_sum_xattr_mem x; 14662306a36Sopenharmony_ci struct jffs2_sum_xref_mem r; 14762306a36Sopenharmony_ci}; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci/* Summary related information stored in superblock */ 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistruct jffs2_summary 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci uint32_t sum_size; /* collected summary information for nextblock */ 15462306a36Sopenharmony_ci uint32_t sum_num; 15562306a36Sopenharmony_ci uint32_t sum_padded; 15662306a36Sopenharmony_ci union jffs2_sum_mem *sum_list_head; 15762306a36Sopenharmony_ci union jffs2_sum_mem *sum_list_tail; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci jint32_t *sum_buf; /* buffer for writing out summary */ 16062306a36Sopenharmony_ci}; 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci/* Summary marker is stored at the end of every sumarized erase block */ 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistruct jffs2_sum_marker 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci jint32_t offset; /* offset of the summary node in the jeb */ 16762306a36Sopenharmony_ci jint32_t magic; /* == JFFS2_SUM_MAGIC */ 16862306a36Sopenharmony_ci}; 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci#define JFFS2_SUMMARY_FRAME_SIZE (sizeof(struct jffs2_raw_summary) + sizeof(struct jffs2_sum_marker)) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci#ifdef CONFIG_JFFS2_SUMMARY /* SUMMARY SUPPORT ENABLED */ 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci#define jffs2_sum_active() (1) 17562306a36Sopenharmony_ciint jffs2_sum_init(struct jffs2_sb_info *c); 17662306a36Sopenharmony_civoid jffs2_sum_exit(struct jffs2_sb_info *c); 17762306a36Sopenharmony_civoid jffs2_sum_disable_collecting(struct jffs2_summary *s); 17862306a36Sopenharmony_ciint jffs2_sum_is_disabled(struct jffs2_summary *s); 17962306a36Sopenharmony_civoid jffs2_sum_reset_collected(struct jffs2_summary *s); 18062306a36Sopenharmony_civoid jffs2_sum_move_collected(struct jffs2_sb_info *c, struct jffs2_summary *s); 18162306a36Sopenharmony_ciint jffs2_sum_add_kvec(struct jffs2_sb_info *c, const struct kvec *invecs, 18262306a36Sopenharmony_ci unsigned long count, uint32_t to); 18362306a36Sopenharmony_ciint jffs2_sum_write_sumnode(struct jffs2_sb_info *c); 18462306a36Sopenharmony_ciint jffs2_sum_add_padding_mem(struct jffs2_summary *s, uint32_t size); 18562306a36Sopenharmony_ciint jffs2_sum_add_inode_mem(struct jffs2_summary *s, struct jffs2_raw_inode *ri, uint32_t ofs); 18662306a36Sopenharmony_ciint jffs2_sum_add_dirent_mem(struct jffs2_summary *s, struct jffs2_raw_dirent *rd, uint32_t ofs); 18762306a36Sopenharmony_ciint jffs2_sum_add_xattr_mem(struct jffs2_summary *s, struct jffs2_raw_xattr *rx, uint32_t ofs); 18862306a36Sopenharmony_ciint jffs2_sum_add_xref_mem(struct jffs2_summary *s, struct jffs2_raw_xref *rr, uint32_t ofs); 18962306a36Sopenharmony_ciint jffs2_sum_scan_sumnode(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb, 19062306a36Sopenharmony_ci struct jffs2_raw_summary *summary, uint32_t sumlen, 19162306a36Sopenharmony_ci uint32_t *pseudo_random); 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci#else /* SUMMARY DISABLED */ 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci#define jffs2_sum_active() (0) 19662306a36Sopenharmony_ci#define jffs2_sum_init(a) (0) 19762306a36Sopenharmony_ci#define jffs2_sum_exit(a) do { } while (0) 19862306a36Sopenharmony_ci#define jffs2_sum_disable_collecting(a) 19962306a36Sopenharmony_ci#define jffs2_sum_is_disabled(a) (0) 20062306a36Sopenharmony_ci#define jffs2_sum_reset_collected(a) do { } while (0) 20162306a36Sopenharmony_ci#define jffs2_sum_add_kvec(a,b,c,d) (0) 20262306a36Sopenharmony_ci#define jffs2_sum_move_collected(a,b) do { } while (0) 20362306a36Sopenharmony_ci#define jffs2_sum_write_sumnode(a) (0) 20462306a36Sopenharmony_ci#define jffs2_sum_add_padding_mem(a,b) do { } while (0) 20562306a36Sopenharmony_ci#define jffs2_sum_add_inode_mem(a,b,c) do { } while (0) 20662306a36Sopenharmony_ci#define jffs2_sum_add_dirent_mem(a,b,c) do { } while (0) 20762306a36Sopenharmony_ci#define jffs2_sum_add_xattr_mem(a,b,c) do { } while (0) 20862306a36Sopenharmony_ci#define jffs2_sum_add_xref_mem(a,b,c) do { } while (0) 20962306a36Sopenharmony_ci#define jffs2_sum_scan_sumnode(a,b,c,d,e) (0) 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci#endif /* CONFIG_JFFS2_SUMMARY */ 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#endif /* JFFS2_SUMMARY_H */ 214