]>
Commit | Line | Data |
---|---|---|
932394ac WD |
1 | #ifndef jffs2_private_h |
2 | #define jffs2_private_h | |
3 | ||
4 | #include <jffs2/jffs2.h> | |
5 | ||
6 | struct b_node { | |
7 | struct b_node *next; | |
8 | }; | |
9 | ||
10 | struct b_inode { | |
11 | struct b_inode *next; | |
12 | u32 offset; /* physical offset to beginning of real inode */ | |
13 | u32 version; | |
14 | u32 ino; | |
15 | u32 isize; | |
16 | u32 csize; | |
17 | }; | |
18 | ||
19 | struct b_dirent { | |
20 | struct b_dirent *next; | |
21 | u32 offset; /* physical offset to beginning of real dirent */ | |
22 | u32 version; | |
23 | u32 pino; | |
24 | u32 ino; | |
25 | unsigned int nhash; | |
26 | unsigned char nsize; | |
27 | unsigned char type; | |
28 | }; | |
29 | ||
30 | struct b_list { | |
31 | struct b_node *listTail; | |
32 | struct b_node *listHead; | |
33 | unsigned int listCount; | |
34 | struct mem_block *listMemBase; | |
35 | }; | |
36 | ||
37 | struct b_lists { | |
38 | char *partOffset; | |
39 | struct b_list dir; | |
40 | struct b_list frag; | |
41 | }; | |
42 | ||
43 | struct b_compr_info { | |
44 | u32 num_frags; | |
45 | u32 compr_sum; | |
46 | u32 decompr_sum; | |
47 | }; | |
48 | ||
49 | struct b_jffs2_info { | |
50 | struct b_compr_info compr_info[JFFS2_NUM_COMPR]; | |
51 | }; | |
52 | ||
53 | static inline int | |
54 | hdr_crc(struct jffs2_unknown_node *node) | |
55 | { | |
56 | #if 1 | |
57 | u32 crc = crc32_no_comp(0, (unsigned char *)node, sizeof(struct jffs2_unknown_node) - 4); | |
58 | #else | |
59 | /* what's the semantics of this? why is this here? */ | |
60 | u32 crc = crc32_no_comp(~0, (unsigned char *)node, sizeof(struct jffs2_unknown_node) - 4); | |
61 | ||
62 | crc ^= ~0; | |
63 | #endif | |
64 | if (node->hdr_crc != crc) { | |
65 | return 0; | |
66 | } else { | |
67 | return 1; | |
68 | } | |
69 | } | |
70 | ||
71 | static inline int | |
72 | dirent_crc(struct jffs2_raw_dirent *node) | |
73 | { | |
74 | if (node->node_crc != crc32_no_comp(0, (unsigned char *)node, sizeof(struct jffs2_raw_dirent) - 8)) { | |
75 | return 0; | |
76 | } else { | |
77 | return 1; | |
78 | } | |
79 | } | |
80 | ||
81 | static inline int | |
82 | dirent_name_crc(struct jffs2_raw_dirent *node) | |
83 | { | |
84 | if (node->name_crc != crc32_no_comp(0, (unsigned char *)&(node->name), node->nsize)) { | |
85 | return 0; | |
86 | } else { | |
87 | return 1; | |
88 | } | |
89 | } | |
90 | ||
91 | static inline int | |
92 | inode_crc(struct jffs2_raw_inode *node) | |
93 | { | |
94 | if (node->node_crc != crc32_no_comp(0, (unsigned char *)node, sizeof(struct jffs2_raw_inode) - 8)) { | |
95 | return 0; | |
96 | } else { | |
97 | return 1; | |
98 | } | |
99 | } | |
100 | ||
101 | /* Borrowed from include/linux/dcache.h */ | |
102 | ||
103 | /* Name hashing routines. Initial hash value */ | |
104 | /* Hash courtesy of the R5 hash in reiserfs modulo sign bits */ | |
105 | #define init_name_hash() 0 | |
106 | ||
107 | /* partial hash update function. Assume roughly 4 bits per character */ | |
108 | static inline unsigned long | |
109 | partial_name_hash(unsigned long c, unsigned long prevhash) | |
110 | { | |
111 | return (prevhash + (c << 4) + (c >> 4)) * 11; | |
112 | } | |
113 | ||
114 | /* | |
115 | * Finally: cut down the number of bits to a int value (and try to avoid | |
116 | * losing bits) | |
117 | */ | |
118 | static inline unsigned long end_name_hash(unsigned long hash) | |
119 | { | |
120 | return (unsigned int) hash; | |
121 | } | |
122 | ||
123 | /* Compute the hash for a name string. */ | |
124 | static inline unsigned int | |
125 | full_name_hash(const unsigned char *name, unsigned int len) | |
126 | { | |
127 | unsigned long hash = init_name_hash(); | |
128 | while (len--) | |
129 | hash = partial_name_hash(*name++, hash); | |
130 | return end_name_hash(hash); | |
131 | } | |
132 | ||
133 | #endif /* jffs2_private.h */ |