Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 #ifndef SQUASHFS_FS
0003 #define SQUASHFS_FS
0004 /*
0005  * Squashfs
0006  *
0007  * Copyright (c) 2002, 2003, 2004, 2005, 2006, 2007, 2008
0008  * Phillip Lougher <phillip@squashfs.org.uk>
0009  *
0010  * squashfs_fs.h
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 /* size of metadata (inode and directory) blocks */
0019 #define SQUASHFS_METADATA_SIZE      8192
0020 #define SQUASHFS_BLOCK_OFFSET       2
0021 
0022 /* default size of block device I/O */
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 /* Max length of filename (not 255) */
0033 #define SQUASHFS_NAME_LEN       256
0034 
0035 /* Max value for directory header count*/
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 /* Filesystem flags */
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 /* Inode types including extended types */
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 /* Max type value stored in directory entry */
0095 #define SQUASHFS_MAX_DIR_TYPE       7
0096 
0097 /* Xattr types */
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 /* Flag whether block is compressed or uncompressed, bit is set if block is
0105  * uncompressed */
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  * Inode number ops.  Inodes consist of a compressed block number, and an
0128  * uncompressed offset within that block
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 /* fragment and fragment table defines */
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 /* inode lookup table defines */
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 /* uid/gid lookup table defines */
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 /* xattr id lookup table defines */
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 /* cached data constants for filesystem */
0205 #define SQUASHFS_CACHED_BLKS        8
0206 
0207 /* meta index cache */
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  * definitions for structures on disk
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