11f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#ifndef SQUASHFS_FS
21f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FS
31f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/*
41f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * Squashfs
51f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher *
65bffb42fa28e42301240eb3b41890bf60ac97966plougher * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
7f6cd337f8de328e2b448b9f29c00d9132748f7feplougher * Phillip Lougher <phillip@lougher.demon.co.uk>
81f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher *
91f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * This program is free software; you can redistribute it and/or
101f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * modify it under the terms of the GNU General Public License
111f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * as published by the Free Software Foundation; either version 2,
121f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * or (at your option) any later version.
131f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher *
141f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * This program is distributed in the hope that it will be useful,
151f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * but WITHOUT ANY WARRANTY; without even the implied warranty of
161f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
171f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * GNU General Public License for more details.
181f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher *
191f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * You should have received a copy of the GNU General Public License
201f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * along with this program; if not, write to the Free Software
21a3e28ecaf227d2c03ec6724dd718e3c5a12b74efplougher * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
221f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher *
231f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * squashfs_fs.h
241f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher */
251f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
2669fd8a885cc67e2ee05d167b670afb1ae5a26568plougher#define SQUASHFS_CACHED_FRAGMENTS	CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
271b899fc316f7eba7a31da12dc0c9b69ada441059plougher#define SQUASHFS_MAJOR			4
281b899fc316f7eba7a31da12dc0c9b69ada441059plougher#define SQUASHFS_MINOR			0
291f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_MAGIC			0x73717368
301f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_START			0
311f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
321f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* size of metadata (inode and directory) blocks */
331f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_METADATA_SIZE		8192
341f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_METADATA_LOG		13
351f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
361f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* default size of data blocks */
370544edfef22ccc79dcffd75db37e2cb210116fd4plougher#define SQUASHFS_FILE_SIZE		131072
380544edfef22ccc79dcffd75db37e2cb210116fd4plougher#define SQUASHFS_FILE_LOG		17
391f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
400544edfef22ccc79dcffd75db37e2cb210116fd4plougher#define SQUASHFS_FILE_MAX_SIZE		1048576
411f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
421f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Max number of uids and gids */
431b899fc316f7eba7a31da12dc0c9b69ada441059plougher#define SQUASHFS_IDS			65536
441f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
451f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Max length of filename (not 255) */
461f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NAME_LEN		256
471f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
48d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_INVALID_FRAG		(0xffffffffU)
49d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_INVALID_BLK		(-1LL)
501f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
511f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Filesystem flags */
521f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NOI			0
531f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NOD			1
541f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NOF			3
551f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NO_FRAG		4
561f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_ALWAYS_FRAG		5
571f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_DUPLICATE		6
5829e5f570cf51b2f15079a81aec8cf1595f3082cfplougher#define SQUASHFS_EXPORT			7
591f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
601f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_BIT(flag, bit)		((flag >> bit) & 1)
611f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
621f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_UNCOMPRESSED_INODES(flags)	SQUASHFS_BIT(flags, \
631f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_NOI)
641f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
651f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_UNCOMPRESSED_DATA(flags)	SQUASHFS_BIT(flags, \
661f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_NOD)
671f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
681f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags)	SQUASHFS_BIT(flags, \
691f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_NOF)
701f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
711f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_NO_FRAGMENTS(flags)		SQUASHFS_BIT(flags, \
721f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_NO_FRAG)
731f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
741f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_ALWAYS_FRAGMENTS(flags)	SQUASHFS_BIT(flags, \
751f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_ALWAYS_FRAG)
761f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
771f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_DUPLICATES(flags)		SQUASHFS_BIT(flags, \
781f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_DUPLICATE)
791f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
8029e5f570cf51b2f15079a81aec8cf1595f3082cfplougher#define SQUASHFS_EXPORTABLE(flags)		SQUASHFS_BIT(flags, \
8129e5f570cf51b2f15079a81aec8cf1595f3082cfplougher						SQUASHFS_EXPORT)
8229e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
831f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Max number of types and file types */
841f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_DIR_TYPE		1
85183b4ee6320030ce1bd8980757c42071779973bcplougher#define SQUASHFS_REG_TYPE		2
861f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_SYMLINK_TYPE		3
871f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_BLKDEV_TYPE		4
881f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_CHRDEV_TYPE		5
891f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FIFO_TYPE		6
901f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_SOCKET_TYPE		7
911f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_LDIR_TYPE		8
921f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_LREG_TYPE		9
939fca346e286002f3e0db6201923b538a740c78b4plougher#define SQUASHFS_LSYMLINK_TYPE		10
949fca346e286002f3e0db6201923b538a740c78b4plougher#define SQUASHFS_LBLKDEV_TYPE		11
959fca346e286002f3e0db6201923b538a740c78b4plougher#define SQUASHFS_LCHRDEV_TYPE		12
969fca346e286002f3e0db6201923b538a740c78b4plougher#define SQUASHFS_LFIFO_TYPE		13
979fca346e286002f3e0db6201923b538a740c78b4plougher#define SQUASHFS_LSOCKET_TYPE		14
981f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
991f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Flag whether block is compressed or uncompressed, bit is set if block is
1001f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * uncompressed */
1011f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_COMPRESSED_BIT		(1 << 15)
1021f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1031f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_COMPRESSED_SIZE(B)	(((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
1041f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher		(B) & ~SQUASHFS_COMPRESSED_BIT :  SQUASHFS_COMPRESSED_BIT)
1051f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1061f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_COMPRESSED(B)		(!((B) & SQUASHFS_COMPRESSED_BIT))
1071f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
108795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_COMPRESSED_BIT_BLOCK	(1 << 24)
1091f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
110f03d02e0d5c5f7d97d63adc665dd9f524e134c23plougher#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B)	((B) & \
111795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher						~SQUASHFS_COMPRESSED_BIT_BLOCK)
1121f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1131f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_COMPRESSED_BLOCK(B)	(!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
1141f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1151f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/*
1161f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * Inode number ops.  Inodes consist of a compressed block number, and an
117d09b5897842f39b572ea50049234b75a7c2cf36dplougher * uncompressed offset within that block
1181f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher */
119d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_INODE_BLK(A)		((unsigned int) ((A) >> 16))
1201f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
121d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_INODE_OFFSET(A)	((unsigned int) ((A) & 0xffff))
1221f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
123795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_MKINODE(A, B)		((long long)(((long long) (A)\
124795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher					<< 16) + (B)))
1251f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1261f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* Translate between VFS mode and squashfs mode */
127d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_MODE(A)		((A) & 0xfff)
1281f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1291f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* fragment and fragment table defines */
130d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_FRAGMENT_BYTES(A)	\
131d09b5897842f39b572ea50049234b75a7c2cf36dplougher				((A) * sizeof(struct squashfs_fragment_entry))
1321f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1331f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FRAGMENT_INDEX(A)	(SQUASHFS_FRAGMENT_BYTES(A) / \
1341f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher					SQUASHFS_METADATA_SIZE)
1351f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1361f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A)	(SQUASHFS_FRAGMENT_BYTES(A) % \
1371f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						SQUASHFS_METADATA_SIZE)
1381f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1391f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FRAGMENT_INDEXES(A)	((SQUASHFS_FRAGMENT_BYTES(A) + \
1401f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher					SQUASHFS_METADATA_SIZE - 1) / \
1411f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher					SQUASHFS_METADATA_SIZE)
1421f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1431f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_FRAGMENT_INDEX_BYTES(A)	(SQUASHFS_FRAGMENT_INDEXES(A) *\
1441f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher						sizeof(long long))
1451f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
14629e5f570cf51b2f15079a81aec8cf1595f3082cfplougher/* inode lookup table defines */
14769fd8a885cc67e2ee05d167b670afb1ae5a26568plougher#define SQUASHFS_LOOKUP_BYTES(A)	((A) * sizeof(long long))
14829e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
149795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_LOOKUP_BLOCK(A)	(SQUASHFS_LOOKUP_BYTES(A) / \
150795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher					SQUASHFS_METADATA_SIZE)
15129e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
152795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_LOOKUP_BLOCK_OFFSET(A)	(SQUASHFS_LOOKUP_BYTES(A) % \
153795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher					SQUASHFS_METADATA_SIZE)
15429e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
15529e5f570cf51b2f15079a81aec8cf1595f3082cfplougher#define SQUASHFS_LOOKUP_BLOCKS(A)	((SQUASHFS_LOOKUP_BYTES(A) + \
15629e5f570cf51b2f15079a81aec8cf1595f3082cfplougher					SQUASHFS_METADATA_SIZE - 1) / \
15729e5f570cf51b2f15079a81aec8cf1595f3082cfplougher					SQUASHFS_METADATA_SIZE)
15829e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
15929e5f570cf51b2f15079a81aec8cf1595f3082cfplougher#define SQUASHFS_LOOKUP_BLOCK_BYTES(A)	(SQUASHFS_LOOKUP_BLOCKS(A) *\
16029e5f570cf51b2f15079a81aec8cf1595f3082cfplougher					sizeof(long long))
16129e5f570cf51b2f15079a81aec8cf1595f3082cfplougher
162d09b5897842f39b572ea50049234b75a7c2cf36dplougher/* uid/gid lookup table defines */
163795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_ID_BYTES(A)		((A) * sizeof(unsigned int))
1641b899fc316f7eba7a31da12dc0c9b69ada441059plougher
1651b899fc316f7eba7a31da12dc0c9b69ada441059plougher#define SQUASHFS_ID_BLOCK(A)		(SQUASHFS_ID_BYTES(A) / \
166795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher					SQUASHFS_METADATA_SIZE)
1671b899fc316f7eba7a31da12dc0c9b69ada441059plougher
168795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_ID_BLOCK_OFFSET(A)	(SQUASHFS_ID_BYTES(A) % \
169795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher					SQUASHFS_METADATA_SIZE)
1701b899fc316f7eba7a31da12dc0c9b69ada441059plougher
171795ad5f4e3b20918fd8bbd30033e35a96cc1d13fplougher#define SQUASHFS_ID_BLOCKS(A)		((SQUASHFS_ID_BYTES(A) + \
1721b899fc316f7eba7a31da12dc0c9b69ada441059plougher					SQUASHFS_METADATA_SIZE - 1) / \
1731b899fc316f7eba7a31da12dc0c9b69ada441059plougher					SQUASHFS_METADATA_SIZE)
1741b899fc316f7eba7a31da12dc0c9b69ada441059plougher
1751b899fc316f7eba7a31da12dc0c9b69ada441059plougher#define SQUASHFS_ID_BLOCK_BYTES(A)	(SQUASHFS_ID_BLOCKS(A) *\
1761b899fc316f7eba7a31da12dc0c9b69ada441059plougher					sizeof(long long))
1771b899fc316f7eba7a31da12dc0c9b69ada441059plougher
1781f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/* cached data constants for filesystem */
1791f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_CACHED_BLKS		8
1801f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1811f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_MAX_FILE_SIZE_LOG	64
1821f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
183d09b5897842f39b572ea50049234b75a7c2cf36dplougher#define SQUASHFS_MAX_FILE_SIZE		(1LL << \
1841f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher					(SQUASHFS_MAX_FILE_SIZE_LOG - 2))
1851f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
1861f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#define SQUASHFS_MARKER_BYTE		0xff
1871f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
188f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher/* meta index cache */
189f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher#define SQUASHFS_META_INDEXES	(SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
19085b08772b0e6923ed3f3764685675fc8fcbaf645plougher#define SQUASHFS_META_ENTRIES	127
19185b08772b0e6923ed3f3764685675fc8fcbaf645plougher#define SQUASHFS_META_SLOTS	8
192f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher
193f9c72b137336d5c1d4bdf2792f2bc5142713676bplougherstruct meta_entry {
194f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	long long		data_block;
195f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned int		index_block;
196f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		offset;
197f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		pad;
198f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher};
199f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher
200f9c72b137336d5c1d4bdf2792f2bc5142713676bplougherstruct meta_index {
201f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned int		inode_number;
202f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned int		offset;
203f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		entries;
204f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		skip;
205f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		locked;
206f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	unsigned short		pad;
207f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher	struct meta_entry	meta_entry[SQUASHFS_META_ENTRIES];
208f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher};
209f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher
210f9c72b137336d5c1d4bdf2792f2bc5142713676bplougher
2111f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher/*
2121f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher * definitions for structures on disk
2131f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher */
21437f71a72d096b8ee99bdf1923330277b0ff6f1e2plougher#define ZLIB_COMPRESSION	 1
2151b899fc316f7eba7a31da12dc0c9b69ada441059plougher
2161f413c84d736495fd61ff05ebe52c3a01a4d95c2plougherstruct squashfs_super_block {
217703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le32			s_magic;
218703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le32			inodes;
219d09b5897842f39b572ea50049234b75a7c2cf36dplougher	__le32			mkfs_time;
220703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le32			block_size;
221703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le32			fragments;
222703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			compression;
223703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			block_log;
224703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			flags;
225703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			no_ids;
226703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			s_major;
227703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le16			s_minor;
228703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			root_inode;
229703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			bytes_used;
230703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			id_table_start;
231703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			xattr_table_start;
232703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			inode_table_start;
233703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			directory_table_start;
234703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			fragment_table_start;
235703840aef7b3a48bef2ba561bb87894e97a8fa30plougher	__le64			lookup_table_start;
2361b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
2371f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
2381f413c84d736495fd61ff05ebe52c3a01a4d95c2plougherstruct squashfs_dir_index {
239c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			index;
240c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			start_block;
241c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			size;
2421f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher	unsigned char		name[0];
2431b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
2441f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
245ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_base_inode {
246ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
247ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
248ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
249ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
250ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
2516bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32	 		inode_number;
2521b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
2531f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
254ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_ipc_inode {
255ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
256ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
257ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
258ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
259ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
260ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
2616bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
2621b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
2631f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
264ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_dev_inode {
265ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
266ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
267ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
268ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
269ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
270ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
2716bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
2726bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			rdev;
2731b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
27469fd8a885cc67e2ee05d167b670afb1ae5a26568plougher
275ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_symlink_inode {
276ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
277ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
278ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
279ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
280ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
281ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
2826bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
2836bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			symlink_size;
2841f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher	char			symlink[0];
2851b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
2861f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
287ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_reg_inode {
288ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
289ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
290ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
291ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
292ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
293ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
2946bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			start_block;
2956bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			fragment;
2966bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			offset;
2976bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			file_size;
2986bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			block_list[0];
2991b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3001f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
301ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_lreg_inode {
302ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
303ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
304ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
305ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
306ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
307ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
3086bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le64			start_block;
3096bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le64			file_size;
3106bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le64			sparse;
3116bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
3126bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			fragment;
3136bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			offset;
3146bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			xattr;
3156bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			block_list[0];
3161b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3171f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
318ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_dir_inode {
319ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
320ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
321ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
322ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
323ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
324ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
3256bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			start_block;
3266bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
3276bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			file_size;
3286bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			offset;
3296bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			parent_inode;
3301b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3311f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
332ffd6024da956882433848ccf368da76116fa9241plougherstruct squashfs_ldir_inode {
333ffd6024da956882433848ccf368da76116fa9241plougher	__le16			inode_type;
334ffd6024da956882433848ccf368da76116fa9241plougher	__le16			mode;
335ffd6024da956882433848ccf368da76116fa9241plougher	__le16			uid;
336ffd6024da956882433848ccf368da76116fa9241plougher	__le16			guid;
337ffd6024da956882433848ccf368da76116fa9241plougher	__le32			mtime;
338ffd6024da956882433848ccf368da76116fa9241plougher	__le32	 		inode_number;
3396bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			nlink;
3406bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			file_size;
3416bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			start_block;
3426bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le32			parent_inode;
3436bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			i_count;
3446bd2c4382316ecdcd918ce7499bccb03b5303db3plougher	__le16			offset;
3459fca346e286002f3e0db6201923b538a740c78b4plougher	__le32			xattr;
3461f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher	struct squashfs_dir_index	index[0];
3471b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3481f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
349ffd6024da956882433848ccf368da76116fa9241plougherunion squashfs_inode {
350ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_base_inode		base;
351ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_dev_inode		dev;
352ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_symlink_inode		symlink;
353ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_reg_inode		reg;
354ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_lreg_inode		lreg;
355ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_dir_inode		dir;
356ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_ldir_inode		ldir;
357ffd6024da956882433848ccf368da76116fa9241plougher	struct squashfs_ipc_inode		ipc;
3581f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher};
35969fd8a885cc67e2ee05d167b670afb1ae5a26568plougher
3601f413c84d736495fd61ff05ebe52c3a01a4d95c2plougherstruct squashfs_dir_entry {
361c481f34ba50d3826970100da1cea4885656e7235plougher	__le16			offset;
362c481f34ba50d3826970100da1cea4885656e7235plougher	__le16			inode_number;
363c481f34ba50d3826970100da1cea4885656e7235plougher	__le16			type;
364c481f34ba50d3826970100da1cea4885656e7235plougher	__le16			size;
3651f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher	char			name[0];
3661b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3671f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
3681f413c84d736495fd61ff05ebe52c3a01a4d95c2plougherstruct squashfs_dir_header {
369c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			count;
370c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			start_block;
371c481f34ba50d3826970100da1cea4885656e7235plougher	__le32			inode_number;
3721b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3731f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
3741f413c84d736495fd61ff05ebe52c3a01a4d95c2plougherstruct squashfs_fragment_entry {
3751c38aad2d135365c731b7c4e42a134c6f7bcdf82plougher	__le64			start_block;
376a95f266564808636aa1b303e4a9c3fe73977710cplougher	__le32			size;
3771c136c6499f3eaa176d460e6d0da474c16eb4385plougher	unsigned int		unused;
3781b899fc316f7eba7a31da12dc0c9b69ada441059plougher};
3791f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher
3801f413c84d736495fd61ff05ebe52c3a01a4d95c2plougher#endif
381