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