diff options
author | Phillip Lougher <phillip@lougher.demon.co.uk> | 2009-01-05 03:46:27 -0500 |
---|---|---|
committer | Phillip Lougher <phillip@lougher.demon.co.uk> | 2009-01-05 03:46:27 -0500 |
commit | ffae2cd73a9e828b1a188f83c5dedce16f7c0c68 (patch) | |
tree | 06ee6584be9854200a134a221e3bbac4b075a3f5 /fs/squashfs/squashfs_fs.h | |
parent | e2780ab159ac60ef5bfc083081f44f8ff58579dc (diff) |
Squashfs: header files
Signed-off-by: Phillip Lougher <phillip@lougher.demon.co.uk>
Diffstat (limited to 'fs/squashfs/squashfs_fs.h')
-rw-r--r-- | fs/squashfs/squashfs_fs.h | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/fs/squashfs/squashfs_fs.h b/fs/squashfs/squashfs_fs.h new file mode 100644 index 000000000000..6840da1bf21e --- /dev/null +++ b/fs/squashfs/squashfs_fs.h | |||
@@ -0,0 +1,381 @@ | |||
1 | #ifndef SQUASHFS_FS | ||
2 | #define SQUASHFS_FS | ||
3 | /* | ||
4 | * Squashfs | ||
5 | * | ||
6 | * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 | ||
7 | * Phillip Lougher <phillip@lougher.demon.co.uk> | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or | ||
10 | * modify it under the terms of the GNU General Public License | ||
11 | * as published by the Free Software Foundation; either version 2, | ||
12 | * or (at your option) any later version. | ||
13 | * | ||
14 | * This program is distributed in the hope that it will be useful, | ||
15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
17 | * GNU General Public License for more details. | ||
18 | * | ||
19 | * You should have received a copy of the GNU General Public License | ||
20 | * along with this program; if not, write to the Free Software | ||
21 | * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | ||
22 | * | ||
23 | * squashfs_fs.h | ||
24 | */ | ||
25 | |||
26 | #define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE | ||
27 | #define SQUASHFS_MAJOR 4 | ||
28 | #define SQUASHFS_MINOR 0 | ||
29 | #define SQUASHFS_MAGIC 0x73717368 | ||
30 | #define SQUASHFS_START 0 | ||
31 | |||
32 | /* size of metadata (inode and directory) blocks */ | ||
33 | #define SQUASHFS_METADATA_SIZE 8192 | ||
34 | #define SQUASHFS_METADATA_LOG 13 | ||
35 | |||
36 | /* default size of data blocks */ | ||
37 | #define SQUASHFS_FILE_SIZE 131072 | ||
38 | #define SQUASHFS_FILE_LOG 17 | ||
39 | |||
40 | #define SQUASHFS_FILE_MAX_SIZE 1048576 | ||
41 | #define SQUASHFS_FILE_MAX_LOG 20 | ||
42 | |||
43 | /* Max number of uids and gids */ | ||
44 | #define SQUASHFS_IDS 65536 | ||
45 | |||
46 | /* Max length of filename (not 255) */ | ||
47 | #define SQUASHFS_NAME_LEN 256 | ||
48 | |||
49 | #define SQUASHFS_INVALID_FRAG (0xffffffffU) | ||
50 | #define SQUASHFS_INVALID_BLK (-1LL) | ||
51 | |||
52 | /* Filesystem flags */ | ||
53 | #define SQUASHFS_NOI 0 | ||
54 | #define SQUASHFS_NOD 1 | ||
55 | #define SQUASHFS_NOF 3 | ||
56 | #define SQUASHFS_NO_FRAG 4 | ||
57 | #define SQUASHFS_ALWAYS_FRAG 5 | ||
58 | #define SQUASHFS_DUPLICATE 6 | ||
59 | #define SQUASHFS_EXPORT 7 | ||
60 | |||
61 | #define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1) | ||
62 | |||
63 | #define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \ | ||
64 | SQUASHFS_NOI) | ||
65 | |||
66 | #define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \ | ||
67 | SQUASHFS_NOD) | ||
68 | |||
69 | #define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ | ||
70 | SQUASHFS_NOF) | ||
71 | |||
72 | #define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ | ||
73 | SQUASHFS_NO_FRAG) | ||
74 | |||
75 | #define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ | ||
76 | SQUASHFS_ALWAYS_FRAG) | ||
77 | |||
78 | #define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \ | ||
79 | SQUASHFS_DUPLICATE) | ||
80 | |||
81 | #define SQUASHFS_EXPORTABLE(flags) SQUASHFS_BIT(flags, \ | ||
82 | SQUASHFS_EXPORT) | ||
83 | |||
84 | /* Max number of types and file types */ | ||
85 | #define SQUASHFS_DIR_TYPE 1 | ||
86 | #define SQUASHFS_REG_TYPE 2 | ||
87 | #define SQUASHFS_SYMLINK_TYPE 3 | ||
88 | #define SQUASHFS_BLKDEV_TYPE 4 | ||
89 | #define SQUASHFS_CHRDEV_TYPE 5 | ||
90 | #define SQUASHFS_FIFO_TYPE 6 | ||
91 | #define SQUASHFS_SOCKET_TYPE 7 | ||
92 | #define SQUASHFS_LDIR_TYPE 8 | ||
93 | #define SQUASHFS_LREG_TYPE 9 | ||
94 | #define SQUASHFS_LSYMLINK_TYPE 10 | ||
95 | #define SQUASHFS_LBLKDEV_TYPE 11 | ||
96 | #define SQUASHFS_LCHRDEV_TYPE 12 | ||
97 | #define SQUASHFS_LFIFO_TYPE 13 | ||
98 | #define SQUASHFS_LSOCKET_TYPE 14 | ||
99 | |||
100 | /* Flag whether block is compressed or uncompressed, bit is set if block is | ||
101 | * uncompressed */ | ||
102 | #define SQUASHFS_COMPRESSED_BIT (1 << 15) | ||
103 | |||
104 | #define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ | ||
105 | (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) | ||
106 | |||
107 | #define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) | ||
108 | |||
109 | #define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24) | ||
110 | |||
111 | #define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) ((B) & \ | ||
112 | ~SQUASHFS_COMPRESSED_BIT_BLOCK) | ||
113 | |||
114 | #define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) | ||
115 | |||
116 | /* | ||
117 | * Inode number ops. Inodes consist of a compressed block number, and an | ||
118 | * uncompressed offset within that block | ||
119 | */ | ||
120 | #define SQUASHFS_INODE_BLK(A) ((unsigned int) ((A) >> 16)) | ||
121 | |||
122 | #define SQUASHFS_INODE_OFFSET(A) ((unsigned int) ((A) & 0xffff)) | ||
123 | |||
124 | #define SQUASHFS_MKINODE(A, B) ((long long)(((long long) (A)\ | ||
125 | << 16) + (B))) | ||
126 | |||
127 | /* Translate between VFS mode and squashfs mode */ | ||
128 | #define SQUASHFS_MODE(A) ((A) & 0xfff) | ||
129 | |||
130 | /* fragment and fragment table defines */ | ||
131 | #define SQUASHFS_FRAGMENT_BYTES(A) \ | ||
132 | ((A) * sizeof(struct squashfs_fragment_entry)) | ||
133 | |||
134 | #define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \ | ||
135 | SQUASHFS_METADATA_SIZE) | ||
136 | |||
137 | #define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \ | ||
138 | SQUASHFS_METADATA_SIZE) | ||
139 | |||
140 | #define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \ | ||
141 | SQUASHFS_METADATA_SIZE - 1) / \ | ||
142 | SQUASHFS_METADATA_SIZE) | ||
143 | |||
144 | #define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\ | ||
145 | sizeof(u64)) | ||
146 | |||
147 | /* inode lookup table defines */ | ||
148 | #define SQUASHFS_LOOKUP_BYTES(A) ((A) * sizeof(u64)) | ||
149 | |||
150 | #define SQUASHFS_LOOKUP_BLOCK(A) (SQUASHFS_LOOKUP_BYTES(A) / \ | ||
151 | SQUASHFS_METADATA_SIZE) | ||
152 | |||
153 | #define SQUASHFS_LOOKUP_BLOCK_OFFSET(A) (SQUASHFS_LOOKUP_BYTES(A) % \ | ||
154 | SQUASHFS_METADATA_SIZE) | ||
155 | |||
156 | #define SQUASHFS_LOOKUP_BLOCKS(A) ((SQUASHFS_LOOKUP_BYTES(A) + \ | ||
157 | SQUASHFS_METADATA_SIZE - 1) / \ | ||
158 | SQUASHFS_METADATA_SIZE) | ||
159 | |||
160 | #define SQUASHFS_LOOKUP_BLOCK_BYTES(A) (SQUASHFS_LOOKUP_BLOCKS(A) *\ | ||
161 | sizeof(u64)) | ||
162 | |||
163 | /* uid/gid lookup table defines */ | ||
164 | #define SQUASHFS_ID_BYTES(A) ((A) * sizeof(unsigned int)) | ||
165 | |||
166 | #define SQUASHFS_ID_BLOCK(A) (SQUASHFS_ID_BYTES(A) / \ | ||
167 | SQUASHFS_METADATA_SIZE) | ||
168 | |||
169 | #define SQUASHFS_ID_BLOCK_OFFSET(A) (SQUASHFS_ID_BYTES(A) % \ | ||
170 | SQUASHFS_METADATA_SIZE) | ||
171 | |||
172 | #define SQUASHFS_ID_BLOCKS(A) ((SQUASHFS_ID_BYTES(A) + \ | ||
173 | SQUASHFS_METADATA_SIZE - 1) / \ | ||
174 | SQUASHFS_METADATA_SIZE) | ||
175 | |||
176 | #define SQUASHFS_ID_BLOCK_BYTES(A) (SQUASHFS_ID_BLOCKS(A) *\ | ||
177 | sizeof(u64)) | ||
178 | |||
179 | /* cached data constants for filesystem */ | ||
180 | #define SQUASHFS_CACHED_BLKS 8 | ||
181 | |||
182 | #define SQUASHFS_MAX_FILE_SIZE_LOG 64 | ||
183 | |||
184 | #define SQUASHFS_MAX_FILE_SIZE (1LL << \ | ||
185 | (SQUASHFS_MAX_FILE_SIZE_LOG - 2)) | ||
186 | |||
187 | #define SQUASHFS_MARKER_BYTE 0xff | ||
188 | |||
189 | /* meta index cache */ | ||
190 | #define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int)) | ||
191 | #define SQUASHFS_META_ENTRIES 127 | ||
192 | #define SQUASHFS_META_SLOTS 8 | ||
193 | |||
194 | struct meta_entry { | ||
195 | u64 data_block; | ||
196 | unsigned int index_block; | ||
197 | unsigned short offset; | ||
198 | unsigned short pad; | ||
199 | }; | ||
200 | |||
201 | struct meta_index { | ||
202 | unsigned int inode_number; | ||
203 | unsigned int offset; | ||
204 | unsigned short entries; | ||
205 | unsigned short skip; | ||
206 | unsigned short locked; | ||
207 | unsigned short pad; | ||
208 | struct meta_entry meta_entry[SQUASHFS_META_ENTRIES]; | ||
209 | }; | ||
210 | |||
211 | |||
212 | /* | ||
213 | * definitions for structures on disk | ||
214 | */ | ||
215 | #define ZLIB_COMPRESSION 1 | ||
216 | |||
217 | struct squashfs_super_block { | ||
218 | __le32 s_magic; | ||
219 | __le32 inodes; | ||
220 | __le32 mkfs_time; | ||
221 | __le32 block_size; | ||
222 | __le32 fragments; | ||
223 | __le16 compression; | ||
224 | __le16 block_log; | ||
225 | __le16 flags; | ||
226 | __le16 no_ids; | ||
227 | __le16 s_major; | ||
228 | __le16 s_minor; | ||
229 | __le64 root_inode; | ||
230 | __le64 bytes_used; | ||
231 | __le64 id_table_start; | ||
232 | __le64 xattr_table_start; | ||
233 | __le64 inode_table_start; | ||
234 | __le64 directory_table_start; | ||
235 | __le64 fragment_table_start; | ||
236 | __le64 lookup_table_start; | ||
237 | }; | ||
238 | |||
239 | struct squashfs_dir_index { | ||
240 | __le32 index; | ||
241 | __le32 start_block; | ||
242 | __le32 size; | ||
243 | unsigned char name[0]; | ||
244 | }; | ||
245 | |||
246 | struct squashfs_base_inode { | ||
247 | __le16 inode_type; | ||
248 | __le16 mode; | ||
249 | __le16 uid; | ||
250 | __le16 guid; | ||
251 | __le32 mtime; | ||
252 | __le32 inode_number; | ||
253 | }; | ||
254 | |||
255 | struct squashfs_ipc_inode { | ||
256 | __le16 inode_type; | ||
257 | __le16 mode; | ||
258 | __le16 uid; | ||
259 | __le16 guid; | ||
260 | __le32 mtime; | ||
261 | __le32 inode_number; | ||
262 | __le32 nlink; | ||
263 | }; | ||
264 | |||
265 | struct squashfs_dev_inode { | ||
266 | __le16 inode_type; | ||
267 | __le16 mode; | ||
268 | __le16 uid; | ||
269 | __le16 guid; | ||
270 | __le32 mtime; | ||
271 | __le32 inode_number; | ||
272 | __le32 nlink; | ||
273 | __le32 rdev; | ||
274 | }; | ||
275 | |||
276 | struct squashfs_symlink_inode { | ||
277 | __le16 inode_type; | ||
278 | __le16 mode; | ||
279 | __le16 uid; | ||
280 | __le16 guid; | ||
281 | __le32 mtime; | ||
282 | __le32 inode_number; | ||
283 | __le32 nlink; | ||
284 | __le32 symlink_size; | ||
285 | char symlink[0]; | ||
286 | }; | ||
287 | |||
288 | struct squashfs_reg_inode { | ||
289 | __le16 inode_type; | ||
290 | __le16 mode; | ||
291 | __le16 uid; | ||
292 | __le16 guid; | ||
293 | __le32 mtime; | ||
294 | __le32 inode_number; | ||
295 | __le32 start_block; | ||
296 | __le32 fragment; | ||
297 | __le32 offset; | ||
298 | __le32 file_size; | ||
299 | __le16 block_list[0]; | ||
300 | }; | ||
301 | |||
302 | struct squashfs_lreg_inode { | ||
303 | __le16 inode_type; | ||
304 | __le16 mode; | ||
305 | __le16 uid; | ||
306 | __le16 guid; | ||
307 | __le32 mtime; | ||
308 | __le32 inode_number; | ||
309 | __le64 start_block; | ||
310 | __le64 file_size; | ||
311 | __le64 sparse; | ||
312 | __le32 nlink; | ||
313 | __le32 fragment; | ||
314 | __le32 offset; | ||
315 | __le32 xattr; | ||
316 | __le16 block_list[0]; | ||
317 | }; | ||
318 | |||
319 | struct squashfs_dir_inode { | ||
320 | __le16 inode_type; | ||
321 | __le16 mode; | ||
322 | __le16 uid; | ||
323 | __le16 guid; | ||
324 | __le32 mtime; | ||
325 | __le32 inode_number; | ||
326 | __le32 start_block; | ||
327 | __le32 nlink; | ||
328 | __le16 file_size; | ||
329 | __le16 offset; | ||
330 | __le32 parent_inode; | ||
331 | }; | ||
332 | |||
333 | struct squashfs_ldir_inode { | ||
334 | __le16 inode_type; | ||
335 | __le16 mode; | ||
336 | __le16 uid; | ||
337 | __le16 guid; | ||
338 | __le32 mtime; | ||
339 | __le32 inode_number; | ||
340 | __le32 nlink; | ||
341 | __le32 file_size; | ||
342 | __le32 start_block; | ||
343 | __le32 parent_inode; | ||
344 | __le16 i_count; | ||
345 | __le16 offset; | ||
346 | __le32 xattr; | ||
347 | struct squashfs_dir_index index[0]; | ||
348 | }; | ||
349 | |||
350 | union squashfs_inode { | ||
351 | struct squashfs_base_inode base; | ||
352 | struct squashfs_dev_inode dev; | ||
353 | struct squashfs_symlink_inode symlink; | ||
354 | struct squashfs_reg_inode reg; | ||
355 | struct squashfs_lreg_inode lreg; | ||
356 | struct squashfs_dir_inode dir; | ||
357 | struct squashfs_ldir_inode ldir; | ||
358 | struct squashfs_ipc_inode ipc; | ||
359 | }; | ||
360 | |||
361 | struct squashfs_dir_entry { | ||
362 | __le16 offset; | ||
363 | __le16 inode_number; | ||
364 | __le16 type; | ||
365 | __le16 size; | ||
366 | char name[0]; | ||
367 | }; | ||
368 | |||
369 | struct squashfs_dir_header { | ||
370 | __le32 count; | ||
371 | __le32 start_block; | ||
372 | __le32 inode_number; | ||
373 | }; | ||
374 | |||
375 | struct squashfs_fragment_entry { | ||
376 | __le64 start_block; | ||
377 | __le32 size; | ||
378 | unsigned int unused; | ||
379 | }; | ||
380 | |||
381 | #endif | ||