162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * This file is part of UBIFS. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2006-2008 Nokia Corporation. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Authors: Artem Bityutskiy (Битюцкий Артём) 862306a36Sopenharmony_ci * Adrian Hunter 962306a36Sopenharmony_ci */ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* 1262306a36Sopenharmony_ci * This file describes UBIFS on-flash format and contains definitions of all the 1362306a36Sopenharmony_ci * relevant data structures and constants. 1462306a36Sopenharmony_ci * 1562306a36Sopenharmony_ci * All UBIFS on-flash objects are stored in the form of nodes. All nodes start 1662306a36Sopenharmony_ci * with the UBIFS node magic number and have the same common header. Nodes 1762306a36Sopenharmony_ci * always sit at 8-byte aligned positions on the media and node header sizes are 1862306a36Sopenharmony_ci * also 8-byte aligned (except for the indexing node and the padding node). 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#ifndef __UBIFS_MEDIA_H__ 2262306a36Sopenharmony_ci#define __UBIFS_MEDIA_H__ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* UBIFS node magic number (must not have the padding byte first or last) */ 2562306a36Sopenharmony_ci#define UBIFS_NODE_MAGIC 0x06101831 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci * UBIFS on-flash format version. This version is increased when the on-flash 2962306a36Sopenharmony_ci * format is changing. If this happens, UBIFS is will support older versions as 3062306a36Sopenharmony_ci * well. But older UBIFS code will not support newer formats. Format changes 3162306a36Sopenharmony_ci * will be rare and only when absolutely necessary, e.g. to fix a bug or to add 3262306a36Sopenharmony_ci * a new feature. 3362306a36Sopenharmony_ci * 3462306a36Sopenharmony_ci * UBIFS went into mainline kernel with format version 4. The older formats 3562306a36Sopenharmony_ci * were development formats. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci#define UBIFS_FORMAT_VERSION 5 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/* 4062306a36Sopenharmony_ci * Read-only compatibility version. If the UBIFS format is changed, older UBIFS 4162306a36Sopenharmony_ci * implementations will not be able to mount newer formats in read-write mode. 4262306a36Sopenharmony_ci * However, depending on the change, it may be possible to mount newer formats 4362306a36Sopenharmony_ci * in R/O mode. This is indicated by the R/O compatibility version which is 4462306a36Sopenharmony_ci * stored in the super-block. 4562306a36Sopenharmony_ci * 4662306a36Sopenharmony_ci * This is needed to support boot-loaders which only need R/O mounting. With 4762306a36Sopenharmony_ci * this flag it is possible to do UBIFS format changes without a need to update 4862306a36Sopenharmony_ci * boot-loaders. 4962306a36Sopenharmony_ci */ 5062306a36Sopenharmony_ci#define UBIFS_RO_COMPAT_VERSION 0 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/* Minimum logical eraseblock size in bytes */ 5362306a36Sopenharmony_ci#define UBIFS_MIN_LEB_SZ (15*1024) 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci/* Initial CRC32 value used when calculating CRC checksums */ 5662306a36Sopenharmony_ci#define UBIFS_CRC32_INIT 0xFFFFFFFFU 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci/* 5962306a36Sopenharmony_ci * UBIFS does not try to compress data if its length is less than the below 6062306a36Sopenharmony_ci * constant. 6162306a36Sopenharmony_ci */ 6262306a36Sopenharmony_ci#define UBIFS_MIN_COMPR_LEN 128 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci/* 6562306a36Sopenharmony_ci * If compressed data length is less than %UBIFS_MIN_COMPRESS_DIFF bytes 6662306a36Sopenharmony_ci * shorter than uncompressed data length, UBIFS prefers to leave this data 6762306a36Sopenharmony_ci * node uncompress, because it'll be read faster. 6862306a36Sopenharmony_ci */ 6962306a36Sopenharmony_ci#define UBIFS_MIN_COMPRESS_DIFF 64 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci/* Root inode number */ 7262306a36Sopenharmony_ci#define UBIFS_ROOT_INO 1 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci/* Lowest inode number used for regular inodes (not UBIFS-only internal ones) */ 7562306a36Sopenharmony_ci#define UBIFS_FIRST_INO 64 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* 7862306a36Sopenharmony_ci * Maximum file name and extended attribute length (must be a multiple of 8, 7962306a36Sopenharmony_ci * minus 1). 8062306a36Sopenharmony_ci */ 8162306a36Sopenharmony_ci#define UBIFS_MAX_NLEN 255 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci/* Maximum number of data journal heads */ 8462306a36Sopenharmony_ci#define UBIFS_MAX_JHEADS 1 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci/* 8762306a36Sopenharmony_ci * Size of UBIFS data block. Note, UBIFS is not a block oriented file-system, 8862306a36Sopenharmony_ci * which means that it does not treat the underlying media as consisting of 8962306a36Sopenharmony_ci * blocks like in case of hard drives. Do not be confused. UBIFS block is just 9062306a36Sopenharmony_ci * the maximum amount of data which one data node can have or which can be 9162306a36Sopenharmony_ci * attached to an inode node. 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_ci#define UBIFS_BLOCK_SIZE 4096 9462306a36Sopenharmony_ci#define UBIFS_BLOCK_SHIFT 12 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci/* UBIFS padding byte pattern (must not be first or last byte of node magic) */ 9762306a36Sopenharmony_ci#define UBIFS_PADDING_BYTE 0xCE 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci/* Maximum possible key length */ 10062306a36Sopenharmony_ci#define UBIFS_MAX_KEY_LEN 16 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci/* Key length ("simple" format) */ 10362306a36Sopenharmony_ci#define UBIFS_SK_LEN 8 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci/* Minimum index tree fanout */ 10662306a36Sopenharmony_ci#define UBIFS_MIN_FANOUT 3 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci/* Maximum number of levels in UBIFS indexing B-tree */ 10962306a36Sopenharmony_ci#define UBIFS_MAX_LEVELS 512 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci/* Maximum amount of data attached to an inode in bytes */ 11262306a36Sopenharmony_ci#define UBIFS_MAX_INO_DATA UBIFS_BLOCK_SIZE 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci/* LEB Properties Tree fanout (must be power of 2) and fanout shift */ 11562306a36Sopenharmony_ci#define UBIFS_LPT_FANOUT 4 11662306a36Sopenharmony_ci#define UBIFS_LPT_FANOUT_SHIFT 2 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci/* LEB Properties Tree bit field sizes */ 11962306a36Sopenharmony_ci#define UBIFS_LPT_CRC_BITS 16 12062306a36Sopenharmony_ci#define UBIFS_LPT_CRC_BYTES 2 12162306a36Sopenharmony_ci#define UBIFS_LPT_TYPE_BITS 4 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci/* The key is always at the same position in all keyed nodes */ 12462306a36Sopenharmony_ci#define UBIFS_KEY_OFFSET offsetof(struct ubifs_ino_node, key) 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci/* Garbage collector journal head number */ 12762306a36Sopenharmony_ci#define UBIFS_GC_HEAD 0 12862306a36Sopenharmony_ci/* Base journal head number */ 12962306a36Sopenharmony_ci#define UBIFS_BASE_HEAD 1 13062306a36Sopenharmony_ci/* Data journal head number */ 13162306a36Sopenharmony_ci#define UBIFS_DATA_HEAD 2 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci/* 13462306a36Sopenharmony_ci * LEB Properties Tree node types. 13562306a36Sopenharmony_ci * 13662306a36Sopenharmony_ci * UBIFS_LPT_PNODE: LPT leaf node (contains LEB properties) 13762306a36Sopenharmony_ci * UBIFS_LPT_NNODE: LPT internal node 13862306a36Sopenharmony_ci * UBIFS_LPT_LTAB: LPT's own lprops table 13962306a36Sopenharmony_ci * UBIFS_LPT_LSAVE: LPT's save table (big model only) 14062306a36Sopenharmony_ci * UBIFS_LPT_NODE_CNT: count of LPT node types 14162306a36Sopenharmony_ci * UBIFS_LPT_NOT_A_NODE: all ones (15 for 4 bits) is never a valid node type 14262306a36Sopenharmony_ci */ 14362306a36Sopenharmony_cienum { 14462306a36Sopenharmony_ci UBIFS_LPT_PNODE, 14562306a36Sopenharmony_ci UBIFS_LPT_NNODE, 14662306a36Sopenharmony_ci UBIFS_LPT_LTAB, 14762306a36Sopenharmony_ci UBIFS_LPT_LSAVE, 14862306a36Sopenharmony_ci UBIFS_LPT_NODE_CNT, 14962306a36Sopenharmony_ci UBIFS_LPT_NOT_A_NODE = (1 << UBIFS_LPT_TYPE_BITS) - 1, 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci/* 15362306a36Sopenharmony_ci * UBIFS inode types. 15462306a36Sopenharmony_ci * 15562306a36Sopenharmony_ci * UBIFS_ITYPE_REG: regular file 15662306a36Sopenharmony_ci * UBIFS_ITYPE_DIR: directory 15762306a36Sopenharmony_ci * UBIFS_ITYPE_LNK: soft link 15862306a36Sopenharmony_ci * UBIFS_ITYPE_BLK: block device node 15962306a36Sopenharmony_ci * UBIFS_ITYPE_CHR: character device node 16062306a36Sopenharmony_ci * UBIFS_ITYPE_FIFO: fifo 16162306a36Sopenharmony_ci * UBIFS_ITYPE_SOCK: socket 16262306a36Sopenharmony_ci * UBIFS_ITYPES_CNT: count of supported file types 16362306a36Sopenharmony_ci */ 16462306a36Sopenharmony_cienum { 16562306a36Sopenharmony_ci UBIFS_ITYPE_REG, 16662306a36Sopenharmony_ci UBIFS_ITYPE_DIR, 16762306a36Sopenharmony_ci UBIFS_ITYPE_LNK, 16862306a36Sopenharmony_ci UBIFS_ITYPE_BLK, 16962306a36Sopenharmony_ci UBIFS_ITYPE_CHR, 17062306a36Sopenharmony_ci UBIFS_ITYPE_FIFO, 17162306a36Sopenharmony_ci UBIFS_ITYPE_SOCK, 17262306a36Sopenharmony_ci UBIFS_ITYPES_CNT, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci/* 17662306a36Sopenharmony_ci * Supported key hash functions. 17762306a36Sopenharmony_ci * 17862306a36Sopenharmony_ci * UBIFS_KEY_HASH_R5: R5 hash 17962306a36Sopenharmony_ci * UBIFS_KEY_HASH_TEST: test hash which just returns first 4 bytes of the name 18062306a36Sopenharmony_ci */ 18162306a36Sopenharmony_cienum { 18262306a36Sopenharmony_ci UBIFS_KEY_HASH_R5, 18362306a36Sopenharmony_ci UBIFS_KEY_HASH_TEST, 18462306a36Sopenharmony_ci}; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci/* 18762306a36Sopenharmony_ci * Supported key formats. 18862306a36Sopenharmony_ci * 18962306a36Sopenharmony_ci * UBIFS_SIMPLE_KEY_FMT: simple key format 19062306a36Sopenharmony_ci */ 19162306a36Sopenharmony_cienum { 19262306a36Sopenharmony_ci UBIFS_SIMPLE_KEY_FMT, 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci/* 19662306a36Sopenharmony_ci * The simple key format uses 29 bits for storing UBIFS block number and hash 19762306a36Sopenharmony_ci * value. 19862306a36Sopenharmony_ci */ 19962306a36Sopenharmony_ci#define UBIFS_S_KEY_BLOCK_BITS 29 20062306a36Sopenharmony_ci#define UBIFS_S_KEY_BLOCK_MASK 0x1FFFFFFF 20162306a36Sopenharmony_ci#define UBIFS_S_KEY_HASH_BITS UBIFS_S_KEY_BLOCK_BITS 20262306a36Sopenharmony_ci#define UBIFS_S_KEY_HASH_MASK UBIFS_S_KEY_BLOCK_MASK 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci/* 20562306a36Sopenharmony_ci * Key types. 20662306a36Sopenharmony_ci * 20762306a36Sopenharmony_ci * UBIFS_INO_KEY: inode node key 20862306a36Sopenharmony_ci * UBIFS_DATA_KEY: data node key 20962306a36Sopenharmony_ci * UBIFS_DENT_KEY: directory entry node key 21062306a36Sopenharmony_ci * UBIFS_XENT_KEY: extended attribute entry key 21162306a36Sopenharmony_ci * UBIFS_KEY_TYPES_CNT: number of supported key types 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_cienum { 21462306a36Sopenharmony_ci UBIFS_INO_KEY, 21562306a36Sopenharmony_ci UBIFS_DATA_KEY, 21662306a36Sopenharmony_ci UBIFS_DENT_KEY, 21762306a36Sopenharmony_ci UBIFS_XENT_KEY, 21862306a36Sopenharmony_ci UBIFS_KEY_TYPES_CNT, 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci/* Count of LEBs reserved for the superblock area */ 22262306a36Sopenharmony_ci#define UBIFS_SB_LEBS 1 22362306a36Sopenharmony_ci/* Count of LEBs reserved for the master area */ 22462306a36Sopenharmony_ci#define UBIFS_MST_LEBS 2 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci/* First LEB of the superblock area */ 22762306a36Sopenharmony_ci#define UBIFS_SB_LNUM 0 22862306a36Sopenharmony_ci/* First LEB of the master area */ 22962306a36Sopenharmony_ci#define UBIFS_MST_LNUM (UBIFS_SB_LNUM + UBIFS_SB_LEBS) 23062306a36Sopenharmony_ci/* First LEB of the log area */ 23162306a36Sopenharmony_ci#define UBIFS_LOG_LNUM (UBIFS_MST_LNUM + UBIFS_MST_LEBS) 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci/* 23462306a36Sopenharmony_ci * The below constants define the absolute minimum values for various UBIFS 23562306a36Sopenharmony_ci * media areas. Many of them actually depend of flash geometry and the FS 23662306a36Sopenharmony_ci * configuration (number of journal heads, orphan LEBs, etc). This means that 23762306a36Sopenharmony_ci * the smallest volume size which can be used for UBIFS cannot be pre-defined 23862306a36Sopenharmony_ci * by these constants. The file-system that meets the below limitation will not 23962306a36Sopenharmony_ci * necessarily mount. UBIFS does run-time calculations and validates the FS 24062306a36Sopenharmony_ci * size. 24162306a36Sopenharmony_ci */ 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci/* Minimum number of logical eraseblocks in the log */ 24462306a36Sopenharmony_ci#define UBIFS_MIN_LOG_LEBS 2 24562306a36Sopenharmony_ci/* Minimum number of bud logical eraseblocks (one for each head) */ 24662306a36Sopenharmony_ci#define UBIFS_MIN_BUD_LEBS 3 24762306a36Sopenharmony_ci/* Minimum number of journal logical eraseblocks */ 24862306a36Sopenharmony_ci#define UBIFS_MIN_JNL_LEBS (UBIFS_MIN_LOG_LEBS + UBIFS_MIN_BUD_LEBS) 24962306a36Sopenharmony_ci/* Minimum number of LPT area logical eraseblocks */ 25062306a36Sopenharmony_ci#define UBIFS_MIN_LPT_LEBS 2 25162306a36Sopenharmony_ci/* Minimum number of orphan area logical eraseblocks */ 25262306a36Sopenharmony_ci#define UBIFS_MIN_ORPH_LEBS 1 25362306a36Sopenharmony_ci/* 25462306a36Sopenharmony_ci * Minimum number of main area logical eraseblocks (buds, 3 for the index, 1 25562306a36Sopenharmony_ci * for GC, 1 for deletions, and at least 1 for committed data). 25662306a36Sopenharmony_ci */ 25762306a36Sopenharmony_ci#define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 6) 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* Minimum number of logical eraseblocks */ 26062306a36Sopenharmony_ci#define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ 26162306a36Sopenharmony_ci UBIFS_MIN_LOG_LEBS + UBIFS_MIN_LPT_LEBS + \ 26262306a36Sopenharmony_ci UBIFS_MIN_ORPH_LEBS + UBIFS_MIN_MAIN_LEBS) 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci/* Node sizes (N.B. these are guaranteed to be multiples of 8) */ 26562306a36Sopenharmony_ci#define UBIFS_CH_SZ sizeof(struct ubifs_ch) 26662306a36Sopenharmony_ci#define UBIFS_INO_NODE_SZ sizeof(struct ubifs_ino_node) 26762306a36Sopenharmony_ci#define UBIFS_DATA_NODE_SZ sizeof(struct ubifs_data_node) 26862306a36Sopenharmony_ci#define UBIFS_DENT_NODE_SZ sizeof(struct ubifs_dent_node) 26962306a36Sopenharmony_ci#define UBIFS_TRUN_NODE_SZ sizeof(struct ubifs_trun_node) 27062306a36Sopenharmony_ci#define UBIFS_PAD_NODE_SZ sizeof(struct ubifs_pad_node) 27162306a36Sopenharmony_ci#define UBIFS_SB_NODE_SZ sizeof(struct ubifs_sb_node) 27262306a36Sopenharmony_ci#define UBIFS_MST_NODE_SZ sizeof(struct ubifs_mst_node) 27362306a36Sopenharmony_ci#define UBIFS_REF_NODE_SZ sizeof(struct ubifs_ref_node) 27462306a36Sopenharmony_ci#define UBIFS_IDX_NODE_SZ sizeof(struct ubifs_idx_node) 27562306a36Sopenharmony_ci#define UBIFS_CS_NODE_SZ sizeof(struct ubifs_cs_node) 27662306a36Sopenharmony_ci#define UBIFS_ORPH_NODE_SZ sizeof(struct ubifs_orph_node) 27762306a36Sopenharmony_ci#define UBIFS_AUTH_NODE_SZ sizeof(struct ubifs_auth_node) 27862306a36Sopenharmony_ci#define UBIFS_SIG_NODE_SZ sizeof(struct ubifs_sig_node) 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci/* Extended attribute entry nodes are identical to directory entry nodes */ 28162306a36Sopenharmony_ci#define UBIFS_XENT_NODE_SZ UBIFS_DENT_NODE_SZ 28262306a36Sopenharmony_ci/* Only this does not have to be multiple of 8 bytes */ 28362306a36Sopenharmony_ci#define UBIFS_BRANCH_SZ sizeof(struct ubifs_branch) 28462306a36Sopenharmony_ci 28562306a36Sopenharmony_ci/* Maximum node sizes (N.B. these are guaranteed to be multiples of 8) */ 28662306a36Sopenharmony_ci#define UBIFS_MAX_DATA_NODE_SZ (UBIFS_DATA_NODE_SZ + UBIFS_BLOCK_SIZE) 28762306a36Sopenharmony_ci#define UBIFS_MAX_INO_NODE_SZ (UBIFS_INO_NODE_SZ + UBIFS_MAX_INO_DATA) 28862306a36Sopenharmony_ci#define UBIFS_MAX_DENT_NODE_SZ (UBIFS_DENT_NODE_SZ + UBIFS_MAX_NLEN + 1) 28962306a36Sopenharmony_ci#define UBIFS_MAX_XENT_NODE_SZ UBIFS_MAX_DENT_NODE_SZ 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci/* The largest UBIFS node */ 29262306a36Sopenharmony_ci#define UBIFS_MAX_NODE_SZ UBIFS_MAX_INO_NODE_SZ 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/* The maxmimum size of a hash, enough for sha512 */ 29562306a36Sopenharmony_ci#define UBIFS_MAX_HASH_LEN 64 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ci/* The maxmimum size of a hmac, enough for hmac(sha512) */ 29862306a36Sopenharmony_ci#define UBIFS_MAX_HMAC_LEN 64 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/* 30162306a36Sopenharmony_ci * xattr name of UBIFS encryption context, we don't use a prefix 30262306a36Sopenharmony_ci * nor a long name to not waste space on the flash. 30362306a36Sopenharmony_ci */ 30462306a36Sopenharmony_ci#define UBIFS_XATTR_NAME_ENCRYPTION_CONTEXT "c" 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/* Type field in ubifs_sig_node */ 30762306a36Sopenharmony_ci#define UBIFS_SIGNATURE_TYPE_PKCS7 1 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci/* 31062306a36Sopenharmony_ci * On-flash inode flags. 31162306a36Sopenharmony_ci * 31262306a36Sopenharmony_ci * UBIFS_COMPR_FL: use compression for this inode 31362306a36Sopenharmony_ci * UBIFS_SYNC_FL: I/O on this inode has to be synchronous 31462306a36Sopenharmony_ci * UBIFS_IMMUTABLE_FL: inode is immutable 31562306a36Sopenharmony_ci * UBIFS_APPEND_FL: writes to the inode may only append data 31662306a36Sopenharmony_ci * UBIFS_DIRSYNC_FL: I/O on this directory inode has to be synchronous 31762306a36Sopenharmony_ci * UBIFS_XATTR_FL: this inode is the inode for an extended attribute value 31862306a36Sopenharmony_ci * UBIFS_CRYPT_FL: use encryption for this inode 31962306a36Sopenharmony_ci * 32062306a36Sopenharmony_ci * Note, these are on-flash flags which correspond to ioctl flags 32162306a36Sopenharmony_ci * (@FS_COMPR_FL, etc). They have the same values now, but generally, do not 32262306a36Sopenharmony_ci * have to be the same. 32362306a36Sopenharmony_ci */ 32462306a36Sopenharmony_cienum { 32562306a36Sopenharmony_ci UBIFS_COMPR_FL = 0x01, 32662306a36Sopenharmony_ci UBIFS_SYNC_FL = 0x02, 32762306a36Sopenharmony_ci UBIFS_IMMUTABLE_FL = 0x04, 32862306a36Sopenharmony_ci UBIFS_APPEND_FL = 0x08, 32962306a36Sopenharmony_ci UBIFS_DIRSYNC_FL = 0x10, 33062306a36Sopenharmony_ci UBIFS_XATTR_FL = 0x20, 33162306a36Sopenharmony_ci UBIFS_CRYPT_FL = 0x40, 33262306a36Sopenharmony_ci}; 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci/* Inode flag bits used by UBIFS */ 33562306a36Sopenharmony_ci#define UBIFS_FL_MASK 0x0000001F 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci/* 33862306a36Sopenharmony_ci * UBIFS compression algorithms. 33962306a36Sopenharmony_ci * 34062306a36Sopenharmony_ci * UBIFS_COMPR_NONE: no compression 34162306a36Sopenharmony_ci * UBIFS_COMPR_LZO: LZO compression 34262306a36Sopenharmony_ci * UBIFS_COMPR_ZLIB: ZLIB compression 34362306a36Sopenharmony_ci * UBIFS_COMPR_ZSTD: ZSTD compression 34462306a36Sopenharmony_ci * UBIFS_COMPR_TYPES_CNT: count of supported compression types 34562306a36Sopenharmony_ci */ 34662306a36Sopenharmony_cienum { 34762306a36Sopenharmony_ci UBIFS_COMPR_NONE, 34862306a36Sopenharmony_ci UBIFS_COMPR_LZO, 34962306a36Sopenharmony_ci UBIFS_COMPR_ZLIB, 35062306a36Sopenharmony_ci UBIFS_COMPR_ZSTD, 35162306a36Sopenharmony_ci UBIFS_COMPR_TYPES_CNT, 35262306a36Sopenharmony_ci}; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci/* 35562306a36Sopenharmony_ci * UBIFS node types. 35662306a36Sopenharmony_ci * 35762306a36Sopenharmony_ci * UBIFS_INO_NODE: inode node 35862306a36Sopenharmony_ci * UBIFS_DATA_NODE: data node 35962306a36Sopenharmony_ci * UBIFS_DENT_NODE: directory entry node 36062306a36Sopenharmony_ci * UBIFS_XENT_NODE: extended attribute node 36162306a36Sopenharmony_ci * UBIFS_TRUN_NODE: truncation node 36262306a36Sopenharmony_ci * UBIFS_PAD_NODE: padding node 36362306a36Sopenharmony_ci * UBIFS_SB_NODE: superblock node 36462306a36Sopenharmony_ci * UBIFS_MST_NODE: master node 36562306a36Sopenharmony_ci * UBIFS_REF_NODE: LEB reference node 36662306a36Sopenharmony_ci * UBIFS_IDX_NODE: index node 36762306a36Sopenharmony_ci * UBIFS_CS_NODE: commit start node 36862306a36Sopenharmony_ci * UBIFS_ORPH_NODE: orphan node 36962306a36Sopenharmony_ci * UBIFS_AUTH_NODE: authentication node 37062306a36Sopenharmony_ci * UBIFS_SIG_NODE: signature node 37162306a36Sopenharmony_ci * UBIFS_NODE_TYPES_CNT: count of supported node types 37262306a36Sopenharmony_ci * 37362306a36Sopenharmony_ci * Note, we index arrays by these numbers, so keep them low and contiguous. 37462306a36Sopenharmony_ci * Node type constants for inodes, direntries and so on have to be the same as 37562306a36Sopenharmony_ci * corresponding key type constants. 37662306a36Sopenharmony_ci */ 37762306a36Sopenharmony_cienum { 37862306a36Sopenharmony_ci UBIFS_INO_NODE, 37962306a36Sopenharmony_ci UBIFS_DATA_NODE, 38062306a36Sopenharmony_ci UBIFS_DENT_NODE, 38162306a36Sopenharmony_ci UBIFS_XENT_NODE, 38262306a36Sopenharmony_ci UBIFS_TRUN_NODE, 38362306a36Sopenharmony_ci UBIFS_PAD_NODE, 38462306a36Sopenharmony_ci UBIFS_SB_NODE, 38562306a36Sopenharmony_ci UBIFS_MST_NODE, 38662306a36Sopenharmony_ci UBIFS_REF_NODE, 38762306a36Sopenharmony_ci UBIFS_IDX_NODE, 38862306a36Sopenharmony_ci UBIFS_CS_NODE, 38962306a36Sopenharmony_ci UBIFS_ORPH_NODE, 39062306a36Sopenharmony_ci UBIFS_AUTH_NODE, 39162306a36Sopenharmony_ci UBIFS_SIG_NODE, 39262306a36Sopenharmony_ci UBIFS_NODE_TYPES_CNT, 39362306a36Sopenharmony_ci}; 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci/* 39662306a36Sopenharmony_ci * Master node flags. 39762306a36Sopenharmony_ci * 39862306a36Sopenharmony_ci * UBIFS_MST_DIRTY: rebooted uncleanly - master node is dirty 39962306a36Sopenharmony_ci * UBIFS_MST_NO_ORPHS: no orphan inodes present 40062306a36Sopenharmony_ci * UBIFS_MST_RCVRY: written by recovery 40162306a36Sopenharmony_ci */ 40262306a36Sopenharmony_cienum { 40362306a36Sopenharmony_ci UBIFS_MST_DIRTY = 1, 40462306a36Sopenharmony_ci UBIFS_MST_NO_ORPHS = 2, 40562306a36Sopenharmony_ci UBIFS_MST_RCVRY = 4, 40662306a36Sopenharmony_ci}; 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_ci/* 40962306a36Sopenharmony_ci * Node group type (used by recovery to recover whole group or none). 41062306a36Sopenharmony_ci * 41162306a36Sopenharmony_ci * UBIFS_NO_NODE_GROUP: this node is not part of a group 41262306a36Sopenharmony_ci * UBIFS_IN_NODE_GROUP: this node is a part of a group 41362306a36Sopenharmony_ci * UBIFS_LAST_OF_NODE_GROUP: this node is the last in a group 41462306a36Sopenharmony_ci */ 41562306a36Sopenharmony_cienum { 41662306a36Sopenharmony_ci UBIFS_NO_NODE_GROUP = 0, 41762306a36Sopenharmony_ci UBIFS_IN_NODE_GROUP, 41862306a36Sopenharmony_ci UBIFS_LAST_OF_NODE_GROUP, 41962306a36Sopenharmony_ci}; 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ci/* 42262306a36Sopenharmony_ci * Superblock flags. 42362306a36Sopenharmony_ci * 42462306a36Sopenharmony_ci * UBIFS_FLG_BIGLPT: if "big" LPT model is used if set 42562306a36Sopenharmony_ci * UBIFS_FLG_SPACE_FIXUP: first-mount "fixup" of free space within LEBs needed 42662306a36Sopenharmony_ci * UBIFS_FLG_DOUBLE_HASH: store a 32bit cookie in directory entry nodes to 42762306a36Sopenharmony_ci * support 64bit cookies for lookups by hash 42862306a36Sopenharmony_ci * UBIFS_FLG_ENCRYPTION: this filesystem contains encrypted files 42962306a36Sopenharmony_ci * UBIFS_FLG_AUTHENTICATION: this filesystem contains hashes for authentication 43062306a36Sopenharmony_ci */ 43162306a36Sopenharmony_cienum { 43262306a36Sopenharmony_ci UBIFS_FLG_BIGLPT = 0x02, 43362306a36Sopenharmony_ci UBIFS_FLG_SPACE_FIXUP = 0x04, 43462306a36Sopenharmony_ci UBIFS_FLG_DOUBLE_HASH = 0x08, 43562306a36Sopenharmony_ci UBIFS_FLG_ENCRYPTION = 0x10, 43662306a36Sopenharmony_ci UBIFS_FLG_AUTHENTICATION = 0x20, 43762306a36Sopenharmony_ci}; 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci#define UBIFS_FLG_MASK (UBIFS_FLG_BIGLPT | UBIFS_FLG_SPACE_FIXUP | \ 44062306a36Sopenharmony_ci UBIFS_FLG_DOUBLE_HASH | UBIFS_FLG_ENCRYPTION | \ 44162306a36Sopenharmony_ci UBIFS_FLG_AUTHENTICATION) 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci/** 44462306a36Sopenharmony_ci * struct ubifs_ch - common header node. 44562306a36Sopenharmony_ci * @magic: UBIFS node magic number (%UBIFS_NODE_MAGIC) 44662306a36Sopenharmony_ci * @crc: CRC-32 checksum of the node header 44762306a36Sopenharmony_ci * @sqnum: sequence number 44862306a36Sopenharmony_ci * @len: full node length 44962306a36Sopenharmony_ci * @node_type: node type 45062306a36Sopenharmony_ci * @group_type: node group type 45162306a36Sopenharmony_ci * @padding: reserved for future, zeroes 45262306a36Sopenharmony_ci * 45362306a36Sopenharmony_ci * Every UBIFS node starts with this common part. If the node has a key, the 45462306a36Sopenharmony_ci * key always goes next. 45562306a36Sopenharmony_ci */ 45662306a36Sopenharmony_cistruct ubifs_ch { 45762306a36Sopenharmony_ci __le32 magic; 45862306a36Sopenharmony_ci __le32 crc; 45962306a36Sopenharmony_ci __le64 sqnum; 46062306a36Sopenharmony_ci __le32 len; 46162306a36Sopenharmony_ci __u8 node_type; 46262306a36Sopenharmony_ci __u8 group_type; 46362306a36Sopenharmony_ci __u8 padding[2]; 46462306a36Sopenharmony_ci} __packed; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci/** 46762306a36Sopenharmony_ci * union ubifs_dev_desc - device node descriptor. 46862306a36Sopenharmony_ci * @new: new type device descriptor 46962306a36Sopenharmony_ci * @huge: huge type device descriptor 47062306a36Sopenharmony_ci * 47162306a36Sopenharmony_ci * This data structure describes major/minor numbers of a device node. In an 47262306a36Sopenharmony_ci * inode is a device node then its data contains an object of this type. UBIFS 47362306a36Sopenharmony_ci * uses standard Linux "new" and "huge" device node encodings. 47462306a36Sopenharmony_ci */ 47562306a36Sopenharmony_ciunion ubifs_dev_desc { 47662306a36Sopenharmony_ci __le32 new; 47762306a36Sopenharmony_ci __le64 huge; 47862306a36Sopenharmony_ci} __packed; 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci/** 48162306a36Sopenharmony_ci * struct ubifs_ino_node - inode node. 48262306a36Sopenharmony_ci * @ch: common header 48362306a36Sopenharmony_ci * @key: node key 48462306a36Sopenharmony_ci * @creat_sqnum: sequence number at time of creation 48562306a36Sopenharmony_ci * @size: inode size in bytes (amount of uncompressed data) 48662306a36Sopenharmony_ci * @atime_sec: access time seconds 48762306a36Sopenharmony_ci * @ctime_sec: creation time seconds 48862306a36Sopenharmony_ci * @mtime_sec: modification time seconds 48962306a36Sopenharmony_ci * @atime_nsec: access time nanoseconds 49062306a36Sopenharmony_ci * @ctime_nsec: creation time nanoseconds 49162306a36Sopenharmony_ci * @mtime_nsec: modification time nanoseconds 49262306a36Sopenharmony_ci * @nlink: number of hard links 49362306a36Sopenharmony_ci * @uid: owner ID 49462306a36Sopenharmony_ci * @gid: group ID 49562306a36Sopenharmony_ci * @mode: access flags 49662306a36Sopenharmony_ci * @flags: per-inode flags (%UBIFS_COMPR_FL, %UBIFS_SYNC_FL, etc) 49762306a36Sopenharmony_ci * @data_len: inode data length 49862306a36Sopenharmony_ci * @xattr_cnt: count of extended attributes this inode has 49962306a36Sopenharmony_ci * @xattr_size: summarized size of all extended attributes in bytes 50062306a36Sopenharmony_ci * @padding1: reserved for future, zeroes 50162306a36Sopenharmony_ci * @xattr_names: sum of lengths of all extended attribute names belonging to 50262306a36Sopenharmony_ci * this inode 50362306a36Sopenharmony_ci * @compr_type: compression type used for this inode 50462306a36Sopenharmony_ci * @padding2: reserved for future, zeroes 50562306a36Sopenharmony_ci * @data: data attached to the inode 50662306a36Sopenharmony_ci * 50762306a36Sopenharmony_ci * Note, even though inode compression type is defined by @compr_type, some 50862306a36Sopenharmony_ci * nodes of this inode may be compressed with different compressor - this 50962306a36Sopenharmony_ci * happens if compression type is changed while the inode already has data 51062306a36Sopenharmony_ci * nodes. But @compr_type will be use for further writes to the inode. 51162306a36Sopenharmony_ci * 51262306a36Sopenharmony_ci * Note, do not forget to amend 'zero_ino_node_unused()' function when changing 51362306a36Sopenharmony_ci * the padding fields. 51462306a36Sopenharmony_ci */ 51562306a36Sopenharmony_cistruct ubifs_ino_node { 51662306a36Sopenharmony_ci struct ubifs_ch ch; 51762306a36Sopenharmony_ci __u8 key[UBIFS_MAX_KEY_LEN]; 51862306a36Sopenharmony_ci __le64 creat_sqnum; 51962306a36Sopenharmony_ci __le64 size; 52062306a36Sopenharmony_ci __le64 atime_sec; 52162306a36Sopenharmony_ci __le64 ctime_sec; 52262306a36Sopenharmony_ci __le64 mtime_sec; 52362306a36Sopenharmony_ci __le32 atime_nsec; 52462306a36Sopenharmony_ci __le32 ctime_nsec; 52562306a36Sopenharmony_ci __le32 mtime_nsec; 52662306a36Sopenharmony_ci __le32 nlink; 52762306a36Sopenharmony_ci __le32 uid; 52862306a36Sopenharmony_ci __le32 gid; 52962306a36Sopenharmony_ci __le32 mode; 53062306a36Sopenharmony_ci __le32 flags; 53162306a36Sopenharmony_ci __le32 data_len; 53262306a36Sopenharmony_ci __le32 xattr_cnt; 53362306a36Sopenharmony_ci __le32 xattr_size; 53462306a36Sopenharmony_ci __u8 padding1[4]; /* Watch 'zero_ino_node_unused()' if changing! */ 53562306a36Sopenharmony_ci __le32 xattr_names; 53662306a36Sopenharmony_ci __le16 compr_type; 53762306a36Sopenharmony_ci __u8 padding2[26]; /* Watch 'zero_ino_node_unused()' if changing! */ 53862306a36Sopenharmony_ci __u8 data[]; 53962306a36Sopenharmony_ci} __packed; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci/** 54262306a36Sopenharmony_ci * struct ubifs_dent_node - directory entry node. 54362306a36Sopenharmony_ci * @ch: common header 54462306a36Sopenharmony_ci * @key: node key 54562306a36Sopenharmony_ci * @inum: target inode number 54662306a36Sopenharmony_ci * @padding1: reserved for future, zeroes 54762306a36Sopenharmony_ci * @type: type of the target inode (%UBIFS_ITYPE_REG, %UBIFS_ITYPE_DIR, etc) 54862306a36Sopenharmony_ci * @nlen: name length 54962306a36Sopenharmony_ci * @cookie: A 32bits random number, used to construct a 64bits 55062306a36Sopenharmony_ci * identifier. 55162306a36Sopenharmony_ci * @name: zero-terminated name 55262306a36Sopenharmony_ci * 55362306a36Sopenharmony_ci * Note, do not forget to amend 'zero_dent_node_unused()' function when 55462306a36Sopenharmony_ci * changing the padding fields. 55562306a36Sopenharmony_ci */ 55662306a36Sopenharmony_cistruct ubifs_dent_node { 55762306a36Sopenharmony_ci struct ubifs_ch ch; 55862306a36Sopenharmony_ci __u8 key[UBIFS_MAX_KEY_LEN]; 55962306a36Sopenharmony_ci __le64 inum; 56062306a36Sopenharmony_ci __u8 padding1; 56162306a36Sopenharmony_ci __u8 type; 56262306a36Sopenharmony_ci __le16 nlen; 56362306a36Sopenharmony_ci __le32 cookie; 56462306a36Sopenharmony_ci __u8 name[]; 56562306a36Sopenharmony_ci} __packed; 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci/** 56862306a36Sopenharmony_ci * struct ubifs_data_node - data node. 56962306a36Sopenharmony_ci * @ch: common header 57062306a36Sopenharmony_ci * @key: node key 57162306a36Sopenharmony_ci * @size: uncompressed data size in bytes 57262306a36Sopenharmony_ci * @compr_type: compression type (%UBIFS_COMPR_NONE, %UBIFS_COMPR_LZO, etc) 57362306a36Sopenharmony_ci * @compr_size: compressed data size in bytes, only valid when data is encrypted 57462306a36Sopenharmony_ci * @data: data 57562306a36Sopenharmony_ci * 57662306a36Sopenharmony_ci */ 57762306a36Sopenharmony_cistruct ubifs_data_node { 57862306a36Sopenharmony_ci struct ubifs_ch ch; 57962306a36Sopenharmony_ci __u8 key[UBIFS_MAX_KEY_LEN]; 58062306a36Sopenharmony_ci __le32 size; 58162306a36Sopenharmony_ci __le16 compr_type; 58262306a36Sopenharmony_ci __le16 compr_size; 58362306a36Sopenharmony_ci __u8 data[]; 58462306a36Sopenharmony_ci} __packed; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci/** 58762306a36Sopenharmony_ci * struct ubifs_trun_node - truncation node. 58862306a36Sopenharmony_ci * @ch: common header 58962306a36Sopenharmony_ci * @inum: truncated inode number 59062306a36Sopenharmony_ci * @padding: reserved for future, zeroes 59162306a36Sopenharmony_ci * @old_size: size before truncation 59262306a36Sopenharmony_ci * @new_size: size after truncation 59362306a36Sopenharmony_ci * 59462306a36Sopenharmony_ci * This node exists only in the journal and never goes to the main area. Note, 59562306a36Sopenharmony_ci * do not forget to amend 'zero_trun_node_unused()' function when changing the 59662306a36Sopenharmony_ci * padding fields. 59762306a36Sopenharmony_ci */ 59862306a36Sopenharmony_cistruct ubifs_trun_node { 59962306a36Sopenharmony_ci struct ubifs_ch ch; 60062306a36Sopenharmony_ci __le32 inum; 60162306a36Sopenharmony_ci __u8 padding[12]; /* Watch 'zero_trun_node_unused()' if changing! */ 60262306a36Sopenharmony_ci __le64 old_size; 60362306a36Sopenharmony_ci __le64 new_size; 60462306a36Sopenharmony_ci} __packed; 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ci/** 60762306a36Sopenharmony_ci * struct ubifs_pad_node - padding node. 60862306a36Sopenharmony_ci * @ch: common header 60962306a36Sopenharmony_ci * @pad_len: how many bytes after this node are unused (because padded) 61062306a36Sopenharmony_ci * @padding: reserved for future, zeroes 61162306a36Sopenharmony_ci */ 61262306a36Sopenharmony_cistruct ubifs_pad_node { 61362306a36Sopenharmony_ci struct ubifs_ch ch; 61462306a36Sopenharmony_ci __le32 pad_len; 61562306a36Sopenharmony_ci} __packed; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci/** 61862306a36Sopenharmony_ci * struct ubifs_sb_node - superblock node. 61962306a36Sopenharmony_ci * @ch: common header 62062306a36Sopenharmony_ci * @padding: reserved for future, zeroes 62162306a36Sopenharmony_ci * @key_hash: type of hash function used in keys 62262306a36Sopenharmony_ci * @key_fmt: format of the key 62362306a36Sopenharmony_ci * @flags: file-system flags (%UBIFS_FLG_BIGLPT, etc) 62462306a36Sopenharmony_ci * @min_io_size: minimal input/output unit size 62562306a36Sopenharmony_ci * @leb_size: logical eraseblock size in bytes 62662306a36Sopenharmony_ci * @leb_cnt: count of LEBs used by file-system 62762306a36Sopenharmony_ci * @max_leb_cnt: maximum count of LEBs used by file-system 62862306a36Sopenharmony_ci * @max_bud_bytes: maximum amount of data stored in buds 62962306a36Sopenharmony_ci * @log_lebs: log size in logical eraseblocks 63062306a36Sopenharmony_ci * @lpt_lebs: number of LEBs used for lprops table 63162306a36Sopenharmony_ci * @orph_lebs: number of LEBs used for recording orphans 63262306a36Sopenharmony_ci * @jhead_cnt: count of journal heads 63362306a36Sopenharmony_ci * @fanout: tree fanout (max. number of links per indexing node) 63462306a36Sopenharmony_ci * @lsave_cnt: number of LEB numbers in LPT's save table 63562306a36Sopenharmony_ci * @fmt_version: UBIFS on-flash format version 63662306a36Sopenharmony_ci * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc) 63762306a36Sopenharmony_ci * @padding1: reserved for future, zeroes 63862306a36Sopenharmony_ci * @rp_uid: reserve pool UID 63962306a36Sopenharmony_ci * @rp_gid: reserve pool GID 64062306a36Sopenharmony_ci * @rp_size: size of the reserved pool in bytes 64162306a36Sopenharmony_ci * @padding2: reserved for future, zeroes 64262306a36Sopenharmony_ci * @time_gran: time granularity in nanoseconds 64362306a36Sopenharmony_ci * @uuid: UUID generated when the file system image was created 64462306a36Sopenharmony_ci * @ro_compat_version: UBIFS R/O compatibility version 64562306a36Sopenharmony_ci * @hmac: HMAC to authenticate the superblock node 64662306a36Sopenharmony_ci * @hmac_wkm: HMAC of a well known message (the string "UBIFS") as a convenience 64762306a36Sopenharmony_ci * to the user to check if the correct key is passed. 64862306a36Sopenharmony_ci * @hash_algo: The hash algo used for this filesystem (one of enum hash_algo) 64962306a36Sopenharmony_ci * @hash_mst: hash of the master node, only valid for signed images in which the 65062306a36Sopenharmony_ci * master node does not contain a hmac 65162306a36Sopenharmony_ci */ 65262306a36Sopenharmony_cistruct ubifs_sb_node { 65362306a36Sopenharmony_ci struct ubifs_ch ch; 65462306a36Sopenharmony_ci __u8 padding[2]; 65562306a36Sopenharmony_ci __u8 key_hash; 65662306a36Sopenharmony_ci __u8 key_fmt; 65762306a36Sopenharmony_ci __le32 flags; 65862306a36Sopenharmony_ci __le32 min_io_size; 65962306a36Sopenharmony_ci __le32 leb_size; 66062306a36Sopenharmony_ci __le32 leb_cnt; 66162306a36Sopenharmony_ci __le32 max_leb_cnt; 66262306a36Sopenharmony_ci __le64 max_bud_bytes; 66362306a36Sopenharmony_ci __le32 log_lebs; 66462306a36Sopenharmony_ci __le32 lpt_lebs; 66562306a36Sopenharmony_ci __le32 orph_lebs; 66662306a36Sopenharmony_ci __le32 jhead_cnt; 66762306a36Sopenharmony_ci __le32 fanout; 66862306a36Sopenharmony_ci __le32 lsave_cnt; 66962306a36Sopenharmony_ci __le32 fmt_version; 67062306a36Sopenharmony_ci __le16 default_compr; 67162306a36Sopenharmony_ci __u8 padding1[2]; 67262306a36Sopenharmony_ci __le32 rp_uid; 67362306a36Sopenharmony_ci __le32 rp_gid; 67462306a36Sopenharmony_ci __le64 rp_size; 67562306a36Sopenharmony_ci __le32 time_gran; 67662306a36Sopenharmony_ci __u8 uuid[16]; 67762306a36Sopenharmony_ci __le32 ro_compat_version; 67862306a36Sopenharmony_ci __u8 hmac[UBIFS_MAX_HMAC_LEN]; 67962306a36Sopenharmony_ci __u8 hmac_wkm[UBIFS_MAX_HMAC_LEN]; 68062306a36Sopenharmony_ci __le16 hash_algo; 68162306a36Sopenharmony_ci __u8 hash_mst[UBIFS_MAX_HASH_LEN]; 68262306a36Sopenharmony_ci __u8 padding2[3774]; 68362306a36Sopenharmony_ci} __packed; 68462306a36Sopenharmony_ci 68562306a36Sopenharmony_ci/** 68662306a36Sopenharmony_ci * struct ubifs_mst_node - master node. 68762306a36Sopenharmony_ci * @ch: common header 68862306a36Sopenharmony_ci * @highest_inum: highest inode number in the committed index 68962306a36Sopenharmony_ci * @cmt_no: commit number 69062306a36Sopenharmony_ci * @flags: various flags (%UBIFS_MST_DIRTY, etc) 69162306a36Sopenharmony_ci * @log_lnum: start of the log 69262306a36Sopenharmony_ci * @root_lnum: LEB number of the root indexing node 69362306a36Sopenharmony_ci * @root_offs: offset within @root_lnum 69462306a36Sopenharmony_ci * @root_len: root indexing node length 69562306a36Sopenharmony_ci * @gc_lnum: LEB reserved for garbage collection (%-1 value means the LEB was 69662306a36Sopenharmony_ci * not reserved and should be reserved on mount) 69762306a36Sopenharmony_ci * @ihead_lnum: LEB number of index head 69862306a36Sopenharmony_ci * @ihead_offs: offset of index head 69962306a36Sopenharmony_ci * @index_size: size of index on flash 70062306a36Sopenharmony_ci * @total_free: total free space in bytes 70162306a36Sopenharmony_ci * @total_dirty: total dirty space in bytes 70262306a36Sopenharmony_ci * @total_used: total used space in bytes (includes only data LEBs) 70362306a36Sopenharmony_ci * @total_dead: total dead space in bytes (includes only data LEBs) 70462306a36Sopenharmony_ci * @total_dark: total dark space in bytes (includes only data LEBs) 70562306a36Sopenharmony_ci * @lpt_lnum: LEB number of LPT root nnode 70662306a36Sopenharmony_ci * @lpt_offs: offset of LPT root nnode 70762306a36Sopenharmony_ci * @nhead_lnum: LEB number of LPT head 70862306a36Sopenharmony_ci * @nhead_offs: offset of LPT head 70962306a36Sopenharmony_ci * @ltab_lnum: LEB number of LPT's own lprops table 71062306a36Sopenharmony_ci * @ltab_offs: offset of LPT's own lprops table 71162306a36Sopenharmony_ci * @lsave_lnum: LEB number of LPT's save table (big model only) 71262306a36Sopenharmony_ci * @lsave_offs: offset of LPT's save table (big model only) 71362306a36Sopenharmony_ci * @lscan_lnum: LEB number of last LPT scan 71462306a36Sopenharmony_ci * @empty_lebs: number of empty logical eraseblocks 71562306a36Sopenharmony_ci * @idx_lebs: number of indexing logical eraseblocks 71662306a36Sopenharmony_ci * @leb_cnt: count of LEBs used by file-system 71762306a36Sopenharmony_ci * @hash_root_idx: the hash of the root index node 71862306a36Sopenharmony_ci * @hash_lpt: the hash of the LPT 71962306a36Sopenharmony_ci * @hmac: HMAC to authenticate the master node 72062306a36Sopenharmony_ci * @padding: reserved for future, zeroes 72162306a36Sopenharmony_ci */ 72262306a36Sopenharmony_cistruct ubifs_mst_node { 72362306a36Sopenharmony_ci struct ubifs_ch ch; 72462306a36Sopenharmony_ci __le64 highest_inum; 72562306a36Sopenharmony_ci __le64 cmt_no; 72662306a36Sopenharmony_ci __le32 flags; 72762306a36Sopenharmony_ci __le32 log_lnum; 72862306a36Sopenharmony_ci __le32 root_lnum; 72962306a36Sopenharmony_ci __le32 root_offs; 73062306a36Sopenharmony_ci __le32 root_len; 73162306a36Sopenharmony_ci __le32 gc_lnum; 73262306a36Sopenharmony_ci __le32 ihead_lnum; 73362306a36Sopenharmony_ci __le32 ihead_offs; 73462306a36Sopenharmony_ci __le64 index_size; 73562306a36Sopenharmony_ci __le64 total_free; 73662306a36Sopenharmony_ci __le64 total_dirty; 73762306a36Sopenharmony_ci __le64 total_used; 73862306a36Sopenharmony_ci __le64 total_dead; 73962306a36Sopenharmony_ci __le64 total_dark; 74062306a36Sopenharmony_ci __le32 lpt_lnum; 74162306a36Sopenharmony_ci __le32 lpt_offs; 74262306a36Sopenharmony_ci __le32 nhead_lnum; 74362306a36Sopenharmony_ci __le32 nhead_offs; 74462306a36Sopenharmony_ci __le32 ltab_lnum; 74562306a36Sopenharmony_ci __le32 ltab_offs; 74662306a36Sopenharmony_ci __le32 lsave_lnum; 74762306a36Sopenharmony_ci __le32 lsave_offs; 74862306a36Sopenharmony_ci __le32 lscan_lnum; 74962306a36Sopenharmony_ci __le32 empty_lebs; 75062306a36Sopenharmony_ci __le32 idx_lebs; 75162306a36Sopenharmony_ci __le32 leb_cnt; 75262306a36Sopenharmony_ci __u8 hash_root_idx[UBIFS_MAX_HASH_LEN]; 75362306a36Sopenharmony_ci __u8 hash_lpt[UBIFS_MAX_HASH_LEN]; 75462306a36Sopenharmony_ci __u8 hmac[UBIFS_MAX_HMAC_LEN]; 75562306a36Sopenharmony_ci __u8 padding[152]; 75662306a36Sopenharmony_ci} __packed; 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci/** 75962306a36Sopenharmony_ci * struct ubifs_ref_node - logical eraseblock reference node. 76062306a36Sopenharmony_ci * @ch: common header 76162306a36Sopenharmony_ci * @lnum: the referred logical eraseblock number 76262306a36Sopenharmony_ci * @offs: start offset in the referred LEB 76362306a36Sopenharmony_ci * @jhead: journal head number 76462306a36Sopenharmony_ci * @padding: reserved for future, zeroes 76562306a36Sopenharmony_ci */ 76662306a36Sopenharmony_cistruct ubifs_ref_node { 76762306a36Sopenharmony_ci struct ubifs_ch ch; 76862306a36Sopenharmony_ci __le32 lnum; 76962306a36Sopenharmony_ci __le32 offs; 77062306a36Sopenharmony_ci __le32 jhead; 77162306a36Sopenharmony_ci __u8 padding[28]; 77262306a36Sopenharmony_ci} __packed; 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_ci/** 77562306a36Sopenharmony_ci * struct ubifs_auth_node - node for authenticating other nodes 77662306a36Sopenharmony_ci * @ch: common header 77762306a36Sopenharmony_ci * @hmac: The HMAC 77862306a36Sopenharmony_ci */ 77962306a36Sopenharmony_cistruct ubifs_auth_node { 78062306a36Sopenharmony_ci struct ubifs_ch ch; 78162306a36Sopenharmony_ci __u8 hmac[]; 78262306a36Sopenharmony_ci} __packed; 78362306a36Sopenharmony_ci 78462306a36Sopenharmony_ci/** 78562306a36Sopenharmony_ci * struct ubifs_sig_node - node for signing other nodes 78662306a36Sopenharmony_ci * @ch: common header 78762306a36Sopenharmony_ci * @type: type of the signature, currently only UBIFS_SIGNATURE_TYPE_PKCS7 78862306a36Sopenharmony_ci * supported 78962306a36Sopenharmony_ci * @len: The length of the signature data 79062306a36Sopenharmony_ci * @padding: reserved for future, zeroes 79162306a36Sopenharmony_ci * @sig: The signature data 79262306a36Sopenharmony_ci */ 79362306a36Sopenharmony_cistruct ubifs_sig_node { 79462306a36Sopenharmony_ci struct ubifs_ch ch; 79562306a36Sopenharmony_ci __le32 type; 79662306a36Sopenharmony_ci __le32 len; 79762306a36Sopenharmony_ci __u8 padding[32]; 79862306a36Sopenharmony_ci __u8 sig[]; 79962306a36Sopenharmony_ci} __packed; 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci/** 80262306a36Sopenharmony_ci * struct ubifs_branch - key/reference/length branch 80362306a36Sopenharmony_ci * @lnum: LEB number of the target node 80462306a36Sopenharmony_ci * @offs: offset within @lnum 80562306a36Sopenharmony_ci * @len: target node length 80662306a36Sopenharmony_ci * @key: key 80762306a36Sopenharmony_ci * 80862306a36Sopenharmony_ci * In an authenticated UBIFS we have the hash of the referenced node after @key. 80962306a36Sopenharmony_ci * This can't be added to the struct type definition because @key is a 81062306a36Sopenharmony_ci * dynamically sized element already. 81162306a36Sopenharmony_ci */ 81262306a36Sopenharmony_cistruct ubifs_branch { 81362306a36Sopenharmony_ci __le32 lnum; 81462306a36Sopenharmony_ci __le32 offs; 81562306a36Sopenharmony_ci __le32 len; 81662306a36Sopenharmony_ci __u8 key[]; 81762306a36Sopenharmony_ci} __packed; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci/** 82062306a36Sopenharmony_ci * struct ubifs_idx_node - indexing node. 82162306a36Sopenharmony_ci * @ch: common header 82262306a36Sopenharmony_ci * @child_cnt: number of child index nodes 82362306a36Sopenharmony_ci * @level: tree level 82462306a36Sopenharmony_ci * @branches: LEB number / offset / length / key branches 82562306a36Sopenharmony_ci */ 82662306a36Sopenharmony_cistruct ubifs_idx_node { 82762306a36Sopenharmony_ci struct ubifs_ch ch; 82862306a36Sopenharmony_ci __le16 child_cnt; 82962306a36Sopenharmony_ci __le16 level; 83062306a36Sopenharmony_ci __u8 branches[]; 83162306a36Sopenharmony_ci} __packed; 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci/** 83462306a36Sopenharmony_ci * struct ubifs_cs_node - commit start node. 83562306a36Sopenharmony_ci * @ch: common header 83662306a36Sopenharmony_ci * @cmt_no: commit number 83762306a36Sopenharmony_ci */ 83862306a36Sopenharmony_cistruct ubifs_cs_node { 83962306a36Sopenharmony_ci struct ubifs_ch ch; 84062306a36Sopenharmony_ci __le64 cmt_no; 84162306a36Sopenharmony_ci} __packed; 84262306a36Sopenharmony_ci 84362306a36Sopenharmony_ci/** 84462306a36Sopenharmony_ci * struct ubifs_orph_node - orphan node. 84562306a36Sopenharmony_ci * @ch: common header 84662306a36Sopenharmony_ci * @cmt_no: commit number (also top bit is set on the last node of the commit) 84762306a36Sopenharmony_ci * @inos: inode numbers of orphans 84862306a36Sopenharmony_ci */ 84962306a36Sopenharmony_cistruct ubifs_orph_node { 85062306a36Sopenharmony_ci struct ubifs_ch ch; 85162306a36Sopenharmony_ci __le64 cmt_no; 85262306a36Sopenharmony_ci __le64 inos[]; 85362306a36Sopenharmony_ci} __packed; 85462306a36Sopenharmony_ci 85562306a36Sopenharmony_ci#endif /* __UBIFS_MEDIA_H__ */ 856