1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 29eefe2a2SStefan Roese /* 39eefe2a2SStefan Roese * This file is part of UBIFS. 49eefe2a2SStefan Roese * 59eefe2a2SStefan Roese * Copyright (C) 2006-2008 Nokia Corporation. 69eefe2a2SStefan Roese * 79eefe2a2SStefan Roese * Authors: Artem Bityutskiy (Битюцкий Артём) 89eefe2a2SStefan Roese * Adrian Hunter 99eefe2a2SStefan Roese */ 109eefe2a2SStefan Roese 119eefe2a2SStefan Roese /* 129eefe2a2SStefan Roese * This file describes UBIFS on-flash format and contains definitions of all the 139eefe2a2SStefan Roese * relevant data structures and constants. 149eefe2a2SStefan Roese * 159eefe2a2SStefan Roese * All UBIFS on-flash objects are stored in the form of nodes. All nodes start 169eefe2a2SStefan Roese * with the UBIFS node magic number and have the same common header. Nodes 179eefe2a2SStefan Roese * always sit at 8-byte aligned positions on the media and node header sizes are 189eefe2a2SStefan Roese * also 8-byte aligned (except for the indexing node and the padding node). 199eefe2a2SStefan Roese */ 209eefe2a2SStefan Roese 219eefe2a2SStefan Roese #ifndef __UBIFS_MEDIA_H__ 229eefe2a2SStefan Roese #define __UBIFS_MEDIA_H__ 239eefe2a2SStefan Roese 249eefe2a2SStefan Roese /* UBIFS node magic number (must not have the padding byte first or last) */ 259eefe2a2SStefan Roese #define UBIFS_NODE_MAGIC 0x06101831 269eefe2a2SStefan Roese 27febd7e41SArtem Bityutskiy /* 28febd7e41SArtem Bityutskiy * UBIFS on-flash format version. This version is increased when the on-flash 29febd7e41SArtem Bityutskiy * format is changing. If this happens, UBIFS is will support older versions as 30febd7e41SArtem Bityutskiy * well. But older UBIFS code will not support newer formats. Format changes 31febd7e41SArtem Bityutskiy * will be rare and only when absolutely necessary, e.g. to fix a bug or to add 32febd7e41SArtem Bityutskiy * a new feature. 33febd7e41SArtem Bityutskiy * 34febd7e41SArtem Bityutskiy * UBIFS went into mainline kernel with format version 4. The older formats 35febd7e41SArtem Bityutskiy * were development formats. 36febd7e41SArtem Bityutskiy */ 379eefe2a2SStefan Roese #define UBIFS_FORMAT_VERSION 4 389eefe2a2SStefan Roese 39febd7e41SArtem Bityutskiy /* 40febd7e41SArtem Bityutskiy * Read-only compatibility version. If the UBIFS format is changed, older UBIFS 41febd7e41SArtem Bityutskiy * implementations will not be able to mount newer formats in read-write mode. 42febd7e41SArtem Bityutskiy * However, depending on the change, it may be possible to mount newer formats 43febd7e41SArtem Bityutskiy * in R/O mode. This is indicated by the R/O compatibility version which is 44febd7e41SArtem Bityutskiy * stored in the super-block. 45febd7e41SArtem Bityutskiy * 46febd7e41SArtem Bityutskiy * This is needed to support boot-loaders which only need R/O mounting. With 47febd7e41SArtem Bityutskiy * this flag it is possible to do UBIFS format changes without a need to update 48febd7e41SArtem Bityutskiy * boot-loaders. 49febd7e41SArtem Bityutskiy */ 50febd7e41SArtem Bityutskiy #define UBIFS_RO_COMPAT_VERSION 0 51febd7e41SArtem Bityutskiy 529eefe2a2SStefan Roese /* Minimum logical eraseblock size in bytes */ 539eefe2a2SStefan Roese #define UBIFS_MIN_LEB_SZ (15*1024) 549eefe2a2SStefan Roese 559eefe2a2SStefan Roese /* Initial CRC32 value used when calculating CRC checksums */ 569eefe2a2SStefan Roese #define UBIFS_CRC32_INIT 0xFFFFFFFFU 579eefe2a2SStefan Roese 589eefe2a2SStefan Roese /* 599eefe2a2SStefan Roese * UBIFS does not try to compress data if its length is less than the below 609eefe2a2SStefan Roese * constant. 619eefe2a2SStefan Roese */ 629eefe2a2SStefan Roese #define UBIFS_MIN_COMPR_LEN 128 639eefe2a2SStefan Roese 649eefe2a2SStefan Roese /* 659eefe2a2SStefan Roese * If compressed data length is less than %UBIFS_MIN_COMPRESS_DIFF bytes 66febd7e41SArtem Bityutskiy * shorter than uncompressed data length, UBIFS prefers to leave this data 679eefe2a2SStefan Roese * node uncompress, because it'll be read faster. 689eefe2a2SStefan Roese */ 699eefe2a2SStefan Roese #define UBIFS_MIN_COMPRESS_DIFF 64 709eefe2a2SStefan Roese 719eefe2a2SStefan Roese /* Root inode number */ 729eefe2a2SStefan Roese #define UBIFS_ROOT_INO 1 739eefe2a2SStefan Roese 749eefe2a2SStefan Roese /* Lowest inode number used for regular inodes (not UBIFS-only internal ones) */ 759eefe2a2SStefan Roese #define UBIFS_FIRST_INO 64 769eefe2a2SStefan Roese 779eefe2a2SStefan Roese /* 789eefe2a2SStefan Roese * Maximum file name and extended attribute length (must be a multiple of 8, 799eefe2a2SStefan Roese * minus 1). 809eefe2a2SStefan Roese */ 819eefe2a2SStefan Roese #define UBIFS_MAX_NLEN 255 829eefe2a2SStefan Roese 839eefe2a2SStefan Roese /* Maximum number of data journal heads */ 849eefe2a2SStefan Roese #define UBIFS_MAX_JHEADS 1 859eefe2a2SStefan Roese 869eefe2a2SStefan Roese /* 879eefe2a2SStefan Roese * Size of UBIFS data block. Note, UBIFS is not a block oriented file-system, 889eefe2a2SStefan Roese * which means that it does not treat the underlying media as consisting of 899eefe2a2SStefan Roese * blocks like in case of hard drives. Do not be confused. UBIFS block is just 909eefe2a2SStefan Roese * the maximum amount of data which one data node can have or which can be 919eefe2a2SStefan Roese * attached to an inode node. 929eefe2a2SStefan Roese */ 939eefe2a2SStefan Roese #define UBIFS_BLOCK_SIZE 4096 949eefe2a2SStefan Roese #define UBIFS_BLOCK_SHIFT 12 959eefe2a2SStefan Roese 969eefe2a2SStefan Roese /* UBIFS padding byte pattern (must not be first or last byte of node magic) */ 979eefe2a2SStefan Roese #define UBIFS_PADDING_BYTE 0xCE 989eefe2a2SStefan Roese 999eefe2a2SStefan Roese /* Maximum possible key length */ 1009eefe2a2SStefan Roese #define UBIFS_MAX_KEY_LEN 16 1019eefe2a2SStefan Roese 1029eefe2a2SStefan Roese /* Key length ("simple" format) */ 1039eefe2a2SStefan Roese #define UBIFS_SK_LEN 8 1049eefe2a2SStefan Roese 1059eefe2a2SStefan Roese /* Minimum index tree fanout */ 1069eefe2a2SStefan Roese #define UBIFS_MIN_FANOUT 3 1079eefe2a2SStefan Roese 1089eefe2a2SStefan Roese /* Maximum number of levels in UBIFS indexing B-tree */ 1099eefe2a2SStefan Roese #define UBIFS_MAX_LEVELS 512 1109eefe2a2SStefan Roese 1119eefe2a2SStefan Roese /* Maximum amount of data attached to an inode in bytes */ 1129eefe2a2SStefan Roese #define UBIFS_MAX_INO_DATA UBIFS_BLOCK_SIZE 1139eefe2a2SStefan Roese 1149eefe2a2SStefan Roese /* LEB Properties Tree fanout (must be power of 2) and fanout shift */ 1159eefe2a2SStefan Roese #define UBIFS_LPT_FANOUT 4 1169eefe2a2SStefan Roese #define UBIFS_LPT_FANOUT_SHIFT 2 1179eefe2a2SStefan Roese 1189eefe2a2SStefan Roese /* LEB Properties Tree bit field sizes */ 1199eefe2a2SStefan Roese #define UBIFS_LPT_CRC_BITS 16 1209eefe2a2SStefan Roese #define UBIFS_LPT_CRC_BYTES 2 1219eefe2a2SStefan Roese #define UBIFS_LPT_TYPE_BITS 4 1229eefe2a2SStefan Roese 1239eefe2a2SStefan Roese /* The key is always at the same position in all keyed nodes */ 1249eefe2a2SStefan Roese #define UBIFS_KEY_OFFSET offsetof(struct ubifs_ino_node, key) 1259eefe2a2SStefan Roese 126ff94bc40SHeiko Schocher /* Garbage collector journal head number */ 127ff94bc40SHeiko Schocher #define UBIFS_GC_HEAD 0 128ff94bc40SHeiko Schocher /* Base journal head number */ 129ff94bc40SHeiko Schocher #define UBIFS_BASE_HEAD 1 130ff94bc40SHeiko Schocher /* Data journal head number */ 131ff94bc40SHeiko Schocher #define UBIFS_DATA_HEAD 2 132ff94bc40SHeiko Schocher 1339eefe2a2SStefan Roese /* 1349eefe2a2SStefan Roese * LEB Properties Tree node types. 1359eefe2a2SStefan Roese * 1369eefe2a2SStefan Roese * UBIFS_LPT_PNODE: LPT leaf node (contains LEB properties) 1379eefe2a2SStefan Roese * UBIFS_LPT_NNODE: LPT internal node 1389eefe2a2SStefan Roese * UBIFS_LPT_LTAB: LPT's own lprops table 1399eefe2a2SStefan Roese * UBIFS_LPT_LSAVE: LPT's save table (big model only) 1409eefe2a2SStefan Roese * UBIFS_LPT_NODE_CNT: count of LPT node types 1419eefe2a2SStefan Roese * UBIFS_LPT_NOT_A_NODE: all ones (15 for 4 bits) is never a valid node type 1429eefe2a2SStefan Roese */ 1439eefe2a2SStefan Roese enum { 1449eefe2a2SStefan Roese UBIFS_LPT_PNODE, 1459eefe2a2SStefan Roese UBIFS_LPT_NNODE, 1469eefe2a2SStefan Roese UBIFS_LPT_LTAB, 1479eefe2a2SStefan Roese UBIFS_LPT_LSAVE, 1489eefe2a2SStefan Roese UBIFS_LPT_NODE_CNT, 1499eefe2a2SStefan Roese UBIFS_LPT_NOT_A_NODE = (1 << UBIFS_LPT_TYPE_BITS) - 1, 1509eefe2a2SStefan Roese }; 1519eefe2a2SStefan Roese 1529eefe2a2SStefan Roese /* 1539eefe2a2SStefan Roese * UBIFS inode types. 1549eefe2a2SStefan Roese * 1559eefe2a2SStefan Roese * UBIFS_ITYPE_REG: regular file 1569eefe2a2SStefan Roese * UBIFS_ITYPE_DIR: directory 1579eefe2a2SStefan Roese * UBIFS_ITYPE_LNK: soft link 1589eefe2a2SStefan Roese * UBIFS_ITYPE_BLK: block device node 1599eefe2a2SStefan Roese * UBIFS_ITYPE_CHR: character device node 1609eefe2a2SStefan Roese * UBIFS_ITYPE_FIFO: fifo 1619eefe2a2SStefan Roese * UBIFS_ITYPE_SOCK: socket 1629eefe2a2SStefan Roese * UBIFS_ITYPES_CNT: count of supported file types 1639eefe2a2SStefan Roese */ 1649eefe2a2SStefan Roese enum { 1659eefe2a2SStefan Roese UBIFS_ITYPE_REG, 1669eefe2a2SStefan Roese UBIFS_ITYPE_DIR, 1679eefe2a2SStefan Roese UBIFS_ITYPE_LNK, 1689eefe2a2SStefan Roese UBIFS_ITYPE_BLK, 1699eefe2a2SStefan Roese UBIFS_ITYPE_CHR, 1709eefe2a2SStefan Roese UBIFS_ITYPE_FIFO, 1719eefe2a2SStefan Roese UBIFS_ITYPE_SOCK, 1729eefe2a2SStefan Roese UBIFS_ITYPES_CNT, 1739eefe2a2SStefan Roese }; 1749eefe2a2SStefan Roese 1759eefe2a2SStefan Roese /* 1769eefe2a2SStefan Roese * Supported key hash functions. 1779eefe2a2SStefan Roese * 1789eefe2a2SStefan Roese * UBIFS_KEY_HASH_R5: R5 hash 1799eefe2a2SStefan Roese * UBIFS_KEY_HASH_TEST: test hash which just returns first 4 bytes of the name 1809eefe2a2SStefan Roese */ 1819eefe2a2SStefan Roese enum { 1829eefe2a2SStefan Roese UBIFS_KEY_HASH_R5, 1839eefe2a2SStefan Roese UBIFS_KEY_HASH_TEST, 1849eefe2a2SStefan Roese }; 1859eefe2a2SStefan Roese 1869eefe2a2SStefan Roese /* 1879eefe2a2SStefan Roese * Supported key formats. 1889eefe2a2SStefan Roese * 1899eefe2a2SStefan Roese * UBIFS_SIMPLE_KEY_FMT: simple key format 1909eefe2a2SStefan Roese */ 1919eefe2a2SStefan Roese enum { 1929eefe2a2SStefan Roese UBIFS_SIMPLE_KEY_FMT, 1939eefe2a2SStefan Roese }; 1949eefe2a2SStefan Roese 1959eefe2a2SStefan Roese /* 1969eefe2a2SStefan Roese * The simple key format uses 29 bits for storing UBIFS block number and hash 1979eefe2a2SStefan Roese * value. 1989eefe2a2SStefan Roese */ 1999eefe2a2SStefan Roese #define UBIFS_S_KEY_BLOCK_BITS 29 2009eefe2a2SStefan Roese #define UBIFS_S_KEY_BLOCK_MASK 0x1FFFFFFF 2019eefe2a2SStefan Roese #define UBIFS_S_KEY_HASH_BITS UBIFS_S_KEY_BLOCK_BITS 2029eefe2a2SStefan Roese #define UBIFS_S_KEY_HASH_MASK UBIFS_S_KEY_BLOCK_MASK 2039eefe2a2SStefan Roese 2049eefe2a2SStefan Roese /* 2059eefe2a2SStefan Roese * Key types. 2069eefe2a2SStefan Roese * 2079eefe2a2SStefan Roese * UBIFS_INO_KEY: inode node key 2089eefe2a2SStefan Roese * UBIFS_DATA_KEY: data node key 2099eefe2a2SStefan Roese * UBIFS_DENT_KEY: directory entry node key 2109eefe2a2SStefan Roese * UBIFS_XENT_KEY: extended attribute entry key 2119eefe2a2SStefan Roese * UBIFS_KEY_TYPES_CNT: number of supported key types 2129eefe2a2SStefan Roese */ 2139eefe2a2SStefan Roese enum { 2149eefe2a2SStefan Roese UBIFS_INO_KEY, 2159eefe2a2SStefan Roese UBIFS_DATA_KEY, 2169eefe2a2SStefan Roese UBIFS_DENT_KEY, 2179eefe2a2SStefan Roese UBIFS_XENT_KEY, 2189eefe2a2SStefan Roese UBIFS_KEY_TYPES_CNT, 2199eefe2a2SStefan Roese }; 2209eefe2a2SStefan Roese 2219eefe2a2SStefan Roese /* Count of LEBs reserved for the superblock area */ 2229eefe2a2SStefan Roese #define UBIFS_SB_LEBS 1 2239eefe2a2SStefan Roese /* Count of LEBs reserved for the master area */ 2249eefe2a2SStefan Roese #define UBIFS_MST_LEBS 2 2259eefe2a2SStefan Roese 2269eefe2a2SStefan Roese /* First LEB of the superblock area */ 2279eefe2a2SStefan Roese #define UBIFS_SB_LNUM 0 2289eefe2a2SStefan Roese /* First LEB of the master area */ 2299eefe2a2SStefan Roese #define UBIFS_MST_LNUM (UBIFS_SB_LNUM + UBIFS_SB_LEBS) 2309eefe2a2SStefan Roese /* First LEB of the log area */ 2319eefe2a2SStefan Roese #define UBIFS_LOG_LNUM (UBIFS_MST_LNUM + UBIFS_MST_LEBS) 2329eefe2a2SStefan Roese 2339eefe2a2SStefan Roese /* 2349eefe2a2SStefan Roese * The below constants define the absolute minimum values for various UBIFS 2359eefe2a2SStefan Roese * media areas. Many of them actually depend of flash geometry and the FS 2369eefe2a2SStefan Roese * configuration (number of journal heads, orphan LEBs, etc). This means that 2379eefe2a2SStefan Roese * the smallest volume size which can be used for UBIFS cannot be pre-defined 2389eefe2a2SStefan Roese * by these constants. The file-system that meets the below limitation will not 2399eefe2a2SStefan Roese * necessarily mount. UBIFS does run-time calculations and validates the FS 2409eefe2a2SStefan Roese * size. 2419eefe2a2SStefan Roese */ 2429eefe2a2SStefan Roese 2439eefe2a2SStefan Roese /* Minimum number of logical eraseblocks in the log */ 2449eefe2a2SStefan Roese #define UBIFS_MIN_LOG_LEBS 2 2459eefe2a2SStefan Roese /* Minimum number of bud logical eraseblocks (one for each head) */ 2469eefe2a2SStefan Roese #define UBIFS_MIN_BUD_LEBS 3 2479eefe2a2SStefan Roese /* Minimum number of journal logical eraseblocks */ 2489eefe2a2SStefan Roese #define UBIFS_MIN_JNL_LEBS (UBIFS_MIN_LOG_LEBS + UBIFS_MIN_BUD_LEBS) 2499eefe2a2SStefan Roese /* Minimum number of LPT area logical eraseblocks */ 2509eefe2a2SStefan Roese #define UBIFS_MIN_LPT_LEBS 2 2519eefe2a2SStefan Roese /* Minimum number of orphan area logical eraseblocks */ 2529eefe2a2SStefan Roese #define UBIFS_MIN_ORPH_LEBS 1 2539eefe2a2SStefan Roese /* 2549eefe2a2SStefan Roese * Minimum number of main area logical eraseblocks (buds, 3 for the index, 1 2559eefe2a2SStefan Roese * for GC, 1 for deletions, and at least 1 for committed data). 2569eefe2a2SStefan Roese */ 2579eefe2a2SStefan Roese #define UBIFS_MIN_MAIN_LEBS (UBIFS_MIN_BUD_LEBS + 6) 2589eefe2a2SStefan Roese 2599eefe2a2SStefan Roese /* Minimum number of logical eraseblocks */ 2609eefe2a2SStefan Roese #define UBIFS_MIN_LEB_CNT (UBIFS_SB_LEBS + UBIFS_MST_LEBS + \ 2619eefe2a2SStefan Roese UBIFS_MIN_LOG_LEBS + UBIFS_MIN_LPT_LEBS + \ 2629eefe2a2SStefan Roese UBIFS_MIN_ORPH_LEBS + UBIFS_MIN_MAIN_LEBS) 2639eefe2a2SStefan Roese 2649eefe2a2SStefan Roese /* Node sizes (N.B. these are guaranteed to be multiples of 8) */ 2659eefe2a2SStefan Roese #define UBIFS_CH_SZ sizeof(struct ubifs_ch) 2669eefe2a2SStefan Roese #define UBIFS_INO_NODE_SZ sizeof(struct ubifs_ino_node) 2679eefe2a2SStefan Roese #define UBIFS_DATA_NODE_SZ sizeof(struct ubifs_data_node) 2689eefe2a2SStefan Roese #define UBIFS_DENT_NODE_SZ sizeof(struct ubifs_dent_node) 2699eefe2a2SStefan Roese #define UBIFS_TRUN_NODE_SZ sizeof(struct ubifs_trun_node) 2709eefe2a2SStefan Roese #define UBIFS_PAD_NODE_SZ sizeof(struct ubifs_pad_node) 2719eefe2a2SStefan Roese #define UBIFS_SB_NODE_SZ sizeof(struct ubifs_sb_node) 2729eefe2a2SStefan Roese #define UBIFS_MST_NODE_SZ sizeof(struct ubifs_mst_node) 2739eefe2a2SStefan Roese #define UBIFS_REF_NODE_SZ sizeof(struct ubifs_ref_node) 2749eefe2a2SStefan Roese #define UBIFS_IDX_NODE_SZ sizeof(struct ubifs_idx_node) 2759eefe2a2SStefan Roese #define UBIFS_CS_NODE_SZ sizeof(struct ubifs_cs_node) 2769eefe2a2SStefan Roese #define UBIFS_ORPH_NODE_SZ sizeof(struct ubifs_orph_node) 2779eefe2a2SStefan Roese /* Extended attribute entry nodes are identical to directory entry nodes */ 2789eefe2a2SStefan Roese #define UBIFS_XENT_NODE_SZ UBIFS_DENT_NODE_SZ 2799eefe2a2SStefan Roese /* Only this does not have to be multiple of 8 bytes */ 2809eefe2a2SStefan Roese #define UBIFS_BRANCH_SZ sizeof(struct ubifs_branch) 2819eefe2a2SStefan Roese 2829eefe2a2SStefan Roese /* Maximum node sizes (N.B. these are guaranteed to be multiples of 8) */ 2839eefe2a2SStefan Roese #define UBIFS_MAX_DATA_NODE_SZ (UBIFS_DATA_NODE_SZ + UBIFS_BLOCK_SIZE) 2849eefe2a2SStefan Roese #define UBIFS_MAX_INO_NODE_SZ (UBIFS_INO_NODE_SZ + UBIFS_MAX_INO_DATA) 2859eefe2a2SStefan Roese #define UBIFS_MAX_DENT_NODE_SZ (UBIFS_DENT_NODE_SZ + UBIFS_MAX_NLEN + 1) 2869eefe2a2SStefan Roese #define UBIFS_MAX_XENT_NODE_SZ UBIFS_MAX_DENT_NODE_SZ 2879eefe2a2SStefan Roese 2889eefe2a2SStefan Roese /* The largest UBIFS node */ 2899eefe2a2SStefan Roese #define UBIFS_MAX_NODE_SZ UBIFS_MAX_INO_NODE_SZ 2909eefe2a2SStefan Roese 2919eefe2a2SStefan Roese /* 2929eefe2a2SStefan Roese * On-flash inode flags. 2939eefe2a2SStefan Roese * 2949eefe2a2SStefan Roese * UBIFS_COMPR_FL: use compression for this inode 2959eefe2a2SStefan Roese * UBIFS_SYNC_FL: I/O on this inode has to be synchronous 2969eefe2a2SStefan Roese * UBIFS_IMMUTABLE_FL: inode is immutable 2979eefe2a2SStefan Roese * UBIFS_APPEND_FL: writes to the inode may only append data 2989eefe2a2SStefan Roese * UBIFS_DIRSYNC_FL: I/O on this directory inode has to be synchronous 2999eefe2a2SStefan Roese * UBIFS_XATTR_FL: this inode is the inode for an extended attribute value 3009eefe2a2SStefan Roese * 3019eefe2a2SStefan Roese * Note, these are on-flash flags which correspond to ioctl flags 3029eefe2a2SStefan Roese * (@FS_COMPR_FL, etc). They have the same values now, but generally, do not 3039eefe2a2SStefan Roese * have to be the same. 3049eefe2a2SStefan Roese */ 3059eefe2a2SStefan Roese enum { 3069eefe2a2SStefan Roese UBIFS_COMPR_FL = 0x01, 3079eefe2a2SStefan Roese UBIFS_SYNC_FL = 0x02, 3089eefe2a2SStefan Roese UBIFS_IMMUTABLE_FL = 0x04, 3099eefe2a2SStefan Roese UBIFS_APPEND_FL = 0x08, 3109eefe2a2SStefan Roese UBIFS_DIRSYNC_FL = 0x10, 3119eefe2a2SStefan Roese UBIFS_XATTR_FL = 0x20, 3129eefe2a2SStefan Roese }; 3139eefe2a2SStefan Roese 3149eefe2a2SStefan Roese /* Inode flag bits used by UBIFS */ 3159eefe2a2SStefan Roese #define UBIFS_FL_MASK 0x0000001F 3169eefe2a2SStefan Roese 3179eefe2a2SStefan Roese /* 3189eefe2a2SStefan Roese * UBIFS compression algorithms. 3199eefe2a2SStefan Roese * 3209eefe2a2SStefan Roese * UBIFS_COMPR_NONE: no compression 3219eefe2a2SStefan Roese * UBIFS_COMPR_LZO: LZO compression 3229eefe2a2SStefan Roese * UBIFS_COMPR_ZLIB: ZLIB compression 3239eefe2a2SStefan Roese * UBIFS_COMPR_TYPES_CNT: count of supported compression types 3249eefe2a2SStefan Roese */ 3259eefe2a2SStefan Roese enum { 3269eefe2a2SStefan Roese UBIFS_COMPR_NONE, 3279eefe2a2SStefan Roese UBIFS_COMPR_LZO, 3289eefe2a2SStefan Roese UBIFS_COMPR_ZLIB, 3299eefe2a2SStefan Roese UBIFS_COMPR_TYPES_CNT, 3309eefe2a2SStefan Roese }; 3319eefe2a2SStefan Roese 3329eefe2a2SStefan Roese /* 3339eefe2a2SStefan Roese * UBIFS node types. 3349eefe2a2SStefan Roese * 3359eefe2a2SStefan Roese * UBIFS_INO_NODE: inode node 3369eefe2a2SStefan Roese * UBIFS_DATA_NODE: data node 3379eefe2a2SStefan Roese * UBIFS_DENT_NODE: directory entry node 3389eefe2a2SStefan Roese * UBIFS_XENT_NODE: extended attribute node 3399eefe2a2SStefan Roese * UBIFS_TRUN_NODE: truncation node 3409eefe2a2SStefan Roese * UBIFS_PAD_NODE: padding node 3419eefe2a2SStefan Roese * UBIFS_SB_NODE: superblock node 3429eefe2a2SStefan Roese * UBIFS_MST_NODE: master node 3439eefe2a2SStefan Roese * UBIFS_REF_NODE: LEB reference node 3449eefe2a2SStefan Roese * UBIFS_IDX_NODE: index node 3459eefe2a2SStefan Roese * UBIFS_CS_NODE: commit start node 3469eefe2a2SStefan Roese * UBIFS_ORPH_NODE: orphan node 3479eefe2a2SStefan Roese * UBIFS_NODE_TYPES_CNT: count of supported node types 3489eefe2a2SStefan Roese * 3499eefe2a2SStefan Roese * Note, we index arrays by these numbers, so keep them low and contiguous. 3509eefe2a2SStefan Roese * Node type constants for inodes, direntries and so on have to be the same as 3519eefe2a2SStefan Roese * corresponding key type constants. 3529eefe2a2SStefan Roese */ 3539eefe2a2SStefan Roese enum { 3549eefe2a2SStefan Roese UBIFS_INO_NODE, 3559eefe2a2SStefan Roese UBIFS_DATA_NODE, 3569eefe2a2SStefan Roese UBIFS_DENT_NODE, 3579eefe2a2SStefan Roese UBIFS_XENT_NODE, 3589eefe2a2SStefan Roese UBIFS_TRUN_NODE, 3599eefe2a2SStefan Roese UBIFS_PAD_NODE, 3609eefe2a2SStefan Roese UBIFS_SB_NODE, 3619eefe2a2SStefan Roese UBIFS_MST_NODE, 3629eefe2a2SStefan Roese UBIFS_REF_NODE, 3639eefe2a2SStefan Roese UBIFS_IDX_NODE, 3649eefe2a2SStefan Roese UBIFS_CS_NODE, 3659eefe2a2SStefan Roese UBIFS_ORPH_NODE, 3669eefe2a2SStefan Roese UBIFS_NODE_TYPES_CNT, 3679eefe2a2SStefan Roese }; 3689eefe2a2SStefan Roese 3699eefe2a2SStefan Roese /* 3709eefe2a2SStefan Roese * Master node flags. 3719eefe2a2SStefan Roese * 3729eefe2a2SStefan Roese * UBIFS_MST_DIRTY: rebooted uncleanly - master node is dirty 3739eefe2a2SStefan Roese * UBIFS_MST_NO_ORPHS: no orphan inodes present 3749eefe2a2SStefan Roese * UBIFS_MST_RCVRY: written by recovery 3759eefe2a2SStefan Roese */ 3769eefe2a2SStefan Roese enum { 3779eefe2a2SStefan Roese UBIFS_MST_DIRTY = 1, 3789eefe2a2SStefan Roese UBIFS_MST_NO_ORPHS = 2, 3799eefe2a2SStefan Roese UBIFS_MST_RCVRY = 4, 3809eefe2a2SStefan Roese }; 3819eefe2a2SStefan Roese 3829eefe2a2SStefan Roese /* 3839eefe2a2SStefan Roese * Node group type (used by recovery to recover whole group or none). 3849eefe2a2SStefan Roese * 3859eefe2a2SStefan Roese * UBIFS_NO_NODE_GROUP: this node is not part of a group 3869eefe2a2SStefan Roese * UBIFS_IN_NODE_GROUP: this node is a part of a group 3879eefe2a2SStefan Roese * UBIFS_LAST_OF_NODE_GROUP: this node is the last in a group 3889eefe2a2SStefan Roese */ 3899eefe2a2SStefan Roese enum { 3909eefe2a2SStefan Roese UBIFS_NO_NODE_GROUP = 0, 3919eefe2a2SStefan Roese UBIFS_IN_NODE_GROUP, 3929eefe2a2SStefan Roese UBIFS_LAST_OF_NODE_GROUP, 3939eefe2a2SStefan Roese }; 3949eefe2a2SStefan Roese 3959eefe2a2SStefan Roese /* 3969eefe2a2SStefan Roese * Superblock flags. 3979eefe2a2SStefan Roese * 3989eefe2a2SStefan Roese * UBIFS_FLG_BIGLPT: if "big" LPT model is used if set 399ff94bc40SHeiko Schocher * UBIFS_FLG_SPACE_FIXUP: first-mount "fixup" of free space within LEBs needed 4009eefe2a2SStefan Roese */ 4019eefe2a2SStefan Roese enum { 4029eefe2a2SStefan Roese UBIFS_FLG_BIGLPT = 0x02, 403ff94bc40SHeiko Schocher UBIFS_FLG_SPACE_FIXUP = 0x04, 4049eefe2a2SStefan Roese }; 4059eefe2a2SStefan Roese 4069eefe2a2SStefan Roese /** 4079eefe2a2SStefan Roese * struct ubifs_ch - common header node. 4089eefe2a2SStefan Roese * @magic: UBIFS node magic number (%UBIFS_NODE_MAGIC) 4099eefe2a2SStefan Roese * @crc: CRC-32 checksum of the node header 4109eefe2a2SStefan Roese * @sqnum: sequence number 4119eefe2a2SStefan Roese * @len: full node length 4129eefe2a2SStefan Roese * @node_type: node type 4139eefe2a2SStefan Roese * @group_type: node group type 4149eefe2a2SStefan Roese * @padding: reserved for future, zeroes 4159eefe2a2SStefan Roese * 4169eefe2a2SStefan Roese * Every UBIFS node starts with this common part. If the node has a key, the 4179eefe2a2SStefan Roese * key always goes next. 4189eefe2a2SStefan Roese */ 4199eefe2a2SStefan Roese struct ubifs_ch { 4209eefe2a2SStefan Roese __le32 magic; 4219eefe2a2SStefan Roese __le32 crc; 4229eefe2a2SStefan Roese __le64 sqnum; 4239eefe2a2SStefan Roese __le32 len; 4249eefe2a2SStefan Roese __u8 node_type; 4259eefe2a2SStefan Roese __u8 group_type; 4269eefe2a2SStefan Roese __u8 padding[2]; 427ff94bc40SHeiko Schocher } __packed; 4289eefe2a2SStefan Roese 4299eefe2a2SStefan Roese /** 4309eefe2a2SStefan Roese * union ubifs_dev_desc - device node descriptor. 4319eefe2a2SStefan Roese * @new: new type device descriptor 4329eefe2a2SStefan Roese * @huge: huge type device descriptor 4339eefe2a2SStefan Roese * 4349eefe2a2SStefan Roese * This data structure describes major/minor numbers of a device node. In an 4359eefe2a2SStefan Roese * inode is a device node then its data contains an object of this type. UBIFS 4369eefe2a2SStefan Roese * uses standard Linux "new" and "huge" device node encodings. 4379eefe2a2SStefan Roese */ 4389eefe2a2SStefan Roese union ubifs_dev_desc { 4399eefe2a2SStefan Roese __le32 new; 4409eefe2a2SStefan Roese __le64 huge; 441ff94bc40SHeiko Schocher } __packed; 4429eefe2a2SStefan Roese 4439eefe2a2SStefan Roese /** 4449eefe2a2SStefan Roese * struct ubifs_ino_node - inode node. 4459eefe2a2SStefan Roese * @ch: common header 4469eefe2a2SStefan Roese * @key: node key 4479eefe2a2SStefan Roese * @creat_sqnum: sequence number at time of creation 4489eefe2a2SStefan Roese * @size: inode size in bytes (amount of uncompressed data) 4499eefe2a2SStefan Roese * @atime_sec: access time seconds 4509eefe2a2SStefan Roese * @ctime_sec: creation time seconds 4519eefe2a2SStefan Roese * @mtime_sec: modification time seconds 4529eefe2a2SStefan Roese * @atime_nsec: access time nanoseconds 4539eefe2a2SStefan Roese * @ctime_nsec: creation time nanoseconds 4549eefe2a2SStefan Roese * @mtime_nsec: modification time nanoseconds 4559eefe2a2SStefan Roese * @nlink: number of hard links 4569eefe2a2SStefan Roese * @uid: owner ID 4579eefe2a2SStefan Roese * @gid: group ID 4589eefe2a2SStefan Roese * @mode: access flags 4599eefe2a2SStefan Roese * @flags: per-inode flags (%UBIFS_COMPR_FL, %UBIFS_SYNC_FL, etc) 4609eefe2a2SStefan Roese * @data_len: inode data length 4619eefe2a2SStefan Roese * @xattr_cnt: count of extended attributes this inode has 4629eefe2a2SStefan Roese * @xattr_size: summarized size of all extended attributes in bytes 4639eefe2a2SStefan Roese * @padding1: reserved for future, zeroes 4649eefe2a2SStefan Roese * @xattr_names: sum of lengths of all extended attribute names belonging to 4659eefe2a2SStefan Roese * this inode 4669eefe2a2SStefan Roese * @compr_type: compression type used for this inode 4679eefe2a2SStefan Roese * @padding2: reserved for future, zeroes 4689eefe2a2SStefan Roese * @data: data attached to the inode 4699eefe2a2SStefan Roese * 4709eefe2a2SStefan Roese * Note, even though inode compression type is defined by @compr_type, some 4719eefe2a2SStefan Roese * nodes of this inode may be compressed with different compressor - this 4729eefe2a2SStefan Roese * happens if compression type is changed while the inode already has data 4739eefe2a2SStefan Roese * nodes. But @compr_type will be use for further writes to the inode. 4749eefe2a2SStefan Roese * 4759eefe2a2SStefan Roese * Note, do not forget to amend 'zero_ino_node_unused()' function when changing 4769eefe2a2SStefan Roese * the padding fields. 4779eefe2a2SStefan Roese */ 4789eefe2a2SStefan Roese struct ubifs_ino_node { 4799eefe2a2SStefan Roese struct ubifs_ch ch; 4809eefe2a2SStefan Roese __u8 key[UBIFS_MAX_KEY_LEN]; 4819eefe2a2SStefan Roese __le64 creat_sqnum; 4829eefe2a2SStefan Roese __le64 size; 4839eefe2a2SStefan Roese __le64 atime_sec; 4849eefe2a2SStefan Roese __le64 ctime_sec; 4859eefe2a2SStefan Roese __le64 mtime_sec; 4869eefe2a2SStefan Roese __le32 atime_nsec; 4879eefe2a2SStefan Roese __le32 ctime_nsec; 4889eefe2a2SStefan Roese __le32 mtime_nsec; 4899eefe2a2SStefan Roese __le32 nlink; 4909eefe2a2SStefan Roese __le32 uid; 4919eefe2a2SStefan Roese __le32 gid; 4929eefe2a2SStefan Roese __le32 mode; 4939eefe2a2SStefan Roese __le32 flags; 4949eefe2a2SStefan Roese __le32 data_len; 4959eefe2a2SStefan Roese __le32 xattr_cnt; 4969eefe2a2SStefan Roese __le32 xattr_size; 4979eefe2a2SStefan Roese __u8 padding1[4]; /* Watch 'zero_ino_node_unused()' if changing! */ 4989eefe2a2SStefan Roese __le32 xattr_names; 4999eefe2a2SStefan Roese __le16 compr_type; 5009eefe2a2SStefan Roese __u8 padding2[26]; /* Watch 'zero_ino_node_unused()' if changing! */ 5019eefe2a2SStefan Roese __u8 data[]; 502ff94bc40SHeiko Schocher } __packed; 5039eefe2a2SStefan Roese 5049eefe2a2SStefan Roese /** 5059eefe2a2SStefan Roese * struct ubifs_dent_node - directory entry node. 5069eefe2a2SStefan Roese * @ch: common header 5079eefe2a2SStefan Roese * @key: node key 5089eefe2a2SStefan Roese * @inum: target inode number 5099eefe2a2SStefan Roese * @padding1: reserved for future, zeroes 5109eefe2a2SStefan Roese * @type: type of the target inode (%UBIFS_ITYPE_REG, %UBIFS_ITYPE_DIR, etc) 5119eefe2a2SStefan Roese * @nlen: name length 5129eefe2a2SStefan Roese * @padding2: reserved for future, zeroes 5139eefe2a2SStefan Roese * @name: zero-terminated name 5149eefe2a2SStefan Roese * 5159eefe2a2SStefan Roese * Note, do not forget to amend 'zero_dent_node_unused()' function when 5169eefe2a2SStefan Roese * changing the padding fields. 5179eefe2a2SStefan Roese */ 5189eefe2a2SStefan Roese struct ubifs_dent_node { 5199eefe2a2SStefan Roese struct ubifs_ch ch; 5209eefe2a2SStefan Roese __u8 key[UBIFS_MAX_KEY_LEN]; 5219eefe2a2SStefan Roese __le64 inum; 5229eefe2a2SStefan Roese __u8 padding1; 5239eefe2a2SStefan Roese __u8 type; 5249eefe2a2SStefan Roese __le16 nlen; 5259eefe2a2SStefan Roese __u8 padding2[4]; /* Watch 'zero_dent_node_unused()' if changing! */ 526ff94bc40SHeiko Schocher #ifndef __UBOOT__ 5279eefe2a2SStefan Roese __u8 name[]; 528ff94bc40SHeiko Schocher #else 529ff94bc40SHeiko Schocher char name[]; 530ff94bc40SHeiko Schocher #endif 531ff94bc40SHeiko Schocher } __packed; 5329eefe2a2SStefan Roese 5339eefe2a2SStefan Roese /** 5349eefe2a2SStefan Roese * struct ubifs_data_node - data node. 5359eefe2a2SStefan Roese * @ch: common header 5369eefe2a2SStefan Roese * @key: node key 5379eefe2a2SStefan Roese * @size: uncompressed data size in bytes 5389eefe2a2SStefan Roese * @compr_type: compression type (%UBIFS_COMPR_NONE, %UBIFS_COMPR_LZO, etc) 5399eefe2a2SStefan Roese * @padding: reserved for future, zeroes 5409eefe2a2SStefan Roese * @data: data 5419eefe2a2SStefan Roese * 5429eefe2a2SStefan Roese * Note, do not forget to amend 'zero_data_node_unused()' function when 5439eefe2a2SStefan Roese * changing the padding fields. 5449eefe2a2SStefan Roese */ 5459eefe2a2SStefan Roese struct ubifs_data_node { 5469eefe2a2SStefan Roese struct ubifs_ch ch; 5479eefe2a2SStefan Roese __u8 key[UBIFS_MAX_KEY_LEN]; 5489eefe2a2SStefan Roese __le32 size; 5499eefe2a2SStefan Roese __le16 compr_type; 5509eefe2a2SStefan Roese __u8 padding[2]; /* Watch 'zero_data_node_unused()' if changing! */ 5519eefe2a2SStefan Roese __u8 data[]; 552ff94bc40SHeiko Schocher } __packed; 5539eefe2a2SStefan Roese 5549eefe2a2SStefan Roese /** 5559eefe2a2SStefan Roese * struct ubifs_trun_node - truncation node. 5569eefe2a2SStefan Roese * @ch: common header 5579eefe2a2SStefan Roese * @inum: truncated inode number 5589eefe2a2SStefan Roese * @padding: reserved for future, zeroes 5599eefe2a2SStefan Roese * @old_size: size before truncation 5609eefe2a2SStefan Roese * @new_size: size after truncation 5619eefe2a2SStefan Roese * 5629eefe2a2SStefan Roese * This node exists only in the journal and never goes to the main area. Note, 5639eefe2a2SStefan Roese * do not forget to amend 'zero_trun_node_unused()' function when changing the 5649eefe2a2SStefan Roese * padding fields. 5659eefe2a2SStefan Roese */ 5669eefe2a2SStefan Roese struct ubifs_trun_node { 5679eefe2a2SStefan Roese struct ubifs_ch ch; 5689eefe2a2SStefan Roese __le32 inum; 5699eefe2a2SStefan Roese __u8 padding[12]; /* Watch 'zero_trun_node_unused()' if changing! */ 5709eefe2a2SStefan Roese __le64 old_size; 5719eefe2a2SStefan Roese __le64 new_size; 572ff94bc40SHeiko Schocher } __packed; 5739eefe2a2SStefan Roese 5749eefe2a2SStefan Roese /** 5759eefe2a2SStefan Roese * struct ubifs_pad_node - padding node. 5769eefe2a2SStefan Roese * @ch: common header 5779eefe2a2SStefan Roese * @pad_len: how many bytes after this node are unused (because padded) 5789eefe2a2SStefan Roese * @padding: reserved for future, zeroes 5799eefe2a2SStefan Roese */ 5809eefe2a2SStefan Roese struct ubifs_pad_node { 5819eefe2a2SStefan Roese struct ubifs_ch ch; 5829eefe2a2SStefan Roese __le32 pad_len; 583ff94bc40SHeiko Schocher } __packed; 5849eefe2a2SStefan Roese 5859eefe2a2SStefan Roese /** 5869eefe2a2SStefan Roese * struct ubifs_sb_node - superblock node. 5879eefe2a2SStefan Roese * @ch: common header 5889eefe2a2SStefan Roese * @padding: reserved for future, zeroes 5899eefe2a2SStefan Roese * @key_hash: type of hash function used in keys 5909eefe2a2SStefan Roese * @key_fmt: format of the key 5919eefe2a2SStefan Roese * @flags: file-system flags (%UBIFS_FLG_BIGLPT, etc) 5929eefe2a2SStefan Roese * @min_io_size: minimal input/output unit size 5939eefe2a2SStefan Roese * @leb_size: logical eraseblock size in bytes 5949eefe2a2SStefan Roese * @leb_cnt: count of LEBs used by file-system 5959eefe2a2SStefan Roese * @max_leb_cnt: maximum count of LEBs used by file-system 5969eefe2a2SStefan Roese * @max_bud_bytes: maximum amount of data stored in buds 5979eefe2a2SStefan Roese * @log_lebs: log size in logical eraseblocks 5989eefe2a2SStefan Roese * @lpt_lebs: number of LEBs used for lprops table 5999eefe2a2SStefan Roese * @orph_lebs: number of LEBs used for recording orphans 6009eefe2a2SStefan Roese * @jhead_cnt: count of journal heads 6019eefe2a2SStefan Roese * @fanout: tree fanout (max. number of links per indexing node) 6029eefe2a2SStefan Roese * @lsave_cnt: number of LEB numbers in LPT's save table 6039eefe2a2SStefan Roese * @fmt_version: UBIFS on-flash format version 6049eefe2a2SStefan Roese * @default_compr: default compression algorithm (%UBIFS_COMPR_LZO, etc) 6059eefe2a2SStefan Roese * @padding1: reserved for future, zeroes 6069eefe2a2SStefan Roese * @rp_uid: reserve pool UID 6079eefe2a2SStefan Roese * @rp_gid: reserve pool GID 6089eefe2a2SStefan Roese * @rp_size: size of the reserved pool in bytes 6099eefe2a2SStefan Roese * @padding2: reserved for future, zeroes 6109eefe2a2SStefan Roese * @time_gran: time granularity in nanoseconds 6119eefe2a2SStefan Roese * @uuid: UUID generated when the file system image was created 612febd7e41SArtem Bityutskiy * @ro_compat_version: UBIFS R/O compatibility version 6139eefe2a2SStefan Roese */ 6149eefe2a2SStefan Roese struct ubifs_sb_node { 6159eefe2a2SStefan Roese struct ubifs_ch ch; 6169eefe2a2SStefan Roese __u8 padding[2]; 6179eefe2a2SStefan Roese __u8 key_hash; 6189eefe2a2SStefan Roese __u8 key_fmt; 6199eefe2a2SStefan Roese __le32 flags; 6209eefe2a2SStefan Roese __le32 min_io_size; 6219eefe2a2SStefan Roese __le32 leb_size; 6229eefe2a2SStefan Roese __le32 leb_cnt; 6239eefe2a2SStefan Roese __le32 max_leb_cnt; 6249eefe2a2SStefan Roese __le64 max_bud_bytes; 6259eefe2a2SStefan Roese __le32 log_lebs; 6269eefe2a2SStefan Roese __le32 lpt_lebs; 6279eefe2a2SStefan Roese __le32 orph_lebs; 6289eefe2a2SStefan Roese __le32 jhead_cnt; 6299eefe2a2SStefan Roese __le32 fanout; 6309eefe2a2SStefan Roese __le32 lsave_cnt; 6319eefe2a2SStefan Roese __le32 fmt_version; 6329eefe2a2SStefan Roese __le16 default_compr; 6339eefe2a2SStefan Roese __u8 padding1[2]; 6349eefe2a2SStefan Roese __le32 rp_uid; 6359eefe2a2SStefan Roese __le32 rp_gid; 6369eefe2a2SStefan Roese __le64 rp_size; 6379eefe2a2SStefan Roese __le32 time_gran; 6389eefe2a2SStefan Roese __u8 uuid[16]; 639febd7e41SArtem Bityutskiy __le32 ro_compat_version; 640febd7e41SArtem Bityutskiy __u8 padding2[3968]; 641ff94bc40SHeiko Schocher } __packed; 6429eefe2a2SStefan Roese 6439eefe2a2SStefan Roese /** 6449eefe2a2SStefan Roese * struct ubifs_mst_node - master node. 6459eefe2a2SStefan Roese * @ch: common header 6469eefe2a2SStefan Roese * @highest_inum: highest inode number in the committed index 6479eefe2a2SStefan Roese * @cmt_no: commit number 6489eefe2a2SStefan Roese * @flags: various flags (%UBIFS_MST_DIRTY, etc) 6499eefe2a2SStefan Roese * @log_lnum: start of the log 6509eefe2a2SStefan Roese * @root_lnum: LEB number of the root indexing node 6519eefe2a2SStefan Roese * @root_offs: offset within @root_lnum 6529eefe2a2SStefan Roese * @root_len: root indexing node length 6539eefe2a2SStefan Roese * @gc_lnum: LEB reserved for garbage collection (%-1 value means the LEB was 6549eefe2a2SStefan Roese * not reserved and should be reserved on mount) 6559eefe2a2SStefan Roese * @ihead_lnum: LEB number of index head 6569eefe2a2SStefan Roese * @ihead_offs: offset of index head 6579eefe2a2SStefan Roese * @index_size: size of index on flash 6589eefe2a2SStefan Roese * @total_free: total free space in bytes 6599eefe2a2SStefan Roese * @total_dirty: total dirty space in bytes 6609eefe2a2SStefan Roese * @total_used: total used space in bytes (includes only data LEBs) 6619eefe2a2SStefan Roese * @total_dead: total dead space in bytes (includes only data LEBs) 6629eefe2a2SStefan Roese * @total_dark: total dark space in bytes (includes only data LEBs) 6639eefe2a2SStefan Roese * @lpt_lnum: LEB number of LPT root nnode 6649eefe2a2SStefan Roese * @lpt_offs: offset of LPT root nnode 6659eefe2a2SStefan Roese * @nhead_lnum: LEB number of LPT head 6669eefe2a2SStefan Roese * @nhead_offs: offset of LPT head 6679eefe2a2SStefan Roese * @ltab_lnum: LEB number of LPT's own lprops table 6689eefe2a2SStefan Roese * @ltab_offs: offset of LPT's own lprops table 6699eefe2a2SStefan Roese * @lsave_lnum: LEB number of LPT's save table (big model only) 6709eefe2a2SStefan Roese * @lsave_offs: offset of LPT's save table (big model only) 6719eefe2a2SStefan Roese * @lscan_lnum: LEB number of last LPT scan 6729eefe2a2SStefan Roese * @empty_lebs: number of empty logical eraseblocks 6739eefe2a2SStefan Roese * @idx_lebs: number of indexing logical eraseblocks 6749eefe2a2SStefan Roese * @leb_cnt: count of LEBs used by file-system 6759eefe2a2SStefan Roese * @padding: reserved for future, zeroes 6769eefe2a2SStefan Roese */ 6779eefe2a2SStefan Roese struct ubifs_mst_node { 6789eefe2a2SStefan Roese struct ubifs_ch ch; 6799eefe2a2SStefan Roese __le64 highest_inum; 6809eefe2a2SStefan Roese __le64 cmt_no; 6819eefe2a2SStefan Roese __le32 flags; 6829eefe2a2SStefan Roese __le32 log_lnum; 6839eefe2a2SStefan Roese __le32 root_lnum; 6849eefe2a2SStefan Roese __le32 root_offs; 6859eefe2a2SStefan Roese __le32 root_len; 6869eefe2a2SStefan Roese __le32 gc_lnum; 6879eefe2a2SStefan Roese __le32 ihead_lnum; 6889eefe2a2SStefan Roese __le32 ihead_offs; 6899eefe2a2SStefan Roese __le64 index_size; 6909eefe2a2SStefan Roese __le64 total_free; 6919eefe2a2SStefan Roese __le64 total_dirty; 6929eefe2a2SStefan Roese __le64 total_used; 6939eefe2a2SStefan Roese __le64 total_dead; 6949eefe2a2SStefan Roese __le64 total_dark; 6959eefe2a2SStefan Roese __le32 lpt_lnum; 6969eefe2a2SStefan Roese __le32 lpt_offs; 6979eefe2a2SStefan Roese __le32 nhead_lnum; 6989eefe2a2SStefan Roese __le32 nhead_offs; 6999eefe2a2SStefan Roese __le32 ltab_lnum; 7009eefe2a2SStefan Roese __le32 ltab_offs; 7019eefe2a2SStefan Roese __le32 lsave_lnum; 7029eefe2a2SStefan Roese __le32 lsave_offs; 7039eefe2a2SStefan Roese __le32 lscan_lnum; 7049eefe2a2SStefan Roese __le32 empty_lebs; 7059eefe2a2SStefan Roese __le32 idx_lebs; 7069eefe2a2SStefan Roese __le32 leb_cnt; 7079eefe2a2SStefan Roese __u8 padding[344]; 708ff94bc40SHeiko Schocher } __packed; 7099eefe2a2SStefan Roese 7109eefe2a2SStefan Roese /** 7119eefe2a2SStefan Roese * struct ubifs_ref_node - logical eraseblock reference node. 7129eefe2a2SStefan Roese * @ch: common header 7139eefe2a2SStefan Roese * @lnum: the referred logical eraseblock number 7149eefe2a2SStefan Roese * @offs: start offset in the referred LEB 7159eefe2a2SStefan Roese * @jhead: journal head number 7169eefe2a2SStefan Roese * @padding: reserved for future, zeroes 7179eefe2a2SStefan Roese */ 7189eefe2a2SStefan Roese struct ubifs_ref_node { 7199eefe2a2SStefan Roese struct ubifs_ch ch; 7209eefe2a2SStefan Roese __le32 lnum; 7219eefe2a2SStefan Roese __le32 offs; 7229eefe2a2SStefan Roese __le32 jhead; 7239eefe2a2SStefan Roese __u8 padding[28]; 724ff94bc40SHeiko Schocher } __packed; 7259eefe2a2SStefan Roese 7269eefe2a2SStefan Roese /** 7279eefe2a2SStefan Roese * struct ubifs_branch - key/reference/length branch 7289eefe2a2SStefan Roese * @lnum: LEB number of the target node 7299eefe2a2SStefan Roese * @offs: offset within @lnum 7309eefe2a2SStefan Roese * @len: target node length 7319eefe2a2SStefan Roese * @key: key 7329eefe2a2SStefan Roese */ 7339eefe2a2SStefan Roese struct ubifs_branch { 7349eefe2a2SStefan Roese __le32 lnum; 7359eefe2a2SStefan Roese __le32 offs; 7369eefe2a2SStefan Roese __le32 len; 737ff94bc40SHeiko Schocher #ifndef __UBOOT__ 7389eefe2a2SStefan Roese __u8 key[]; 739ff94bc40SHeiko Schocher #else 740ff94bc40SHeiko Schocher char key[]; 741ff94bc40SHeiko Schocher #endif 742ff94bc40SHeiko Schocher } __packed; 7439eefe2a2SStefan Roese 7449eefe2a2SStefan Roese /** 7459eefe2a2SStefan Roese * struct ubifs_idx_node - indexing node. 7469eefe2a2SStefan Roese * @ch: common header 7479eefe2a2SStefan Roese * @child_cnt: number of child index nodes 7489eefe2a2SStefan Roese * @level: tree level 7499eefe2a2SStefan Roese * @branches: LEB number / offset / length / key branches 7509eefe2a2SStefan Roese */ 7519eefe2a2SStefan Roese struct ubifs_idx_node { 7529eefe2a2SStefan Roese struct ubifs_ch ch; 7539eefe2a2SStefan Roese __le16 child_cnt; 7549eefe2a2SStefan Roese __le16 level; 755ff94bc40SHeiko Schocher #ifndef __UBOOT__ 7569eefe2a2SStefan Roese __u8 branches[]; 757ff94bc40SHeiko Schocher #else 758ff94bc40SHeiko Schocher char branches[]; 759ff94bc40SHeiko Schocher #endif 760ff94bc40SHeiko Schocher } __packed; 7619eefe2a2SStefan Roese 7629eefe2a2SStefan Roese /** 7639eefe2a2SStefan Roese * struct ubifs_cs_node - commit start node. 7649eefe2a2SStefan Roese * @ch: common header 7659eefe2a2SStefan Roese * @cmt_no: commit number 7669eefe2a2SStefan Roese */ 7679eefe2a2SStefan Roese struct ubifs_cs_node { 7689eefe2a2SStefan Roese struct ubifs_ch ch; 7699eefe2a2SStefan Roese __le64 cmt_no; 770ff94bc40SHeiko Schocher } __packed; 7719eefe2a2SStefan Roese 7729eefe2a2SStefan Roese /** 7739eefe2a2SStefan Roese * struct ubifs_orph_node - orphan node. 7749eefe2a2SStefan Roese * @ch: common header 7759eefe2a2SStefan Roese * @cmt_no: commit number (also top bit is set on the last node of the commit) 7769eefe2a2SStefan Roese * @inos: inode numbers of orphans 7779eefe2a2SStefan Roese */ 7789eefe2a2SStefan Roese struct ubifs_orph_node { 7799eefe2a2SStefan Roese struct ubifs_ch ch; 7809eefe2a2SStefan Roese __le64 cmt_no; 7819eefe2a2SStefan Roese __le64 inos[]; 782ff94bc40SHeiko Schocher } __packed; 7839eefe2a2SStefan Roese 7849eefe2a2SStefan Roese #endif /* __UBIFS_MEDIA_H__ */ 785