168252eb5SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2ffae2cd7SPhillip Lougher #ifndef SQUASHFS_FS 3ffae2cd7SPhillip Lougher #define SQUASHFS_FS 4ffae2cd7SPhillip Lougher /* 5ffae2cd7SPhillip Lougher * Squashfs 6ffae2cd7SPhillip Lougher * 7ffae2cd7SPhillip Lougher * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008 8d7f2ff67SPhillip Lougher * Phillip Lougher <phillip@squashfs.org.uk> 9ffae2cd7SPhillip Lougher * 10ffae2cd7SPhillip Lougher * squashfs_fs.h 11ffae2cd7SPhillip Lougher */ 12ffae2cd7SPhillip Lougher 13ffae2cd7SPhillip Lougher #define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE 14ffae2cd7SPhillip Lougher #define SQUASHFS_MAJOR 4 15ffae2cd7SPhillip Lougher #define SQUASHFS_MINOR 0 16ffae2cd7SPhillip Lougher #define SQUASHFS_START 0 17ffae2cd7SPhillip Lougher 18ffae2cd7SPhillip Lougher /* size of metadata (inode and directory) blocks */ 19ffae2cd7SPhillip Lougher #define SQUASHFS_METADATA_SIZE 8192 20ffae2cd7SPhillip Lougher 217657cacfSPhillip Lougher /* default size of block device I/O */ 227657cacfSPhillip Lougher #ifdef CONFIG_SQUASHFS_4K_DEVBLK_SIZE 237657cacfSPhillip Lougher #define SQUASHFS_DEVBLK_SIZE 4096 247657cacfSPhillip Lougher #else 257657cacfSPhillip Lougher #define SQUASHFS_DEVBLK_SIZE 1024 267657cacfSPhillip Lougher #endif 277657cacfSPhillip Lougher 28ffae2cd7SPhillip Lougher #define SQUASHFS_FILE_MAX_SIZE 1048576 29ffae2cd7SPhillip Lougher #define SQUASHFS_FILE_MAX_LOG 20 30ffae2cd7SPhillip Lougher 31ffae2cd7SPhillip Lougher /* Max length of filename (not 255) */ 32ffae2cd7SPhillip Lougher #define SQUASHFS_NAME_LEN 256 33ffae2cd7SPhillip Lougher 344826d83dSAjeet Yadav /* Max value for directory header count*/ 354826d83dSAjeet Yadav #define SQUASHFS_DIR_COUNT 256 364826d83dSAjeet Yadav 37ffae2cd7SPhillip Lougher #define SQUASHFS_INVALID_FRAG (0xffffffffU) 38f41d207cSPhillip Lougher #define SQUASHFS_INVALID_XATTR (0xffffffffU) 39ffae2cd7SPhillip Lougher #define SQUASHFS_INVALID_BLK (-1LL) 40ffae2cd7SPhillip Lougher 41ffae2cd7SPhillip Lougher /* Filesystem flags */ 42ffae2cd7SPhillip Lougher #define SQUASHFS_NOI 0 43ffae2cd7SPhillip Lougher #define SQUASHFS_NOD 1 44ffae2cd7SPhillip Lougher #define SQUASHFS_NOF 3 45ffae2cd7SPhillip Lougher #define SQUASHFS_NO_FRAG 4 46ffae2cd7SPhillip Lougher #define SQUASHFS_ALWAYS_FRAG 5 47ffae2cd7SPhillip Lougher #define SQUASHFS_DUPLICATE 6 48ffae2cd7SPhillip Lougher #define SQUASHFS_EXPORT 7 49b7fc0ff0SPhillip Lougher #define SQUASHFS_COMP_OPT 10 50ffae2cd7SPhillip Lougher 51ffae2cd7SPhillip Lougher #define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1) 52ffae2cd7SPhillip Lougher 53ffae2cd7SPhillip Lougher #define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \ 54ffae2cd7SPhillip Lougher SQUASHFS_NOI) 55ffae2cd7SPhillip Lougher 56ffae2cd7SPhillip Lougher #define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \ 57ffae2cd7SPhillip Lougher SQUASHFS_NOD) 58ffae2cd7SPhillip Lougher 59ffae2cd7SPhillip Lougher #define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 60ffae2cd7SPhillip Lougher SQUASHFS_NOF) 61ffae2cd7SPhillip Lougher 62ffae2cd7SPhillip Lougher #define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 63ffae2cd7SPhillip Lougher SQUASHFS_NO_FRAG) 64ffae2cd7SPhillip Lougher 65ffae2cd7SPhillip Lougher #define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \ 66ffae2cd7SPhillip Lougher SQUASHFS_ALWAYS_FRAG) 67ffae2cd7SPhillip Lougher 68ffae2cd7SPhillip Lougher #define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \ 69ffae2cd7SPhillip Lougher SQUASHFS_DUPLICATE) 70ffae2cd7SPhillip Lougher 71ffae2cd7SPhillip Lougher #define SQUASHFS_EXPORTABLE(flags) SQUASHFS_BIT(flags, \ 72ffae2cd7SPhillip Lougher SQUASHFS_EXPORT) 73ffae2cd7SPhillip Lougher 74b7fc0ff0SPhillip Lougher #define SQUASHFS_COMP_OPTS(flags) SQUASHFS_BIT(flags, \ 75b7fc0ff0SPhillip Lougher SQUASHFS_COMP_OPT) 76b7fc0ff0SPhillip Lougher 779e012423SPhillip Lougher /* Inode types including extended types */ 78ffae2cd7SPhillip Lougher #define SQUASHFS_DIR_TYPE 1 79ffae2cd7SPhillip Lougher #define SQUASHFS_REG_TYPE 2 80ffae2cd7SPhillip Lougher #define SQUASHFS_SYMLINK_TYPE 3 81ffae2cd7SPhillip Lougher #define SQUASHFS_BLKDEV_TYPE 4 82ffae2cd7SPhillip Lougher #define SQUASHFS_CHRDEV_TYPE 5 83ffae2cd7SPhillip Lougher #define SQUASHFS_FIFO_TYPE 6 84ffae2cd7SPhillip Lougher #define SQUASHFS_SOCKET_TYPE 7 85ffae2cd7SPhillip Lougher #define SQUASHFS_LDIR_TYPE 8 86ffae2cd7SPhillip Lougher #define SQUASHFS_LREG_TYPE 9 87ffae2cd7SPhillip Lougher #define SQUASHFS_LSYMLINK_TYPE 10 88ffae2cd7SPhillip Lougher #define SQUASHFS_LBLKDEV_TYPE 11 89ffae2cd7SPhillip Lougher #define SQUASHFS_LCHRDEV_TYPE 12 90ffae2cd7SPhillip Lougher #define SQUASHFS_LFIFO_TYPE 13 91ffae2cd7SPhillip Lougher #define SQUASHFS_LSOCKET_TYPE 14 92ffae2cd7SPhillip Lougher 939e012423SPhillip Lougher /* Max type value stored in directory entry */ 949e012423SPhillip Lougher #define SQUASHFS_MAX_DIR_TYPE 7 959e012423SPhillip Lougher 96f41d207cSPhillip Lougher /* Xattr types */ 97f41d207cSPhillip Lougher #define SQUASHFS_XATTR_USER 0 98f41d207cSPhillip Lougher #define SQUASHFS_XATTR_TRUSTED 1 99f41d207cSPhillip Lougher #define SQUASHFS_XATTR_SECURITY 2 100f41d207cSPhillip Lougher #define SQUASHFS_XATTR_VALUE_OOL 256 101f41d207cSPhillip Lougher #define SQUASHFS_XATTR_PREFIX_MASK 0xff 102f41d207cSPhillip Lougher 103ffae2cd7SPhillip Lougher /* Flag whether block is compressed or uncompressed, bit is set if block is 104ffae2cd7SPhillip Lougher * uncompressed */ 105ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED_BIT (1 << 15) 106ffae2cd7SPhillip Lougher 107ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \ 108ffae2cd7SPhillip Lougher (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT) 109ffae2cd7SPhillip Lougher 110ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT)) 111ffae2cd7SPhillip Lougher 112ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24) 113ffae2cd7SPhillip Lougher 114ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) ((B) & \ 115ffae2cd7SPhillip Lougher ~SQUASHFS_COMPRESSED_BIT_BLOCK) 116ffae2cd7SPhillip Lougher 117ffae2cd7SPhillip Lougher #define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK)) 118ffae2cd7SPhillip Lougher 11901cfb793SLinus Torvalds static inline int squashfs_block_size(__le32 raw) 12001cfb793SLinus Torvalds { 12101cfb793SLinus Torvalds u32 size = le32_to_cpu(raw); 12201cfb793SLinus Torvalds return (size >> 25) ? -EIO : size; 12301cfb793SLinus Torvalds } 12401cfb793SLinus Torvalds 125ffae2cd7SPhillip Lougher /* 126ffae2cd7SPhillip Lougher * Inode number ops. Inodes consist of a compressed block number, and an 127ffae2cd7SPhillip Lougher * uncompressed offset within that block 128ffae2cd7SPhillip Lougher */ 129ffae2cd7SPhillip Lougher #define SQUASHFS_INODE_BLK(A) ((unsigned int) ((A) >> 16)) 130ffae2cd7SPhillip Lougher 131ffae2cd7SPhillip Lougher #define SQUASHFS_INODE_OFFSET(A) ((unsigned int) ((A) & 0xffff)) 132ffae2cd7SPhillip Lougher 133ffae2cd7SPhillip Lougher #define SQUASHFS_MKINODE(A, B) ((long long)(((long long) (A)\ 134ffae2cd7SPhillip Lougher << 16) + (B))) 135ffae2cd7SPhillip Lougher 136ffae2cd7SPhillip Lougher /* fragment and fragment table defines */ 137ffae2cd7SPhillip Lougher #define SQUASHFS_FRAGMENT_BYTES(A) \ 138ffae2cd7SPhillip Lougher ((A) * sizeof(struct squashfs_fragment_entry)) 139ffae2cd7SPhillip Lougher 140ffae2cd7SPhillip Lougher #define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \ 141ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 142ffae2cd7SPhillip Lougher 143ffae2cd7SPhillip Lougher #define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \ 144ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 145ffae2cd7SPhillip Lougher 146ffae2cd7SPhillip Lougher #define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \ 147ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE - 1) / \ 148ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 149ffae2cd7SPhillip Lougher 150ffae2cd7SPhillip Lougher #define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\ 151ffae2cd7SPhillip Lougher sizeof(u64)) 152ffae2cd7SPhillip Lougher 153ffae2cd7SPhillip Lougher /* inode lookup table defines */ 154ffae2cd7SPhillip Lougher #define SQUASHFS_LOOKUP_BYTES(A) ((A) * sizeof(u64)) 155ffae2cd7SPhillip Lougher 156ffae2cd7SPhillip Lougher #define SQUASHFS_LOOKUP_BLOCK(A) (SQUASHFS_LOOKUP_BYTES(A) / \ 157ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 158ffae2cd7SPhillip Lougher 159ffae2cd7SPhillip Lougher #define SQUASHFS_LOOKUP_BLOCK_OFFSET(A) (SQUASHFS_LOOKUP_BYTES(A) % \ 160ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 161ffae2cd7SPhillip Lougher 162ffae2cd7SPhillip Lougher #define SQUASHFS_LOOKUP_BLOCKS(A) ((SQUASHFS_LOOKUP_BYTES(A) + \ 163ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE - 1) / \ 164ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 165ffae2cd7SPhillip Lougher 166ffae2cd7SPhillip Lougher #define SQUASHFS_LOOKUP_BLOCK_BYTES(A) (SQUASHFS_LOOKUP_BLOCKS(A) *\ 167ffae2cd7SPhillip Lougher sizeof(u64)) 168ffae2cd7SPhillip Lougher 169ffae2cd7SPhillip Lougher /* uid/gid lookup table defines */ 170ffae2cd7SPhillip Lougher #define SQUASHFS_ID_BYTES(A) ((A) * sizeof(unsigned int)) 171ffae2cd7SPhillip Lougher 172ffae2cd7SPhillip Lougher #define SQUASHFS_ID_BLOCK(A) (SQUASHFS_ID_BYTES(A) / \ 173ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 174ffae2cd7SPhillip Lougher 175ffae2cd7SPhillip Lougher #define SQUASHFS_ID_BLOCK_OFFSET(A) (SQUASHFS_ID_BYTES(A) % \ 176ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 177ffae2cd7SPhillip Lougher 178ffae2cd7SPhillip Lougher #define SQUASHFS_ID_BLOCKS(A) ((SQUASHFS_ID_BYTES(A) + \ 179ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE - 1) / \ 180ffae2cd7SPhillip Lougher SQUASHFS_METADATA_SIZE) 181ffae2cd7SPhillip Lougher 182ffae2cd7SPhillip Lougher #define SQUASHFS_ID_BLOCK_BYTES(A) (SQUASHFS_ID_BLOCKS(A) *\ 183ffae2cd7SPhillip Lougher sizeof(u64)) 1844b5397dcSPhillip Lougher /* xattr id lookup table defines */ 1854b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BYTES(A) ((A) * sizeof(struct squashfs_xattr_id)) 1864b5397dcSPhillip Lougher 1874b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BLOCK(A) (SQUASHFS_XATTR_BYTES(A) / \ 1884b5397dcSPhillip Lougher SQUASHFS_METADATA_SIZE) 1894b5397dcSPhillip Lougher 1904b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BLOCK_OFFSET(A) (SQUASHFS_XATTR_BYTES(A) % \ 1914b5397dcSPhillip Lougher SQUASHFS_METADATA_SIZE) 1924b5397dcSPhillip Lougher 1934b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BLOCKS(A) ((SQUASHFS_XATTR_BYTES(A) + \ 1944b5397dcSPhillip Lougher SQUASHFS_METADATA_SIZE - 1) / \ 1954b5397dcSPhillip Lougher SQUASHFS_METADATA_SIZE) 1964b5397dcSPhillip Lougher 1974b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BLOCK_BYTES(A) (SQUASHFS_XATTR_BLOCKS(A) *\ 1984b5397dcSPhillip Lougher sizeof(u64)) 1994b5397dcSPhillip Lougher #define SQUASHFS_XATTR_BLK(A) ((unsigned int) ((A) >> 16)) 2004b5397dcSPhillip Lougher 2014b5397dcSPhillip Lougher #define SQUASHFS_XATTR_OFFSET(A) ((unsigned int) ((A) & 0xffff)) 202ffae2cd7SPhillip Lougher 203ffae2cd7SPhillip Lougher /* cached data constants for filesystem */ 204ffae2cd7SPhillip Lougher #define SQUASHFS_CACHED_BLKS 8 205ffae2cd7SPhillip Lougher 206ffae2cd7SPhillip Lougher /* meta index cache */ 207ffae2cd7SPhillip Lougher #define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int)) 208ffae2cd7SPhillip Lougher #define SQUASHFS_META_ENTRIES 127 209ffae2cd7SPhillip Lougher #define SQUASHFS_META_SLOTS 8 210ffae2cd7SPhillip Lougher 211ffae2cd7SPhillip Lougher struct meta_entry { 212ffae2cd7SPhillip Lougher u64 data_block; 213ffae2cd7SPhillip Lougher unsigned int index_block; 214ffae2cd7SPhillip Lougher unsigned short offset; 215ffae2cd7SPhillip Lougher unsigned short pad; 216ffae2cd7SPhillip Lougher }; 217ffae2cd7SPhillip Lougher 218ffae2cd7SPhillip Lougher struct meta_index { 219ffae2cd7SPhillip Lougher unsigned int inode_number; 220ffae2cd7SPhillip Lougher unsigned int offset; 221ffae2cd7SPhillip Lougher unsigned short entries; 222ffae2cd7SPhillip Lougher unsigned short skip; 223ffae2cd7SPhillip Lougher unsigned short locked; 224ffae2cd7SPhillip Lougher unsigned short pad; 225ffae2cd7SPhillip Lougher struct meta_entry meta_entry[SQUASHFS_META_ENTRIES]; 226ffae2cd7SPhillip Lougher }; 227ffae2cd7SPhillip Lougher 228ffae2cd7SPhillip Lougher 229ffae2cd7SPhillip Lougher /* 230ffae2cd7SPhillip Lougher * definitions for structures on disk 231ffae2cd7SPhillip Lougher */ 232ffae2cd7SPhillip Lougher #define ZLIB_COMPRESSION 1 233dc325678SPhillip Lougher #define LZMA_COMPRESSION 2 234dc325678SPhillip Lougher #define LZO_COMPRESSION 3 23581bb8debSPhillip Lougher #define XZ_COMPRESSION 4 2369c06a46fSPhillip Lougher #define LZ4_COMPRESSION 5 23787bf54bbSSean Purcell #define ZSTD_COMPRESSION 6 238ffae2cd7SPhillip Lougher 239ffae2cd7SPhillip Lougher struct squashfs_super_block { 240ffae2cd7SPhillip Lougher __le32 s_magic; 241ffae2cd7SPhillip Lougher __le32 inodes; 242ffae2cd7SPhillip Lougher __le32 mkfs_time; 243ffae2cd7SPhillip Lougher __le32 block_size; 244ffae2cd7SPhillip Lougher __le32 fragments; 245ffae2cd7SPhillip Lougher __le16 compression; 246ffae2cd7SPhillip Lougher __le16 block_log; 247ffae2cd7SPhillip Lougher __le16 flags; 248ffae2cd7SPhillip Lougher __le16 no_ids; 249ffae2cd7SPhillip Lougher __le16 s_major; 250ffae2cd7SPhillip Lougher __le16 s_minor; 251ffae2cd7SPhillip Lougher __le64 root_inode; 252ffae2cd7SPhillip Lougher __le64 bytes_used; 253ffae2cd7SPhillip Lougher __le64 id_table_start; 2544b5397dcSPhillip Lougher __le64 xattr_id_table_start; 255ffae2cd7SPhillip Lougher __le64 inode_table_start; 256ffae2cd7SPhillip Lougher __le64 directory_table_start; 257ffae2cd7SPhillip Lougher __le64 fragment_table_start; 258ffae2cd7SPhillip Lougher __le64 lookup_table_start; 259ffae2cd7SPhillip Lougher }; 260ffae2cd7SPhillip Lougher 261ffae2cd7SPhillip Lougher struct squashfs_dir_index { 262ffae2cd7SPhillip Lougher __le32 index; 263ffae2cd7SPhillip Lougher __le32 start_block; 264ffae2cd7SPhillip Lougher __le32 size; 265*b2b32e3aSGustavo A. R. Silva unsigned char name[]; 266ffae2cd7SPhillip Lougher }; 267ffae2cd7SPhillip Lougher 268ffae2cd7SPhillip Lougher struct squashfs_base_inode { 269ffae2cd7SPhillip Lougher __le16 inode_type; 270ffae2cd7SPhillip Lougher __le16 mode; 271ffae2cd7SPhillip Lougher __le16 uid; 272ffae2cd7SPhillip Lougher __le16 guid; 273ffae2cd7SPhillip Lougher __le32 mtime; 274ffae2cd7SPhillip Lougher __le32 inode_number; 275ffae2cd7SPhillip Lougher }; 276ffae2cd7SPhillip Lougher 277ffae2cd7SPhillip Lougher struct squashfs_ipc_inode { 278ffae2cd7SPhillip Lougher __le16 inode_type; 279ffae2cd7SPhillip Lougher __le16 mode; 280ffae2cd7SPhillip Lougher __le16 uid; 281ffae2cd7SPhillip Lougher __le16 guid; 282ffae2cd7SPhillip Lougher __le32 mtime; 283ffae2cd7SPhillip Lougher __le32 inode_number; 284ffae2cd7SPhillip Lougher __le32 nlink; 285ffae2cd7SPhillip Lougher }; 286ffae2cd7SPhillip Lougher 28767f66cc6SPhillip Lougher struct squashfs_lipc_inode { 28867f66cc6SPhillip Lougher __le16 inode_type; 28967f66cc6SPhillip Lougher __le16 mode; 29067f66cc6SPhillip Lougher __le16 uid; 29167f66cc6SPhillip Lougher __le16 guid; 29267f66cc6SPhillip Lougher __le32 mtime; 29367f66cc6SPhillip Lougher __le32 inode_number; 29467f66cc6SPhillip Lougher __le32 nlink; 29567f66cc6SPhillip Lougher __le32 xattr; 29667f66cc6SPhillip Lougher }; 29767f66cc6SPhillip Lougher 298ffae2cd7SPhillip Lougher struct squashfs_dev_inode { 299ffae2cd7SPhillip Lougher __le16 inode_type; 300ffae2cd7SPhillip Lougher __le16 mode; 301ffae2cd7SPhillip Lougher __le16 uid; 302ffae2cd7SPhillip Lougher __le16 guid; 303ffae2cd7SPhillip Lougher __le32 mtime; 304ffae2cd7SPhillip Lougher __le32 inode_number; 305ffae2cd7SPhillip Lougher __le32 nlink; 306ffae2cd7SPhillip Lougher __le32 rdev; 307ffae2cd7SPhillip Lougher }; 308ffae2cd7SPhillip Lougher 30967f66cc6SPhillip Lougher struct squashfs_ldev_inode { 31067f66cc6SPhillip Lougher __le16 inode_type; 31167f66cc6SPhillip Lougher __le16 mode; 31267f66cc6SPhillip Lougher __le16 uid; 31367f66cc6SPhillip Lougher __le16 guid; 31467f66cc6SPhillip Lougher __le32 mtime; 31567f66cc6SPhillip Lougher __le32 inode_number; 31667f66cc6SPhillip Lougher __le32 nlink; 31767f66cc6SPhillip Lougher __le32 rdev; 31867f66cc6SPhillip Lougher __le32 xattr; 31967f66cc6SPhillip Lougher }; 32067f66cc6SPhillip Lougher 321ffae2cd7SPhillip Lougher struct squashfs_symlink_inode { 322ffae2cd7SPhillip Lougher __le16 inode_type; 323ffae2cd7SPhillip Lougher __le16 mode; 324ffae2cd7SPhillip Lougher __le16 uid; 325ffae2cd7SPhillip Lougher __le16 guid; 326ffae2cd7SPhillip Lougher __le32 mtime; 327ffae2cd7SPhillip Lougher __le32 inode_number; 328ffae2cd7SPhillip Lougher __le32 nlink; 329ffae2cd7SPhillip Lougher __le32 symlink_size; 330*b2b32e3aSGustavo A. R. Silva char symlink[]; 331ffae2cd7SPhillip Lougher }; 332ffae2cd7SPhillip Lougher 333ffae2cd7SPhillip Lougher struct squashfs_reg_inode { 334ffae2cd7SPhillip Lougher __le16 inode_type; 335ffae2cd7SPhillip Lougher __le16 mode; 336ffae2cd7SPhillip Lougher __le16 uid; 337ffae2cd7SPhillip Lougher __le16 guid; 338ffae2cd7SPhillip Lougher __le32 mtime; 339ffae2cd7SPhillip Lougher __le32 inode_number; 340ffae2cd7SPhillip Lougher __le32 start_block; 341ffae2cd7SPhillip Lougher __le32 fragment; 342ffae2cd7SPhillip Lougher __le32 offset; 343ffae2cd7SPhillip Lougher __le32 file_size; 344*b2b32e3aSGustavo A. R. Silva __le16 block_list[]; 345ffae2cd7SPhillip Lougher }; 346ffae2cd7SPhillip Lougher 347ffae2cd7SPhillip Lougher struct squashfs_lreg_inode { 348ffae2cd7SPhillip Lougher __le16 inode_type; 349ffae2cd7SPhillip Lougher __le16 mode; 350ffae2cd7SPhillip Lougher __le16 uid; 351ffae2cd7SPhillip Lougher __le16 guid; 352ffae2cd7SPhillip Lougher __le32 mtime; 353ffae2cd7SPhillip Lougher __le32 inode_number; 354ffae2cd7SPhillip Lougher __le64 start_block; 355ffae2cd7SPhillip Lougher __le64 file_size; 356ffae2cd7SPhillip Lougher __le64 sparse; 357ffae2cd7SPhillip Lougher __le32 nlink; 358ffae2cd7SPhillip Lougher __le32 fragment; 359ffae2cd7SPhillip Lougher __le32 offset; 360ffae2cd7SPhillip Lougher __le32 xattr; 361*b2b32e3aSGustavo A. R. Silva __le16 block_list[]; 362ffae2cd7SPhillip Lougher }; 363ffae2cd7SPhillip Lougher 364ffae2cd7SPhillip Lougher struct squashfs_dir_inode { 365ffae2cd7SPhillip Lougher __le16 inode_type; 366ffae2cd7SPhillip Lougher __le16 mode; 367ffae2cd7SPhillip Lougher __le16 uid; 368ffae2cd7SPhillip Lougher __le16 guid; 369ffae2cd7SPhillip Lougher __le32 mtime; 370ffae2cd7SPhillip Lougher __le32 inode_number; 371ffae2cd7SPhillip Lougher __le32 start_block; 372ffae2cd7SPhillip Lougher __le32 nlink; 373ffae2cd7SPhillip Lougher __le16 file_size; 374ffae2cd7SPhillip Lougher __le16 offset; 375ffae2cd7SPhillip Lougher __le32 parent_inode; 376ffae2cd7SPhillip Lougher }; 377ffae2cd7SPhillip Lougher 378ffae2cd7SPhillip Lougher struct squashfs_ldir_inode { 379ffae2cd7SPhillip Lougher __le16 inode_type; 380ffae2cd7SPhillip Lougher __le16 mode; 381ffae2cd7SPhillip Lougher __le16 uid; 382ffae2cd7SPhillip Lougher __le16 guid; 383ffae2cd7SPhillip Lougher __le32 mtime; 384ffae2cd7SPhillip Lougher __le32 inode_number; 385ffae2cd7SPhillip Lougher __le32 nlink; 386ffae2cd7SPhillip Lougher __le32 file_size; 387ffae2cd7SPhillip Lougher __le32 start_block; 388ffae2cd7SPhillip Lougher __le32 parent_inode; 389ffae2cd7SPhillip Lougher __le16 i_count; 390ffae2cd7SPhillip Lougher __le16 offset; 391ffae2cd7SPhillip Lougher __le32 xattr; 392*b2b32e3aSGustavo A. R. Silva struct squashfs_dir_index index[]; 393ffae2cd7SPhillip Lougher }; 394ffae2cd7SPhillip Lougher 395ffae2cd7SPhillip Lougher union squashfs_inode { 396ffae2cd7SPhillip Lougher struct squashfs_base_inode base; 397ffae2cd7SPhillip Lougher struct squashfs_dev_inode dev; 39867f66cc6SPhillip Lougher struct squashfs_ldev_inode ldev; 399ffae2cd7SPhillip Lougher struct squashfs_symlink_inode symlink; 400ffae2cd7SPhillip Lougher struct squashfs_reg_inode reg; 401ffae2cd7SPhillip Lougher struct squashfs_lreg_inode lreg; 402ffae2cd7SPhillip Lougher struct squashfs_dir_inode dir; 403ffae2cd7SPhillip Lougher struct squashfs_ldir_inode ldir; 404ffae2cd7SPhillip Lougher struct squashfs_ipc_inode ipc; 40567f66cc6SPhillip Lougher struct squashfs_lipc_inode lipc; 406ffae2cd7SPhillip Lougher }; 407ffae2cd7SPhillip Lougher 408ffae2cd7SPhillip Lougher struct squashfs_dir_entry { 409ffae2cd7SPhillip Lougher __le16 offset; 410ffae2cd7SPhillip Lougher __le16 inode_number; 411ffae2cd7SPhillip Lougher __le16 type; 412ffae2cd7SPhillip Lougher __le16 size; 413*b2b32e3aSGustavo A. R. Silva char name[]; 414ffae2cd7SPhillip Lougher }; 415ffae2cd7SPhillip Lougher 416ffae2cd7SPhillip Lougher struct squashfs_dir_header { 417ffae2cd7SPhillip Lougher __le32 count; 418ffae2cd7SPhillip Lougher __le32 start_block; 419ffae2cd7SPhillip Lougher __le32 inode_number; 420ffae2cd7SPhillip Lougher }; 421ffae2cd7SPhillip Lougher 422ffae2cd7SPhillip Lougher struct squashfs_fragment_entry { 423ffae2cd7SPhillip Lougher __le64 start_block; 424ffae2cd7SPhillip Lougher __le32 size; 425ffae2cd7SPhillip Lougher unsigned int unused; 426ffae2cd7SPhillip Lougher }; 427ffae2cd7SPhillip Lougher 428f41d207cSPhillip Lougher struct squashfs_xattr_entry { 429f41d207cSPhillip Lougher __le16 type; 430f41d207cSPhillip Lougher __le16 size; 431*b2b32e3aSGustavo A. R. Silva char data[]; 432f41d207cSPhillip Lougher }; 433f41d207cSPhillip Lougher 434f41d207cSPhillip Lougher struct squashfs_xattr_val { 435f41d207cSPhillip Lougher __le32 vsize; 436*b2b32e3aSGustavo A. R. Silva char value[]; 437f41d207cSPhillip Lougher }; 438f41d207cSPhillip Lougher 4394b5397dcSPhillip Lougher struct squashfs_xattr_id { 4404b5397dcSPhillip Lougher __le64 xattr; 4414b5397dcSPhillip Lougher __le32 count; 4424b5397dcSPhillip Lougher __le32 size; 4434b5397dcSPhillip Lougher }; 4444b5397dcSPhillip Lougher 4454b5397dcSPhillip Lougher struct squashfs_xattr_id_table { 4464b5397dcSPhillip Lougher __le64 xattr_table_start; 4474b5397dcSPhillip Lougher __le32 xattr_ids; 4484b5397dcSPhillip Lougher __le32 unused; 4494b5397dcSPhillip Lougher }; 4504b5397dcSPhillip Lougher 451ffae2cd7SPhillip Lougher #endif 452