]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - fs/squashfs/squashfs_fs.h
6840da1bf21e1129b6cbe9436c7937c9cb77e1b4
[linux-2.6-omap-h63xx.git] / fs / squashfs / squashfs_fs.h
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