453 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2#ifndef SQUASHFS_FS3#define SQUASHFS_FS4/*5 * Squashfs6 *7 * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 20088 * Phillip Lougher <phillip@squashfs.org.uk>9 *10 * squashfs_fs.h11 */12 13#define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE14#define SQUASHFS_MAJOR 415#define SQUASHFS_MINOR 016#define SQUASHFS_START 017 18/* size of metadata (inode and directory) blocks */19#define SQUASHFS_METADATA_SIZE 819220#define SQUASHFS_BLOCK_OFFSET 221 22/* default size of block device I/O */23#ifdef CONFIG_SQUASHFS_4K_DEVBLK_SIZE24#define SQUASHFS_DEVBLK_SIZE 409625#else26#define SQUASHFS_DEVBLK_SIZE 102427#endif28 29#define SQUASHFS_FILE_MAX_SIZE 104857630#define SQUASHFS_FILE_MAX_LOG 2031 32/* Max length of filename (not 255) */33#define SQUASHFS_NAME_LEN 25634 35/* Max value for directory header count*/36#define SQUASHFS_DIR_COUNT 25637 38#define SQUASHFS_INVALID_FRAG (0xffffffffU)39#define SQUASHFS_INVALID_XATTR (0xffffffffU)40#define SQUASHFS_INVALID_BLK (-1LL)41 42/* Filesystem flags */43#define SQUASHFS_NOI 044#define SQUASHFS_NOD 145#define SQUASHFS_NOF 346#define SQUASHFS_NO_FRAG 447#define SQUASHFS_ALWAYS_FRAG 548#define SQUASHFS_DUPLICATE 649#define SQUASHFS_EXPORT 750#define SQUASHFS_COMP_OPT 1051 52#define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1)53 54#define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \55 SQUASHFS_NOI)56 57#define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \58 SQUASHFS_NOD)59 60#define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \61 SQUASHFS_NOF)62 63#define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \64 SQUASHFS_NO_FRAG)65 66#define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \67 SQUASHFS_ALWAYS_FRAG)68 69#define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \70 SQUASHFS_DUPLICATE)71 72#define SQUASHFS_EXPORTABLE(flags) SQUASHFS_BIT(flags, \73 SQUASHFS_EXPORT)74 75#define SQUASHFS_COMP_OPTS(flags) SQUASHFS_BIT(flags, \76 SQUASHFS_COMP_OPT)77 78/* Inode types including extended types */79#define SQUASHFS_DIR_TYPE 180#define SQUASHFS_REG_TYPE 281#define SQUASHFS_SYMLINK_TYPE 382#define SQUASHFS_BLKDEV_TYPE 483#define SQUASHFS_CHRDEV_TYPE 584#define SQUASHFS_FIFO_TYPE 685#define SQUASHFS_SOCKET_TYPE 786#define SQUASHFS_LDIR_TYPE 887#define SQUASHFS_LREG_TYPE 988#define SQUASHFS_LSYMLINK_TYPE 1089#define SQUASHFS_LBLKDEV_TYPE 1190#define SQUASHFS_LCHRDEV_TYPE 1291#define SQUASHFS_LFIFO_TYPE 1392#define SQUASHFS_LSOCKET_TYPE 1493 94/* Max type value stored in directory entry */95#define SQUASHFS_MAX_DIR_TYPE 796 97/* Xattr types */98#define SQUASHFS_XATTR_USER 099#define SQUASHFS_XATTR_TRUSTED 1100#define SQUASHFS_XATTR_SECURITY 2101#define SQUASHFS_XATTR_VALUE_OOL 256102#define SQUASHFS_XATTR_PREFIX_MASK 0xff103 104/* Flag whether block is compressed or uncompressed, bit is set if block is105 * uncompressed */106#define SQUASHFS_COMPRESSED_BIT (1 << 15)107 108#define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \109 (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT)110 111#define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT))112 113#define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24)114 115#define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) ((B) & \116 ~SQUASHFS_COMPRESSED_BIT_BLOCK)117 118#define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))119 120static inline int squashfs_block_size(__le32 raw)121{122 u32 size = le32_to_cpu(raw);123 return (size >> 25) ? -EIO : size;124}125 126/*127 * Inode number ops. Inodes consist of a compressed block number, and an128 * uncompressed offset within that block129 */130#define SQUASHFS_INODE_BLK(A) ((unsigned int) ((A) >> 16))131 132#define SQUASHFS_INODE_OFFSET(A) ((unsigned int) ((A) & 0xffff))133 134#define SQUASHFS_MKINODE(A, B) ((long long)(((long long) (A)\135 << 16) + (B)))136 137/* fragment and fragment table defines */138#define SQUASHFS_FRAGMENT_BYTES(A) \139 ((A) * sizeof(struct squashfs_fragment_entry))140 141#define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \142 SQUASHFS_METADATA_SIZE)143 144#define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \145 SQUASHFS_METADATA_SIZE)146 147#define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \148 SQUASHFS_METADATA_SIZE - 1) / \149 SQUASHFS_METADATA_SIZE)150 151#define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\152 sizeof(u64))153 154/* inode lookup table defines */155#define SQUASHFS_LOOKUP_BYTES(A) ((A) * sizeof(u64))156 157#define SQUASHFS_LOOKUP_BLOCK(A) (SQUASHFS_LOOKUP_BYTES(A) / \158 SQUASHFS_METADATA_SIZE)159 160#define SQUASHFS_LOOKUP_BLOCK_OFFSET(A) (SQUASHFS_LOOKUP_BYTES(A) % \161 SQUASHFS_METADATA_SIZE)162 163#define SQUASHFS_LOOKUP_BLOCKS(A) ((SQUASHFS_LOOKUP_BYTES(A) + \164 SQUASHFS_METADATA_SIZE - 1) / \165 SQUASHFS_METADATA_SIZE)166 167#define SQUASHFS_LOOKUP_BLOCK_BYTES(A) (SQUASHFS_LOOKUP_BLOCKS(A) *\168 sizeof(u64))169 170/* uid/gid lookup table defines */171#define SQUASHFS_ID_BYTES(A) ((A) * sizeof(unsigned int))172 173#define SQUASHFS_ID_BLOCK(A) (SQUASHFS_ID_BYTES(A) / \174 SQUASHFS_METADATA_SIZE)175 176#define SQUASHFS_ID_BLOCK_OFFSET(A) (SQUASHFS_ID_BYTES(A) % \177 SQUASHFS_METADATA_SIZE)178 179#define SQUASHFS_ID_BLOCKS(A) ((SQUASHFS_ID_BYTES(A) + \180 SQUASHFS_METADATA_SIZE - 1) / \181 SQUASHFS_METADATA_SIZE)182 183#define SQUASHFS_ID_BLOCK_BYTES(A) (SQUASHFS_ID_BLOCKS(A) *\184 sizeof(u64))185/* xattr id lookup table defines */186#define SQUASHFS_XATTR_BYTES(A) (((u64) (A)) * sizeof(struct squashfs_xattr_id))187 188#define SQUASHFS_XATTR_BLOCK(A) (SQUASHFS_XATTR_BYTES(A) / \189 SQUASHFS_METADATA_SIZE)190 191#define SQUASHFS_XATTR_BLOCK_OFFSET(A) (SQUASHFS_XATTR_BYTES(A) % \192 SQUASHFS_METADATA_SIZE)193 194#define SQUASHFS_XATTR_BLOCKS(A) ((SQUASHFS_XATTR_BYTES(A) + \195 SQUASHFS_METADATA_SIZE - 1) / \196 SQUASHFS_METADATA_SIZE)197 198#define SQUASHFS_XATTR_BLOCK_BYTES(A) (SQUASHFS_XATTR_BLOCKS(A) *\199 sizeof(u64))200#define SQUASHFS_XATTR_BLK(A) ((unsigned int) ((A) >> 16))201 202#define SQUASHFS_XATTR_OFFSET(A) ((unsigned int) ((A) & 0xffff))203 204/* cached data constants for filesystem */205#define SQUASHFS_CACHED_BLKS 8206 207/* meta index cache */208#define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))209#define SQUASHFS_META_ENTRIES 127210#define SQUASHFS_META_SLOTS 8211 212struct meta_entry {213 u64 data_block;214 unsigned int index_block;215 unsigned short offset;216 unsigned short pad;217};218 219struct meta_index {220 unsigned int inode_number;221 unsigned int offset;222 unsigned short entries;223 unsigned short skip;224 unsigned short locked;225 unsigned short pad;226 struct meta_entry meta_entry[SQUASHFS_META_ENTRIES];227};228 229 230/*231 * definitions for structures on disk232 */233#define ZLIB_COMPRESSION 1234#define LZMA_COMPRESSION 2235#define LZO_COMPRESSION 3236#define XZ_COMPRESSION 4237#define LZ4_COMPRESSION 5238#define ZSTD_COMPRESSION 6239 240struct squashfs_super_block {241 __le32 s_magic;242 __le32 inodes;243 __le32 mkfs_time;244 __le32 block_size;245 __le32 fragments;246 __le16 compression;247 __le16 block_log;248 __le16 flags;249 __le16 no_ids;250 __le16 s_major;251 __le16 s_minor;252 __le64 root_inode;253 __le64 bytes_used;254 __le64 id_table_start;255 __le64 xattr_id_table_start;256 __le64 inode_table_start;257 __le64 directory_table_start;258 __le64 fragment_table_start;259 __le64 lookup_table_start;260};261 262struct squashfs_dir_index {263 __le32 index;264 __le32 start_block;265 __le32 size;266 unsigned char name[];267};268 269struct squashfs_base_inode {270 __le16 inode_type;271 __le16 mode;272 __le16 uid;273 __le16 guid;274 __le32 mtime;275 __le32 inode_number;276};277 278struct squashfs_ipc_inode {279 __le16 inode_type;280 __le16 mode;281 __le16 uid;282 __le16 guid;283 __le32 mtime;284 __le32 inode_number;285 __le32 nlink;286};287 288struct squashfs_lipc_inode {289 __le16 inode_type;290 __le16 mode;291 __le16 uid;292 __le16 guid;293 __le32 mtime;294 __le32 inode_number;295 __le32 nlink;296 __le32 xattr;297};298 299struct squashfs_dev_inode {300 __le16 inode_type;301 __le16 mode;302 __le16 uid;303 __le16 guid;304 __le32 mtime;305 __le32 inode_number;306 __le32 nlink;307 __le32 rdev;308};309 310struct squashfs_ldev_inode {311 __le16 inode_type;312 __le16 mode;313 __le16 uid;314 __le16 guid;315 __le32 mtime;316 __le32 inode_number;317 __le32 nlink;318 __le32 rdev;319 __le32 xattr;320};321 322struct squashfs_symlink_inode {323 __le16 inode_type;324 __le16 mode;325 __le16 uid;326 __le16 guid;327 __le32 mtime;328 __le32 inode_number;329 __le32 nlink;330 __le32 symlink_size;331 char symlink[];332};333 334struct squashfs_reg_inode {335 __le16 inode_type;336 __le16 mode;337 __le16 uid;338 __le16 guid;339 __le32 mtime;340 __le32 inode_number;341 __le32 start_block;342 __le32 fragment;343 __le32 offset;344 __le32 file_size;345 __le16 block_list[];346};347 348struct squashfs_lreg_inode {349 __le16 inode_type;350 __le16 mode;351 __le16 uid;352 __le16 guid;353 __le32 mtime;354 __le32 inode_number;355 __le64 start_block;356 __le64 file_size;357 __le64 sparse;358 __le32 nlink;359 __le32 fragment;360 __le32 offset;361 __le32 xattr;362 __le16 block_list[];363};364 365struct squashfs_dir_inode {366 __le16 inode_type;367 __le16 mode;368 __le16 uid;369 __le16 guid;370 __le32 mtime;371 __le32 inode_number;372 __le32 start_block;373 __le32 nlink;374 __le16 file_size;375 __le16 offset;376 __le32 parent_inode;377};378 379struct squashfs_ldir_inode {380 __le16 inode_type;381 __le16 mode;382 __le16 uid;383 __le16 guid;384 __le32 mtime;385 __le32 inode_number;386 __le32 nlink;387 __le32 file_size;388 __le32 start_block;389 __le32 parent_inode;390 __le16 i_count;391 __le16 offset;392 __le32 xattr;393 struct squashfs_dir_index index[];394};395 396union squashfs_inode {397 struct squashfs_base_inode base;398 struct squashfs_dev_inode dev;399 struct squashfs_ldev_inode ldev;400 struct squashfs_symlink_inode symlink;401 struct squashfs_reg_inode reg;402 struct squashfs_lreg_inode lreg;403 struct squashfs_dir_inode dir;404 struct squashfs_ldir_inode ldir;405 struct squashfs_ipc_inode ipc;406 struct squashfs_lipc_inode lipc;407};408 409struct squashfs_dir_entry {410 __le16 offset;411 __le16 inode_number;412 __le16 type;413 __le16 size;414 char name[];415};416 417struct squashfs_dir_header {418 __le32 count;419 __le32 start_block;420 __le32 inode_number;421};422 423struct squashfs_fragment_entry {424 __le64 start_block;425 __le32 size;426 unsigned int unused;427};428 429struct squashfs_xattr_entry {430 __le16 type;431 __le16 size;432 char data[];433};434 435struct squashfs_xattr_val {436 __le32 vsize;437 char value[];438};439 440struct squashfs_xattr_id {441 __le64 xattr;442 __le32 count;443 __le32 size;444};445 446struct squashfs_xattr_id_table {447 __le64 xattr_table_start;448 __le32 xattr_ids;449 __le32 unused;450};451 452#endif453