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