cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

erofs_fs.h (13773B)


      1/* SPDX-License-Identifier: GPL-2.0-only OR Apache-2.0 */
      2/*
      3 * EROFS (Enhanced ROM File System) on-disk format definition
      4 *
      5 * Copyright (C) 2017-2018 HUAWEI, Inc.
      6 *             https://www.huawei.com/
      7 * Copyright (C) 2021, Alibaba Cloud
      8 */
      9#ifndef __EROFS_FS_H
     10#define __EROFS_FS_H
     11
     12#define EROFS_SUPER_OFFSET      1024
     13
     14#define EROFS_FEATURE_COMPAT_SB_CHKSUM          0x00000001
     15#define EROFS_FEATURE_COMPAT_MTIME              0x00000002
     16
     17/*
     18 * Any bits that aren't in EROFS_ALL_FEATURE_INCOMPAT should
     19 * be incompatible with this kernel version.
     20 */
     21#define EROFS_FEATURE_INCOMPAT_ZERO_PADDING	0x00000001
     22#define EROFS_FEATURE_INCOMPAT_COMPR_CFGS	0x00000002
     23#define EROFS_FEATURE_INCOMPAT_BIG_PCLUSTER	0x00000002
     24#define EROFS_FEATURE_INCOMPAT_CHUNKED_FILE	0x00000004
     25#define EROFS_FEATURE_INCOMPAT_DEVICE_TABLE	0x00000008
     26#define EROFS_FEATURE_INCOMPAT_COMPR_HEAD2	0x00000008
     27#define EROFS_FEATURE_INCOMPAT_ZTAILPACKING	0x00000010
     28#define EROFS_ALL_FEATURE_INCOMPAT		\
     29	(EROFS_FEATURE_INCOMPAT_ZERO_PADDING | \
     30	 EROFS_FEATURE_INCOMPAT_COMPR_CFGS | \
     31	 EROFS_FEATURE_INCOMPAT_BIG_PCLUSTER | \
     32	 EROFS_FEATURE_INCOMPAT_CHUNKED_FILE | \
     33	 EROFS_FEATURE_INCOMPAT_DEVICE_TABLE | \
     34	 EROFS_FEATURE_INCOMPAT_COMPR_HEAD2 | \
     35	 EROFS_FEATURE_INCOMPAT_ZTAILPACKING)
     36
     37#define EROFS_SB_EXTSLOT_SIZE	16
     38
     39struct erofs_deviceslot {
     40	u8 tag[64];		/* digest(sha256), etc. */
     41	__le32 blocks;		/* total fs blocks of this device */
     42	__le32 mapped_blkaddr;	/* map starting at mapped_blkaddr */
     43	u8 reserved[56];
     44};
     45#define EROFS_DEVT_SLOT_SIZE	sizeof(struct erofs_deviceslot)
     46
     47/* erofs on-disk super block (currently 128 bytes) */
     48struct erofs_super_block {
     49	__le32 magic;           /* file system magic number */
     50	__le32 checksum;        /* crc32c(super_block) */
     51	__le32 feature_compat;
     52	__u8 blkszbits;         /* support block_size == PAGE_SIZE only */
     53	__u8 sb_extslots;	/* superblock size = 128 + sb_extslots * 16 */
     54
     55	__le16 root_nid;	/* nid of root directory */
     56	__le64 inos;            /* total valid ino # (== f_files - f_favail) */
     57
     58	__le64 build_time;      /* compact inode time derivation */
     59	__le32 build_time_nsec;	/* compact inode time derivation in ns scale */
     60	__le32 blocks;          /* used for statfs */
     61	__le32 meta_blkaddr;	/* start block address of metadata area */
     62	__le32 xattr_blkaddr;	/* start block address of shared xattr area */
     63	__u8 uuid[16];          /* 128-bit uuid for volume */
     64	__u8 volume_name[16];   /* volume name */
     65	__le32 feature_incompat;
     66	union {
     67		/* bitmap for available compression algorithms */
     68		__le16 available_compr_algs;
     69		/* customized sliding window size instead of 64k by default */
     70		__le16 lz4_max_distance;
     71	} __packed u1;
     72	__le16 extra_devices;	/* # of devices besides the primary device */
     73	__le16 devt_slotoff;	/* startoff = devt_slotoff * devt_slotsize */
     74	__u8 reserved2[38];
     75};
     76
     77/*
     78 * erofs inode datalayout (i_format in on-disk inode):
     79 * 0 - uncompressed flat inode without tail-packing inline data:
     80 * inode, [xattrs], ... | ... | no-holed data
     81 * 1 - compressed inode with non-compact indexes:
     82 * inode, [xattrs], [map_header], extents ... | ...
     83 * 2 - uncompressed flat inode with tail-packing inline data:
     84 * inode, [xattrs], tailpacking data, ... | ... | no-holed data
     85 * 3 - compressed inode with compact indexes:
     86 * inode, [xattrs], map_header, extents ... | ...
     87 * 4 - chunk-based inode with (optional) multi-device support:
     88 * inode, [xattrs], chunk indexes ... | ...
     89 * 5~7 - reserved
     90 */
     91enum {
     92	EROFS_INODE_FLAT_PLAIN			= 0,
     93	EROFS_INODE_FLAT_COMPRESSION_LEGACY	= 1,
     94	EROFS_INODE_FLAT_INLINE			= 2,
     95	EROFS_INODE_FLAT_COMPRESSION		= 3,
     96	EROFS_INODE_CHUNK_BASED			= 4,
     97	EROFS_INODE_DATALAYOUT_MAX
     98};
     99
    100static inline bool erofs_inode_is_data_compressed(unsigned int datamode)
    101{
    102	return datamode == EROFS_INODE_FLAT_COMPRESSION ||
    103		datamode == EROFS_INODE_FLAT_COMPRESSION_LEGACY;
    104}
    105
    106/* bit definitions of inode i_format */
    107#define EROFS_I_VERSION_BITS            1
    108#define EROFS_I_DATALAYOUT_BITS         3
    109
    110#define EROFS_I_VERSION_BIT             0
    111#define EROFS_I_DATALAYOUT_BIT          1
    112
    113#define EROFS_I_ALL	\
    114	((1 << (EROFS_I_DATALAYOUT_BIT + EROFS_I_DATALAYOUT_BITS)) - 1)
    115
    116/* indicate chunk blkbits, thus 'chunksize = blocksize << chunk blkbits' */
    117#define EROFS_CHUNK_FORMAT_BLKBITS_MASK		0x001F
    118/* with chunk indexes or just a 4-byte blkaddr array */
    119#define EROFS_CHUNK_FORMAT_INDEXES		0x0020
    120
    121#define EROFS_CHUNK_FORMAT_ALL	\
    122	(EROFS_CHUNK_FORMAT_BLKBITS_MASK | EROFS_CHUNK_FORMAT_INDEXES)
    123
    124struct erofs_inode_chunk_info {
    125	__le16 format;		/* chunk blkbits, etc. */
    126	__le16 reserved;
    127};
    128
    129/* 32-byte reduced form of an ondisk inode */
    130struct erofs_inode_compact {
    131	__le16 i_format;	/* inode format hints */
    132
    133/* 1 header + n-1 * 4 bytes inline xattr to keep continuity */
    134	__le16 i_xattr_icount;
    135	__le16 i_mode;
    136	__le16 i_nlink;
    137	__le32 i_size;
    138	__le32 i_reserved;
    139	union {
    140		/* total compressed blocks for compressed inodes */
    141		__le32 compressed_blocks;
    142		/* block address for uncompressed flat inodes */
    143		__le32 raw_blkaddr;
    144
    145		/* for device files, used to indicate old/new device # */
    146		__le32 rdev;
    147
    148		/* for chunk-based files, it contains the summary info */
    149		struct erofs_inode_chunk_info c;
    150	} i_u;
    151	__le32 i_ino;           /* only used for 32-bit stat compatibility */
    152	__le16 i_uid;
    153	__le16 i_gid;
    154	__le32 i_reserved2;
    155};
    156
    157/* 32-byte on-disk inode */
    158#define EROFS_INODE_LAYOUT_COMPACT	0
    159/* 64-byte on-disk inode */
    160#define EROFS_INODE_LAYOUT_EXTENDED	1
    161
    162/* 64-byte complete form of an ondisk inode */
    163struct erofs_inode_extended {
    164	__le16 i_format;	/* inode format hints */
    165
    166/* 1 header + n-1 * 4 bytes inline xattr to keep continuity */
    167	__le16 i_xattr_icount;
    168	__le16 i_mode;
    169	__le16 i_reserved;
    170	__le64 i_size;
    171	union {
    172		/* total compressed blocks for compressed inodes */
    173		__le32 compressed_blocks;
    174		/* block address for uncompressed flat inodes */
    175		__le32 raw_blkaddr;
    176
    177		/* for device files, used to indicate old/new device # */
    178		__le32 rdev;
    179
    180		/* for chunk-based files, it contains the summary info */
    181		struct erofs_inode_chunk_info c;
    182	} i_u;
    183
    184	/* only used for 32-bit stat compatibility */
    185	__le32 i_ino;
    186
    187	__le32 i_uid;
    188	__le32 i_gid;
    189	__le64 i_mtime;
    190	__le32 i_mtime_nsec;
    191	__le32 i_nlink;
    192	__u8   i_reserved2[16];
    193};
    194
    195#define EROFS_MAX_SHARED_XATTRS         (128)
    196/* h_shared_count between 129 ... 255 are special # */
    197#define EROFS_SHARED_XATTR_EXTENT       (255)
    198
    199/*
    200 * inline xattrs (n == i_xattr_icount):
    201 * erofs_xattr_ibody_header(1) + (n - 1) * 4 bytes
    202 *          12 bytes           /                   \
    203 *                            /                     \
    204 *                           /-----------------------\
    205 *                           |  erofs_xattr_entries+ |
    206 *                           +-----------------------+
    207 * inline xattrs must starts in erofs_xattr_ibody_header,
    208 * for read-only fs, no need to introduce h_refcount
    209 */
    210struct erofs_xattr_ibody_header {
    211	__le32 h_reserved;
    212	__u8   h_shared_count;
    213	__u8   h_reserved2[7];
    214	__le32 h_shared_xattrs[];       /* shared xattr id array */
    215};
    216
    217/* Name indexes */
    218#define EROFS_XATTR_INDEX_USER              1
    219#define EROFS_XATTR_INDEX_POSIX_ACL_ACCESS  2
    220#define EROFS_XATTR_INDEX_POSIX_ACL_DEFAULT 3
    221#define EROFS_XATTR_INDEX_TRUSTED           4
    222#define EROFS_XATTR_INDEX_LUSTRE            5
    223#define EROFS_XATTR_INDEX_SECURITY          6
    224
    225/* xattr entry (for both inline & shared xattrs) */
    226struct erofs_xattr_entry {
    227	__u8   e_name_len;      /* length of name */
    228	__u8   e_name_index;    /* attribute name index */
    229	__le16 e_value_size;    /* size of attribute value */
    230	/* followed by e_name and e_value */
    231	char   e_name[];        /* attribute name */
    232};
    233
    234static inline unsigned int erofs_xattr_ibody_size(__le16 i_xattr_icount)
    235{
    236	if (!i_xattr_icount)
    237		return 0;
    238
    239	return sizeof(struct erofs_xattr_ibody_header) +
    240		sizeof(__u32) * (le16_to_cpu(i_xattr_icount) - 1);
    241}
    242
    243#define EROFS_XATTR_ALIGN(size) round_up(size, sizeof(struct erofs_xattr_entry))
    244
    245static inline unsigned int erofs_xattr_entry_size(struct erofs_xattr_entry *e)
    246{
    247	return EROFS_XATTR_ALIGN(sizeof(struct erofs_xattr_entry) +
    248				 e->e_name_len + le16_to_cpu(e->e_value_size));
    249}
    250
    251/* represent a zeroed chunk (hole) */
    252#define EROFS_NULL_ADDR			-1
    253
    254/* 4-byte block address array */
    255#define EROFS_BLOCK_MAP_ENTRY_SIZE	sizeof(__le32)
    256
    257/* 8-byte inode chunk indexes */
    258struct erofs_inode_chunk_index {
    259	__le16 advise;		/* always 0, don't care for now */
    260	__le16 device_id;	/* back-end storage id (with bits masked) */
    261	__le32 blkaddr;		/* start block address of this inode chunk */
    262};
    263
    264/* maximum supported size of a physical compression cluster */
    265#define Z_EROFS_PCLUSTER_MAX_SIZE	(1024 * 1024)
    266
    267/* available compression algorithm types (for h_algorithmtype) */
    268enum {
    269	Z_EROFS_COMPRESSION_LZ4		= 0,
    270	Z_EROFS_COMPRESSION_LZMA	= 1,
    271	Z_EROFS_COMPRESSION_MAX
    272};
    273#define Z_EROFS_ALL_COMPR_ALGS		((1 << Z_EROFS_COMPRESSION_MAX) - 1)
    274
    275/* 14 bytes (+ length field = 16 bytes) */
    276struct z_erofs_lz4_cfgs {
    277	__le16 max_distance;
    278	__le16 max_pclusterblks;
    279	u8 reserved[10];
    280} __packed;
    281
    282/* 14 bytes (+ length field = 16 bytes) */
    283struct z_erofs_lzma_cfgs {
    284	__le32 dict_size;
    285	__le16 format;
    286	u8 reserved[8];
    287} __packed;
    288
    289#define Z_EROFS_LZMA_MAX_DICT_SIZE	(8 * Z_EROFS_PCLUSTER_MAX_SIZE)
    290
    291/*
    292 * bit 0 : COMPACTED_2B indexes (0 - off; 1 - on)
    293 *  e.g. for 4k logical cluster size,      4B        if compacted 2B is off;
    294 *                                  (4B) + 2B + (4B) if compacted 2B is on.
    295 * bit 1 : HEAD1 big pcluster (0 - off; 1 - on)
    296 * bit 2 : HEAD2 big pcluster (0 - off; 1 - on)
    297 * bit 3 : tailpacking inline pcluster (0 - off; 1 - on)
    298 */
    299#define Z_EROFS_ADVISE_COMPACTED_2B		0x0001
    300#define Z_EROFS_ADVISE_BIG_PCLUSTER_1		0x0002
    301#define Z_EROFS_ADVISE_BIG_PCLUSTER_2		0x0004
    302#define Z_EROFS_ADVISE_INLINE_PCLUSTER		0x0008
    303
    304struct z_erofs_map_header {
    305	__le16	h_reserved1;
    306	/* indicates the encoded size of tailpacking data */
    307	__le16  h_idata_size;
    308	__le16	h_advise;
    309	/*
    310	 * bit 0-3 : algorithm type of head 1 (logical cluster type 01);
    311	 * bit 4-7 : algorithm type of head 2 (logical cluster type 11).
    312	 */
    313	__u8	h_algorithmtype;
    314	/*
    315	 * bit 0-2 : logical cluster bits - 12, e.g. 0 for 4096;
    316	 * bit 3-7 : reserved.
    317	 */
    318	__u8	h_clusterbits;
    319};
    320
    321#define Z_EROFS_VLE_LEGACY_HEADER_PADDING       8
    322
    323/*
    324 * Fixed-sized output compression on-disk logical cluster type:
    325 *    0   - literal (uncompressed) lcluster
    326 *    1,3 - compressed lcluster (for HEAD lclusters)
    327 *    2   - compressed lcluster (for NONHEAD lclusters)
    328 *
    329 * In detail,
    330 *    0 - literal (uncompressed) lcluster,
    331 *        di_advise = 0
    332 *        di_clusterofs = the literal data offset of the lcluster
    333 *        di_blkaddr = the blkaddr of the literal pcluster
    334 *
    335 *    1,3 - compressed lcluster (for HEAD lclusters)
    336 *        di_advise = 1 or 3
    337 *        di_clusterofs = the decompressed data offset of the lcluster
    338 *        di_blkaddr = the blkaddr of the compressed pcluster
    339 *
    340 *    2 - compressed lcluster (for NONHEAD lclusters)
    341 *        di_advise = 2
    342 *        di_clusterofs =
    343 *           the decompressed data offset in its own HEAD lcluster
    344 *        di_u.delta[0] = distance to this HEAD lcluster
    345 *        di_u.delta[1] = distance to the next HEAD lcluster
    346 */
    347enum {
    348	Z_EROFS_VLE_CLUSTER_TYPE_PLAIN		= 0,
    349	Z_EROFS_VLE_CLUSTER_TYPE_HEAD1		= 1,
    350	Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD	= 2,
    351	Z_EROFS_VLE_CLUSTER_TYPE_HEAD2		= 3,
    352	Z_EROFS_VLE_CLUSTER_TYPE_MAX
    353};
    354
    355#define Z_EROFS_VLE_DI_CLUSTER_TYPE_BITS        2
    356#define Z_EROFS_VLE_DI_CLUSTER_TYPE_BIT         0
    357
    358/*
    359 * D0_CBLKCNT will be marked _only_ at the 1st non-head lcluster to store the
    360 * compressed block count of a compressed extent (in logical clusters, aka.
    361 * block count of a pcluster).
    362 */
    363#define Z_EROFS_VLE_DI_D0_CBLKCNT		(1 << 11)
    364
    365struct z_erofs_vle_decompressed_index {
    366	__le16 di_advise;
    367	/* where to decompress in the head lcluster */
    368	__le16 di_clusterofs;
    369
    370	union {
    371		/* for the HEAD lclusters */
    372		__le32 blkaddr;
    373		/*
    374		 * for the NONHEAD lclusters
    375		 * [0] - distance to its HEAD lcluster
    376		 * [1] - distance to the next HEAD lcluster
    377		 */
    378		__le16 delta[2];
    379	} di_u;
    380};
    381
    382#define Z_EROFS_VLE_LEGACY_INDEX_ALIGN(size) \
    383	(round_up(size, sizeof(struct z_erofs_vle_decompressed_index)) + \
    384	 sizeof(struct z_erofs_map_header) + Z_EROFS_VLE_LEGACY_HEADER_PADDING)
    385
    386/* dirent sorts in alphabet order, thus we can do binary search */
    387struct erofs_dirent {
    388	__le64 nid;     /* node number */
    389	__le16 nameoff; /* start offset of file name */
    390	__u8 file_type; /* file type */
    391	__u8 reserved;  /* reserved */
    392} __packed;
    393
    394/*
    395 * EROFS file types should match generic FT_* types and
    396 * it seems no need to add BUILD_BUG_ONs since potential
    397 * unmatchness will break other fses as well...
    398 */
    399
    400#define EROFS_NAME_LEN      255
    401
    402/* check the EROFS on-disk layout strictly at compile time */
    403static inline void erofs_check_ondisk_layout_definitions(void)
    404{
    405	BUILD_BUG_ON(sizeof(struct erofs_super_block) != 128);
    406	BUILD_BUG_ON(sizeof(struct erofs_inode_compact) != 32);
    407	BUILD_BUG_ON(sizeof(struct erofs_inode_extended) != 64);
    408	BUILD_BUG_ON(sizeof(struct erofs_xattr_ibody_header) != 12);
    409	BUILD_BUG_ON(sizeof(struct erofs_xattr_entry) != 4);
    410	BUILD_BUG_ON(sizeof(struct erofs_inode_chunk_info) != 4);
    411	BUILD_BUG_ON(sizeof(struct erofs_inode_chunk_index) != 8);
    412	BUILD_BUG_ON(sizeof(struct z_erofs_map_header) != 8);
    413	BUILD_BUG_ON(sizeof(struct z_erofs_vle_decompressed_index) != 8);
    414	BUILD_BUG_ON(sizeof(struct erofs_dirent) != 12);
    415	/* keep in sync between 2 index structures for better extendibility */
    416	BUILD_BUG_ON(sizeof(struct erofs_inode_chunk_index) !=
    417		     sizeof(struct z_erofs_vle_decompressed_index));
    418	BUILD_BUG_ON(sizeof(struct erofs_deviceslot) != 128);
    419
    420	BUILD_BUG_ON(BIT(Z_EROFS_VLE_DI_CLUSTER_TYPE_BITS) <
    421		     Z_EROFS_VLE_CLUSTER_TYPE_MAX - 1);
    422}
    423
    424#endif