0001
0002 #ifndef SQUASHFS_FS
0003 #define SQUASHFS_FS
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #define SQUASHFS_CACHED_FRAGMENTS CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE
0014 #define SQUASHFS_MAJOR 4
0015 #define SQUASHFS_MINOR 0
0016 #define SQUASHFS_START 0
0017
0018
0019 #define SQUASHFS_METADATA_SIZE 8192
0020 #define SQUASHFS_BLOCK_OFFSET 2
0021
0022
0023 #ifdef CONFIG_SQUASHFS_4K_DEVBLK_SIZE
0024 #define SQUASHFS_DEVBLK_SIZE 4096
0025 #else
0026 #define SQUASHFS_DEVBLK_SIZE 1024
0027 #endif
0028
0029 #define SQUASHFS_FILE_MAX_SIZE 1048576
0030 #define SQUASHFS_FILE_MAX_LOG 20
0031
0032
0033 #define SQUASHFS_NAME_LEN 256
0034
0035
0036 #define SQUASHFS_DIR_COUNT 256
0037
0038 #define SQUASHFS_INVALID_FRAG (0xffffffffU)
0039 #define SQUASHFS_INVALID_XATTR (0xffffffffU)
0040 #define SQUASHFS_INVALID_BLK (-1LL)
0041
0042
0043 #define SQUASHFS_NOI 0
0044 #define SQUASHFS_NOD 1
0045 #define SQUASHFS_NOF 3
0046 #define SQUASHFS_NO_FRAG 4
0047 #define SQUASHFS_ALWAYS_FRAG 5
0048 #define SQUASHFS_DUPLICATE 6
0049 #define SQUASHFS_EXPORT 7
0050 #define SQUASHFS_COMP_OPT 10
0051
0052 #define SQUASHFS_BIT(flag, bit) ((flag >> bit) & 1)
0053
0054 #define SQUASHFS_UNCOMPRESSED_INODES(flags) SQUASHFS_BIT(flags, \
0055 SQUASHFS_NOI)
0056
0057 #define SQUASHFS_UNCOMPRESSED_DATA(flags) SQUASHFS_BIT(flags, \
0058 SQUASHFS_NOD)
0059
0060 #define SQUASHFS_UNCOMPRESSED_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
0061 SQUASHFS_NOF)
0062
0063 #define SQUASHFS_NO_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
0064 SQUASHFS_NO_FRAG)
0065
0066 #define SQUASHFS_ALWAYS_FRAGMENTS(flags) SQUASHFS_BIT(flags, \
0067 SQUASHFS_ALWAYS_FRAG)
0068
0069 #define SQUASHFS_DUPLICATES(flags) SQUASHFS_BIT(flags, \
0070 SQUASHFS_DUPLICATE)
0071
0072 #define SQUASHFS_EXPORTABLE(flags) SQUASHFS_BIT(flags, \
0073 SQUASHFS_EXPORT)
0074
0075 #define SQUASHFS_COMP_OPTS(flags) SQUASHFS_BIT(flags, \
0076 SQUASHFS_COMP_OPT)
0077
0078
0079 #define SQUASHFS_DIR_TYPE 1
0080 #define SQUASHFS_REG_TYPE 2
0081 #define SQUASHFS_SYMLINK_TYPE 3
0082 #define SQUASHFS_BLKDEV_TYPE 4
0083 #define SQUASHFS_CHRDEV_TYPE 5
0084 #define SQUASHFS_FIFO_TYPE 6
0085 #define SQUASHFS_SOCKET_TYPE 7
0086 #define SQUASHFS_LDIR_TYPE 8
0087 #define SQUASHFS_LREG_TYPE 9
0088 #define SQUASHFS_LSYMLINK_TYPE 10
0089 #define SQUASHFS_LBLKDEV_TYPE 11
0090 #define SQUASHFS_LCHRDEV_TYPE 12
0091 #define SQUASHFS_LFIFO_TYPE 13
0092 #define SQUASHFS_LSOCKET_TYPE 14
0093
0094
0095 #define SQUASHFS_MAX_DIR_TYPE 7
0096
0097
0098 #define SQUASHFS_XATTR_USER 0
0099 #define SQUASHFS_XATTR_TRUSTED 1
0100 #define SQUASHFS_XATTR_SECURITY 2
0101 #define SQUASHFS_XATTR_VALUE_OOL 256
0102 #define SQUASHFS_XATTR_PREFIX_MASK 0xff
0103
0104
0105
0106 #define SQUASHFS_COMPRESSED_BIT (1 << 15)
0107
0108 #define SQUASHFS_COMPRESSED_SIZE(B) (((B) & ~SQUASHFS_COMPRESSED_BIT) ? \
0109 (B) & ~SQUASHFS_COMPRESSED_BIT : SQUASHFS_COMPRESSED_BIT)
0110
0111 #define SQUASHFS_COMPRESSED(B) (!((B) & SQUASHFS_COMPRESSED_BIT))
0112
0113 #define SQUASHFS_COMPRESSED_BIT_BLOCK (1 << 24)
0114
0115 #define SQUASHFS_COMPRESSED_SIZE_BLOCK(B) ((B) & \
0116 ~SQUASHFS_COMPRESSED_BIT_BLOCK)
0117
0118 #define SQUASHFS_COMPRESSED_BLOCK(B) (!((B) & SQUASHFS_COMPRESSED_BIT_BLOCK))
0119
0120 static inline int squashfs_block_size(__le32 raw)
0121 {
0122 u32 size = le32_to_cpu(raw);
0123 return (size >> 25) ? -EIO : size;
0124 }
0125
0126
0127
0128
0129
0130 #define SQUASHFS_INODE_BLK(A) ((unsigned int) ((A) >> 16))
0131
0132 #define SQUASHFS_INODE_OFFSET(A) ((unsigned int) ((A) & 0xffff))
0133
0134 #define SQUASHFS_MKINODE(A, B) ((long long)(((long long) (A)\
0135 << 16) + (B)))
0136
0137
0138 #define SQUASHFS_FRAGMENT_BYTES(A) \
0139 ((A) * sizeof(struct squashfs_fragment_entry))
0140
0141 #define SQUASHFS_FRAGMENT_INDEX(A) (SQUASHFS_FRAGMENT_BYTES(A) / \
0142 SQUASHFS_METADATA_SIZE)
0143
0144 #define SQUASHFS_FRAGMENT_INDEX_OFFSET(A) (SQUASHFS_FRAGMENT_BYTES(A) % \
0145 SQUASHFS_METADATA_SIZE)
0146
0147 #define SQUASHFS_FRAGMENT_INDEXES(A) ((SQUASHFS_FRAGMENT_BYTES(A) + \
0148 SQUASHFS_METADATA_SIZE - 1) / \
0149 SQUASHFS_METADATA_SIZE)
0150
0151 #define SQUASHFS_FRAGMENT_INDEX_BYTES(A) (SQUASHFS_FRAGMENT_INDEXES(A) *\
0152 sizeof(u64))
0153
0154
0155 #define SQUASHFS_LOOKUP_BYTES(A) ((A) * sizeof(u64))
0156
0157 #define SQUASHFS_LOOKUP_BLOCK(A) (SQUASHFS_LOOKUP_BYTES(A) / \
0158 SQUASHFS_METADATA_SIZE)
0159
0160 #define SQUASHFS_LOOKUP_BLOCK_OFFSET(A) (SQUASHFS_LOOKUP_BYTES(A) % \
0161 SQUASHFS_METADATA_SIZE)
0162
0163 #define SQUASHFS_LOOKUP_BLOCKS(A) ((SQUASHFS_LOOKUP_BYTES(A) + \
0164 SQUASHFS_METADATA_SIZE - 1) / \
0165 SQUASHFS_METADATA_SIZE)
0166
0167 #define SQUASHFS_LOOKUP_BLOCK_BYTES(A) (SQUASHFS_LOOKUP_BLOCKS(A) *\
0168 sizeof(u64))
0169
0170
0171 #define SQUASHFS_ID_BYTES(A) ((A) * sizeof(unsigned int))
0172
0173 #define SQUASHFS_ID_BLOCK(A) (SQUASHFS_ID_BYTES(A) / \
0174 SQUASHFS_METADATA_SIZE)
0175
0176 #define SQUASHFS_ID_BLOCK_OFFSET(A) (SQUASHFS_ID_BYTES(A) % \
0177 SQUASHFS_METADATA_SIZE)
0178
0179 #define SQUASHFS_ID_BLOCKS(A) ((SQUASHFS_ID_BYTES(A) + \
0180 SQUASHFS_METADATA_SIZE - 1) / \
0181 SQUASHFS_METADATA_SIZE)
0182
0183 #define SQUASHFS_ID_BLOCK_BYTES(A) (SQUASHFS_ID_BLOCKS(A) *\
0184 sizeof(u64))
0185
0186 #define SQUASHFS_XATTR_BYTES(A) ((A) * sizeof(struct squashfs_xattr_id))
0187
0188 #define SQUASHFS_XATTR_BLOCK(A) (SQUASHFS_XATTR_BYTES(A) / \
0189 SQUASHFS_METADATA_SIZE)
0190
0191 #define SQUASHFS_XATTR_BLOCK_OFFSET(A) (SQUASHFS_XATTR_BYTES(A) % \
0192 SQUASHFS_METADATA_SIZE)
0193
0194 #define SQUASHFS_XATTR_BLOCKS(A) ((SQUASHFS_XATTR_BYTES(A) + \
0195 SQUASHFS_METADATA_SIZE - 1) / \
0196 SQUASHFS_METADATA_SIZE)
0197
0198 #define SQUASHFS_XATTR_BLOCK_BYTES(A) (SQUASHFS_XATTR_BLOCKS(A) *\
0199 sizeof(u64))
0200 #define SQUASHFS_XATTR_BLK(A) ((unsigned int) ((A) >> 16))
0201
0202 #define SQUASHFS_XATTR_OFFSET(A) ((unsigned int) ((A) & 0xffff))
0203
0204
0205 #define SQUASHFS_CACHED_BLKS 8
0206
0207
0208 #define SQUASHFS_META_INDEXES (SQUASHFS_METADATA_SIZE / sizeof(unsigned int))
0209 #define SQUASHFS_META_ENTRIES 127
0210 #define SQUASHFS_META_SLOTS 8
0211
0212 struct meta_entry {
0213 u64 data_block;
0214 unsigned int index_block;
0215 unsigned short offset;
0216 unsigned short pad;
0217 };
0218
0219 struct meta_index {
0220 unsigned int inode_number;
0221 unsigned int offset;
0222 unsigned short entries;
0223 unsigned short skip;
0224 unsigned short locked;
0225 unsigned short pad;
0226 struct meta_entry meta_entry[SQUASHFS_META_ENTRIES];
0227 };
0228
0229
0230
0231
0232
0233 #define ZLIB_COMPRESSION 1
0234 #define LZMA_COMPRESSION 2
0235 #define LZO_COMPRESSION 3
0236 #define XZ_COMPRESSION 4
0237 #define LZ4_COMPRESSION 5
0238 #define ZSTD_COMPRESSION 6
0239
0240 struct squashfs_super_block {
0241 __le32 s_magic;
0242 __le32 inodes;
0243 __le32 mkfs_time;
0244 __le32 block_size;
0245 __le32 fragments;
0246 __le16 compression;
0247 __le16 block_log;
0248 __le16 flags;
0249 __le16 no_ids;
0250 __le16 s_major;
0251 __le16 s_minor;
0252 __le64 root_inode;
0253 __le64 bytes_used;
0254 __le64 id_table_start;
0255 __le64 xattr_id_table_start;
0256 __le64 inode_table_start;
0257 __le64 directory_table_start;
0258 __le64 fragment_table_start;
0259 __le64 lookup_table_start;
0260 };
0261
0262 struct squashfs_dir_index {
0263 __le32 index;
0264 __le32 start_block;
0265 __le32 size;
0266 unsigned char name[];
0267 };
0268
0269 struct squashfs_base_inode {
0270 __le16 inode_type;
0271 __le16 mode;
0272 __le16 uid;
0273 __le16 guid;
0274 __le32 mtime;
0275 __le32 inode_number;
0276 };
0277
0278 struct squashfs_ipc_inode {
0279 __le16 inode_type;
0280 __le16 mode;
0281 __le16 uid;
0282 __le16 guid;
0283 __le32 mtime;
0284 __le32 inode_number;
0285 __le32 nlink;
0286 };
0287
0288 struct squashfs_lipc_inode {
0289 __le16 inode_type;
0290 __le16 mode;
0291 __le16 uid;
0292 __le16 guid;
0293 __le32 mtime;
0294 __le32 inode_number;
0295 __le32 nlink;
0296 __le32 xattr;
0297 };
0298
0299 struct squashfs_dev_inode {
0300 __le16 inode_type;
0301 __le16 mode;
0302 __le16 uid;
0303 __le16 guid;
0304 __le32 mtime;
0305 __le32 inode_number;
0306 __le32 nlink;
0307 __le32 rdev;
0308 };
0309
0310 struct squashfs_ldev_inode {
0311 __le16 inode_type;
0312 __le16 mode;
0313 __le16 uid;
0314 __le16 guid;
0315 __le32 mtime;
0316 __le32 inode_number;
0317 __le32 nlink;
0318 __le32 rdev;
0319 __le32 xattr;
0320 };
0321
0322 struct squashfs_symlink_inode {
0323 __le16 inode_type;
0324 __le16 mode;
0325 __le16 uid;
0326 __le16 guid;
0327 __le32 mtime;
0328 __le32 inode_number;
0329 __le32 nlink;
0330 __le32 symlink_size;
0331 char symlink[];
0332 };
0333
0334 struct squashfs_reg_inode {
0335 __le16 inode_type;
0336 __le16 mode;
0337 __le16 uid;
0338 __le16 guid;
0339 __le32 mtime;
0340 __le32 inode_number;
0341 __le32 start_block;
0342 __le32 fragment;
0343 __le32 offset;
0344 __le32 file_size;
0345 __le16 block_list[];
0346 };
0347
0348 struct squashfs_lreg_inode {
0349 __le16 inode_type;
0350 __le16 mode;
0351 __le16 uid;
0352 __le16 guid;
0353 __le32 mtime;
0354 __le32 inode_number;
0355 __le64 start_block;
0356 __le64 file_size;
0357 __le64 sparse;
0358 __le32 nlink;
0359 __le32 fragment;
0360 __le32 offset;
0361 __le32 xattr;
0362 __le16 block_list[];
0363 };
0364
0365 struct squashfs_dir_inode {
0366 __le16 inode_type;
0367 __le16 mode;
0368 __le16 uid;
0369 __le16 guid;
0370 __le32 mtime;
0371 __le32 inode_number;
0372 __le32 start_block;
0373 __le32 nlink;
0374 __le16 file_size;
0375 __le16 offset;
0376 __le32 parent_inode;
0377 };
0378
0379 struct squashfs_ldir_inode {
0380 __le16 inode_type;
0381 __le16 mode;
0382 __le16 uid;
0383 __le16 guid;
0384 __le32 mtime;
0385 __le32 inode_number;
0386 __le32 nlink;
0387 __le32 file_size;
0388 __le32 start_block;
0389 __le32 parent_inode;
0390 __le16 i_count;
0391 __le16 offset;
0392 __le32 xattr;
0393 struct squashfs_dir_index index[];
0394 };
0395
0396 union squashfs_inode {
0397 struct squashfs_base_inode base;
0398 struct squashfs_dev_inode dev;
0399 struct squashfs_ldev_inode ldev;
0400 struct squashfs_symlink_inode symlink;
0401 struct squashfs_reg_inode reg;
0402 struct squashfs_lreg_inode lreg;
0403 struct squashfs_dir_inode dir;
0404 struct squashfs_ldir_inode ldir;
0405 struct squashfs_ipc_inode ipc;
0406 struct squashfs_lipc_inode lipc;
0407 };
0408
0409 struct squashfs_dir_entry {
0410 __le16 offset;
0411 __le16 inode_number;
0412 __le16 type;
0413 __le16 size;
0414 char name[];
0415 };
0416
0417 struct squashfs_dir_header {
0418 __le32 count;
0419 __le32 start_block;
0420 __le32 inode_number;
0421 };
0422
0423 struct squashfs_fragment_entry {
0424 __le64 start_block;
0425 __le32 size;
0426 unsigned int unused;
0427 };
0428
0429 struct squashfs_xattr_entry {
0430 __le16 type;
0431 __le16 size;
0432 char data[];
0433 };
0434
0435 struct squashfs_xattr_val {
0436 __le32 vsize;
0437 char value[];
0438 };
0439
0440 struct squashfs_xattr_id {
0441 __le64 xattr;
0442 __le32 count;
0443 __le32 size;
0444 };
0445
0446 struct squashfs_xattr_id_table {
0447 __le64 xattr_table_start;
0448 __le32 xattr_ids;
0449 __le32 unused;
0450 };
0451
0452 #endif