1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (C) 2020 Bootlin
5 * Author: Joao Marcos Costa <joaomarcos.costa@bootlin.com>
8 #ifndef SQFS_FILESYSTEM_H
9 #define SQFS_FILESYSTEM_H
11 #include <asm/unaligned.h>
16 #define SQFS_UNCOMPRESSED_DATA 0x0002
17 #define SQFS_MAGIC_NUMBER 0x73717368
18 /* The three first members of squashfs_dir_index make a total of 12 bytes */
19 #define SQFS_DIR_INDEX_BASE_LENGTH 12
20 /* size of metadata (inode and directory) blocks */
21 #define SQFS_METADATA_BLOCK_SIZE 8192
22 /* Max. number of fragment entries in a metadata block is 512 */
23 #define SQFS_MAX_ENTRIES 512
24 /* Metadata blocks start by a 2-byte length header */
25 #define SQFS_HEADER_SIZE 2
26 #define SQFS_LREG_INODE_MIN_SIZE 56
27 #define SQFS_DIR_HEADER_SIZE 12
28 #define SQFS_MISC_ENTRY_TYPE -1
29 #define SQFS_EMPTY_FILE_SIZE 3
30 #define SQFS_STOP_READDIR 1
31 #define SQFS_EMPTY_DIR -1
33 * A directory entry object has a fixed length of 8 bytes, corresponding to its
34 * first four members, plus the size of the entry name, which is equal to
35 * 'entry_name' + 1 bytes.
37 #define SQFS_ENTRY_BASE_LENGTH 8
39 #define SQFS_DIR_TYPE 1
40 #define SQFS_REG_TYPE 2
41 #define SQFS_SYMLINK_TYPE 3
42 #define SQFS_BLKDEV_TYPE 4
43 #define SQFS_CHRDEV_TYPE 5
44 #define SQFS_FIFO_TYPE 6
45 #define SQFS_SOCKET_TYPE 7
46 #define SQFS_LDIR_TYPE 8
47 #define SQFS_LREG_TYPE 9
48 #define SQFS_LSYMLINK_TYPE 10
49 #define SQFS_LBLKDEV_TYPE 11
50 #define SQFS_LCHRDEV_TYPE 12
51 #define SQFS_LFIFO_TYPE 13
52 #define SQFS_LSOCKET_TYPE 14
54 struct squashfs_super_block {
68 __le64 id_table_start;
69 __le64 xattr_id_table_start;
70 __le64 inode_table_start;
71 __le64 directory_table_start;
72 __le64 fragment_table_start;
73 __le64 export_table_start;
76 struct squashfs_ctxt {
77 struct disk_partition cur_part_info;
78 struct blk_desc *cur_dev;
79 struct squashfs_super_block *sblk;
80 #if IS_ENABLED(CONFIG_ZSTD)
85 struct squashfs_directory_index {
92 struct squashfs_base_inode {
101 struct squashfs_ipc_inode {
111 struct squashfs_lipc_inode {
122 struct squashfs_dev_inode {
133 struct squashfs_ldev_inode {
145 struct squashfs_symlink_inode {
157 struct squashfs_reg_inode {
168 __le32 block_list[0];
171 struct squashfs_lreg_inode {
185 __le32 block_list[0];
188 struct squashfs_dir_inode {
202 struct squashfs_ldir_inode {
216 struct squashfs_directory_index index[0];
219 union squashfs_inode {
220 struct squashfs_base_inode *base;
221 struct squashfs_dev_inode *dev;
222 struct squashfs_ldev_inode *ldev;
223 struct squashfs_symlink_inode *symlink;
224 struct squashfs_reg_inode *reg;
225 struct squashfs_lreg_inode *lreg;
226 struct squashfs_dir_inode *dir;
227 struct squashfs_ldir_inode *ldir;
228 struct squashfs_ipc_inode *ipc;
229 struct squashfs_lipc_inode *lipc;
232 struct squashfs_directory_entry {
240 struct squashfs_directory_header {
246 struct squashfs_fragment_block_entry {
252 struct squashfs_dir_stream {
253 struct fs_dir_stream fs_dirs;
254 struct fs_dirent dentp;
256 * 'size' is the uncompressed size of the entire listing, including
257 * headers. 'entry_count' is the number of entries following a
258 * specific header. Both variables are decremented in sqfs_readdir() so
259 * the function knows when the end of the directory is reached.
263 /* SquashFS structures */
264 struct squashfs_directory_header *dir_header;
265 struct squashfs_directory_entry *entry;
267 * 'table' points to a position into the directory table. Both 'table'
268 * and 'inode' are defined for the first time in sqfs_opendir().
269 * 'table's value changes in sqfs_readdir().
271 unsigned char *table;
272 union squashfs_inode i;
273 struct squashfs_dir_inode i_dir;
274 struct squashfs_ldir_inode i_ldir;
276 * References to the tables' beginnings. They are assigned in
277 * sqfs_opendir() and freed in sqfs_closedir().
279 unsigned char *inode_table;
280 unsigned char *dir_table;
283 struct squashfs_file_info {
284 /* File size in bytes (uncompressed) */
286 /* Reference to list of data blocks's sizes */
288 /* Offset into the fragment block */
290 /* Offset in which the data blocks begin */
292 /* Is file fragmented? */
294 /* Compressed fragment */
298 void *sqfs_find_inode(void *inode_table, int inode_number, __le32 inode_count,
301 int sqfs_dir_offset(void *dir_i, u32 *m_list, int m_count);
303 int sqfs_read_metablock(unsigned char *file_mapping, int offset,
304 bool *compressed, u32 *data_size);
306 bool sqfs_is_empty_dir(void *dir_i);
308 bool sqfs_is_dir(u16 type);
310 #endif /* SQFS_FILESYSTEM_H */