diff options
author | Gao Xiang <gaoxiang25@huawei.com> | 2019-09-16 16:18:08 +0800 |
---|---|---|
committer | Gao Xiang <hsiangkao@aol.com> | 2019-09-18 00:07:38 +0800 |
commit | fbba92dc493401dec79c902580f6ac2101660eb9 (patch) | |
tree | 01d62cc861ae3127e3dc8f08544b4434278d8a38 | |
parent | 634bb4da8e258287c89c7955725b10433ee448f0 (diff) |
erofs-utils: keep up with in-kernel ondisk format naming
This patch adapts erofs-utils to the latest kernel ondisk definitions,
especially the following kernel commits:
4b66eb51d2c4 erofs: remove all the byte offset comments
60a49ba8fee1 erofs: on-disk format should have explicitly assigned numbers
b6796abd3cc1 erofs: some macros are much more readable as a function
ed34aa4a8a7d erofs: kill __packed for on-disk structures
c39747f770be erofs: update erofs_inode_is_data_compressed helper
426a930891cf erofs: use feature_incompat rather than requirements
8a76568225de erofs: better naming for erofs inode related stuffs
ea559e7b8451 erofs: update erofs_fs.h comments
Reviewed-by: Li Guifu <blucerlee@gmail.com>
Signed-off-by: Gao Xiang <gaoxiang25@huawei.com>
-rw-r--r-- | include/erofs/cache.h | 2 | ||||
-rw-r--r-- | include/erofs/internal.h | 6 | ||||
-rw-r--r-- | include/erofs_fs.h | 198 | ||||
-rw-r--r-- | lib/compress.c | 9 | ||||
-rw-r--r-- | lib/config.c | 2 | ||||
-rw-r--r-- | lib/inode.c | 42 | ||||
-rw-r--r-- | mkfs/main.c | 5 |
7 files changed, 137 insertions, 127 deletions
diff --git a/include/erofs/cache.h b/include/erofs/cache.h index 108757a..71df811 100644 --- a/include/erofs/cache.h +++ b/include/erofs/cache.h @@ -53,7 +53,7 @@ static inline const int get_alignsize(int type, int *type_ret) if (type == INODE) { *type_ret = META; - return sizeof(struct erofs_inode_v1); + return sizeof(struct erofs_inode_compact); } else if (type == XATTR) { *type_ret = META; return sizeof(struct erofs_xattr_entry); diff --git a/include/erofs/internal.h b/include/erofs/internal.h index b7ce6f8..07a32d2 100644 --- a/include/erofs/internal.h +++ b/include/erofs/internal.h @@ -52,7 +52,7 @@ struct erofs_sb_info { erofs_blk_t meta_blkaddr; erofs_blk_t xattr_blkaddr; - u32 requirements; + u32 feature_incompat; }; /* global sbi */ @@ -82,7 +82,7 @@ struct erofs_inode { char i_srcpath[PATH_MAX + 1]; - unsigned char data_mapping_mode; + unsigned char datalayout; unsigned char inode_isize; /* inline tail-end packing size */ unsigned short idata_size; @@ -100,7 +100,7 @@ struct erofs_inode { static inline bool is_inode_layout_compression(struct erofs_inode *inode) { - return erofs_inode_is_data_compressed(inode->data_mapping_mode); + return erofs_inode_is_data_compressed(inode->datalayout); } #define IS_ROOT(x) ((x) == (x)->i_parent) diff --git a/include/erofs_fs.h b/include/erofs_fs.h index 601b477..f29aa25 100644 --- a/include/erofs_fs.h +++ b/include/erofs_fs.h @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: GPL-2.0-only OR Apache-2.0 */ /* * erofs_utils/include/erofs_fs.h + * EROFS (Enhanced ROM File System) on-disk format definition * * Copyright (C) 2017-2018 HUAWEI, Inc. * http://www.huawei.com/ @@ -9,41 +10,41 @@ #ifndef __EROFS_FS_H #define __EROFS_FS_H -/* Enhanced(Extended) ROM File System */ #define EROFS_SUPER_MAGIC_V1 0xE0F5E1E2 #define EROFS_SUPER_OFFSET 1024 /* - * Any bits that aren't in EROFS_ALL_REQUIREMENTS should be - * incompatible with this kernel version. + * Any bits that aren't in EROFS_ALL_FEATURE_INCOMPAT should + * be incompatible with this kernel version. */ -#define EROFS_REQUIREMENT_LZ4_0PADDING 0x00000001 -#define EROFS_ALL_REQUIREMENTS EROFS_REQUIREMENT_LZ4_0PADDING +#define EROFS_FEATURE_INCOMPAT_LZ4_0PADDING 0x00000001 +#define EROFS_ALL_FEATURE_INCOMPAT EROFS_FEATURE_INCOMPAT_LZ4_0PADDING +/* 128-byte erofs on-disk super block */ struct erofs_super_block { -/* 0 */__le32 magic; /* in the little endian */ -/* 4 */__le32 checksum; /* crc32c(super_block) */ -/* 8 */__le32 features; /* (aka. feature_compat) */ -/* 12 */__u8 blkszbits; /* support block_size == PAGE_SIZE only */ -/* 13 */__u8 reserved; - -/* 14 */__le16 root_nid; -/* 16 */__le64 inos; /* total valid ino # (== f_files - f_favail) */ - -/* 24 */__le64 build_time; /* inode v1 time derivation */ -/* 32 */__le32 build_time_nsec; -/* 36 */__le32 blocks; /* used for statfs */ -/* 40 */__le32 meta_blkaddr; -/* 44 */__le32 xattr_blkaddr; -/* 48 */__u8 uuid[16]; /* 128-bit uuid for volume */ -/* 64 */__u8 volume_name[16]; /* volume name */ -/* 80 */__le32 requirements; /* (aka. feature_incompat) */ - -/* 84 */__u8 reserved2[44]; -} __packed; /* 128 bytes */ + __le32 magic; /* file system magic number */ + __le32 checksum; /* crc32c(super_block) */ + __le32 feature_compat; + __u8 blkszbits; /* support block_size == PAGE_SIZE only */ + __u8 reserved; + + __le16 root_nid; /* nid of root directory */ + __le64 inos; /* total valid ino # (== f_files - f_favail) */ + + __le64 build_time; /* inode v1 time derivation */ + __le32 build_time_nsec; /* inode v1 time derivation in nano scale */ + __le32 blocks; /* used for statfs */ + __le32 meta_blkaddr; /* start block address of metadata area */ + __le32 xattr_blkaddr; /* start block address of shared xattr area */ + __u8 uuid[16]; /* 128-bit uuid for volume */ + __u8 volume_name[16]; /* volume name */ + __le32 feature_incompat; + + __u8 reserved2[44]; +}; /* - * erofs inode data mapping: + * erofs inode datalayout (i_format in on-disk inode): * 0 - inode plain without inline data A: * inode, [xattrs], ... | ... | no-holed data * 1 - inode VLE compression B (legacy): @@ -55,82 +56,83 @@ struct erofs_super_block { * 4~7 - reserved */ enum { - EROFS_INODE_FLAT_PLAIN, - EROFS_INODE_FLAT_COMPRESSION_LEGACY, - EROFS_INODE_FLAT_INLINE, - EROFS_INODE_FLAT_COMPRESSION, - EROFS_INODE_LAYOUT_MAX + EROFS_INODE_FLAT_PLAIN = 0, + EROFS_INODE_FLAT_COMPRESSION_LEGACY = 1, + EROFS_INODE_FLAT_INLINE = 2, + EROFS_INODE_FLAT_COMPRESSION = 3, + EROFS_INODE_DATALAYOUT_MAX }; static inline bool erofs_inode_is_data_compressed(unsigned int datamode) { - if (datamode == EROFS_INODE_FLAT_COMPRESSION) - return true; - return datamode == EROFS_INODE_FLAT_COMPRESSION_LEGACY; + return datamode == EROFS_INODE_FLAT_COMPRESSION || + datamode == EROFS_INODE_FLAT_COMPRESSION_LEGACY; } /* bit definitions of inode i_advise */ #define EROFS_I_VERSION_BITS 1 -#define EROFS_I_DATA_MAPPING_BITS 3 +#define EROFS_I_DATALAYOUT_BITS 3 #define EROFS_I_VERSION_BIT 0 -#define EROFS_I_DATA_MAPPING_BIT 1 +#define EROFS_I_DATALAYOUT_BIT 1 -struct erofs_inode_v1 { -/* 0 */__le16 i_advise; +/* 32-byte reduced form of an ondisk inode */ +struct erofs_inode_compact { + __le16 i_format; /* inode format hints */ /* 1 header + n-1 * 4 bytes inline xattr to keep continuity */ -/* 2 */__le16 i_xattr_icount; -/* 4 */__le16 i_mode; -/* 6 */__le16 i_nlink; -/* 8 */__le32 i_size; -/* 12 */__le32 i_reserved; -/* 16 */union { + __le16 i_xattr_icount; + __le16 i_mode; + __le16 i_nlink; + __le32 i_size; + __le32 i_reserved; + union { /* file total compressed blocks for data mapping 1 */ __le32 compressed_blocks; __le32 raw_blkaddr; /* for device files, used to indicate old/new device # */ __le32 rdev; - } i_u __packed; -/* 20 */__le32 i_ino; /* only used for 32-bit stat compatibility */ -/* 24 */__le16 i_uid; -/* 26 */__le16 i_gid; -/* 28 */__le32 i_reserved2; -} __packed; + } i_u; + __le32 i_ino; /* only used for 32-bit stat compatibility */ + __le16 i_uid; + __le16 i_gid; + __le32 i_reserved2; +}; /* 32 bytes on-disk inode */ -#define EROFS_INODE_LAYOUT_V1 0 +#define EROFS_INODE_LAYOUT_COMPACT 0 /* 64 bytes on-disk inode */ -#define EROFS_INODE_LAYOUT_V2 1 +#define EROFS_INODE_LAYOUT_EXTENDED 1 -struct erofs_inode_v2 { -/* 0 */__le16 i_advise; +/* 64-byte complete form of an ondisk inode */ +struct erofs_inode_extended { + __le16 i_format; /* inode format hints */ /* 1 header + n-1 * 4 bytes inline xattr to keep continuity */ -/* 2 */__le16 i_xattr_icount; -/* 4 */__le16 i_mode; -/* 6 */__le16 i_reserved; -/* 8 */__le64 i_size; -/* 16 */union { + __le16 i_xattr_icount; + __le16 i_mode; + __le16 i_reserved; + __le64 i_size; + union { /* file total compressed blocks for data mapping 1 */ __le32 compressed_blocks; __le32 raw_blkaddr; /* for device files, used to indicate old/new device # */ __le32 rdev; - } i_u __packed; + } i_u; /* only used for 32-bit stat compatibility */ -/* 20 */__le32 i_ino; - -/* 24 */__le32 i_uid; -/* 28 */__le32 i_gid; -/* 32 */__le64 i_ctime; -/* 40 */__le32 i_ctime_nsec; -/* 44 */__le32 i_nlink; -/* 48 */__u8 i_reserved2[16]; -} __packed; /* 64 bytes */ + __le32 i_ino; + + __le32 i_uid; + __le32 i_gid; + __le64 i_ctime; + __le32 i_ctime_nsec; + __le32 i_nlink; + __u8 i_reserved2[16]; +}; #define EROFS_MAX_SHARED_XATTRS (128) /* h_shared_count between 129 ... 255 are special # */ @@ -152,7 +154,7 @@ struct erofs_xattr_ibody_header { __u8 h_shared_count; __u8 h_reserved2[7]; __le32 h_shared_xattrs[0]; /* shared xattr id array */ -} __packed; +}; /* Name indexes */ #define EROFS_XATTR_INDEX_USER 1 @@ -169,22 +171,28 @@ struct erofs_xattr_entry { __le16 e_value_size; /* size of attribute value */ /* followed by e_name and e_value */ char e_name[0]; /* attribute name */ -} __packed; +}; -#define ondisk_xattr_ibody_size(count) ({\ - u32 __count = le16_to_cpu(count); \ - ((__count) == 0) ? 0 : \ - sizeof(struct erofs_xattr_ibody_header) + \ - sizeof(__u32) * ((__count) - 1); }) +static inline unsigned int erofs_xattr_ibody_size(__le16 i_xattr_icount) +{ + if (!i_xattr_icount) + return 0; + + return sizeof(struct erofs_xattr_ibody_header) + + sizeof(__u32) * (le16_to_cpu(i_xattr_icount) - 1); +} #define EROFS_XATTR_ALIGN(size) round_up(size, sizeof(struct erofs_xattr_entry)) -#define EROFS_XATTR_ENTRY_SIZE(entry) EROFS_XATTR_ALIGN( \ - sizeof(struct erofs_xattr_entry) + \ - (entry)->e_name_len + le16_to_cpu((entry)->e_value_size)) -/* available compression algorithm types */ +static inline unsigned int erofs_xattr_entry_size(struct erofs_xattr_entry *e) +{ + return EROFS_XATTR_ALIGN(sizeof(struct erofs_xattr_entry) + + e->e_name_len + le16_to_cpu(e->e_value_size)); +} + +/* available compression algorithm types (for h_algorithmtype) */ enum { - Z_EROFS_COMPRESSION_LZ4, + Z_EROFS_COMPRESSION_LZ4 = 0, Z_EROFS_COMPRESSION_MAX }; @@ -212,12 +220,12 @@ struct z_erofs_map_header { * bit 5-7 : (physical - logical) cluster bits of head 2. */ __u8 h_clusterbits; -} __packed; +}; #define Z_EROFS_VLE_LEGACY_HEADER_PADDING 8 /* - * Z_EROFS Variable-sized Logical Extent cluster type: + * Fixed-sized output compression ondisk Logical Extent cluster type: * 0 - literal (uncompressed) cluster * 1 - compressed cluster (for the head logical cluster) * 2 - compressed cluster (for the other logical clusters) @@ -242,10 +250,10 @@ struct z_erofs_map_header { * (di_advise could be 0, 1 or 2) */ enum { - Z_EROFS_VLE_CLUSTER_TYPE_PLAIN, - Z_EROFS_VLE_CLUSTER_TYPE_HEAD, - Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD, - Z_EROFS_VLE_CLUSTER_TYPE_RESERVED, + Z_EROFS_VLE_CLUSTER_TYPE_PLAIN = 0, + Z_EROFS_VLE_CLUSTER_TYPE_HEAD = 1, + Z_EROFS_VLE_CLUSTER_TYPE_NONHEAD = 2, + Z_EROFS_VLE_CLUSTER_TYPE_RESERVED = 3, Z_EROFS_VLE_CLUSTER_TYPE_MAX }; @@ -267,18 +275,18 @@ struct z_erofs_vle_decompressed_index { * [1] - pointing to the tail cluster */ __le16 delta[2]; - } di_u __packed; /* 8 bytes */ -} __packed; + } di_u; +}; #define Z_EROFS_VLE_EXTENT_ALIGN(size) round_up(size, \ sizeof(struct z_erofs_vle_decompressed_index)) /* dirent sorts in alphabet order, thus we can do binary search */ struct erofs_dirent { - __le64 nid; /* 0, node number */ - __le16 nameoff; /* 8, start offset of file name */ - __u8 file_type; /* 10, file type */ - __u8 reserved; /* 11, reserved */ + __le64 nid; /* node number */ + __le16 nameoff; /* start offset of file name */ + __u8 file_type; /* file type */ + __u8 reserved; /* reserved */ } __packed; /* file types used in inode_info->flags */ @@ -300,8 +308,8 @@ enum { static inline void erofs_check_ondisk_layout_definitions(void) { BUILD_BUG_ON(sizeof(struct erofs_super_block) != 128); - BUILD_BUG_ON(sizeof(struct erofs_inode_v1) != 32); - BUILD_BUG_ON(sizeof(struct erofs_inode_v2) != 64); + BUILD_BUG_ON(sizeof(struct erofs_inode_compact) != 32); + BUILD_BUG_ON(sizeof(struct erofs_inode_extended) != 64); BUILD_BUG_ON(sizeof(struct erofs_xattr_ibody_header) != 12); BUILD_BUG_ON(sizeof(struct erofs_xattr_entry) != 4); BUILD_BUG_ON(sizeof(struct z_erofs_map_header) != 8); diff --git a/lib/compress.c b/lib/compress.c index 1919609..7935fce 100644 --- a/lib/compress.c +++ b/lib/compress.c @@ -120,7 +120,7 @@ static int write_uncompressed_block(struct z_erofs_vle_compress_ctx *ctx, int ret; unsigned int count; - if (!(sbi.requirements & EROFS_REQUIREMENT_LZ4_0PADDING)) { + if (!(sbi.feature_incompat & EROFS_FEATURE_INCOMPAT_LZ4_0PADDING)) { /* fix up clusterofs to 0 if possable */ if (ctx->head >= ctx->clusterofs) { ctx->head -= ctx->clusterofs; @@ -184,7 +184,8 @@ nocompression: erofs_dbg("Writing %u compressed data to block %u", count, ctx->blkaddr); - if (sbi.requirements & EROFS_REQUIREMENT_LZ4_0PADDING) + if (sbi.feature_incompat & + EROFS_FEATURE_INCOMPAT_LZ4_0PADDING) ret = blk_write(dst - (EROFS_BLKSIZ - ret), ctx->blkaddr, 1); else @@ -382,7 +383,7 @@ int z_erofs_convert_to_compacted_format(struct erofs_inode *inode, 4, logical_clusterbits, true); } inode->extent_isize = out - (u8 *)inode->compressmeta; - inode->data_mapping_mode = EROFS_INODE_FLAT_COMPRESSION; + inode->datalayout = EROFS_INODE_FLAT_COMPRESSION; return 0; } @@ -473,7 +474,7 @@ int erofs_write_compressed_file(struct erofs_inode *inode) legacymetasize = ctx.metacur - compressmeta; if (cfg.c_legacy_compress) { inode->extent_isize = legacymetasize; - inode->data_mapping_mode = EROFS_INODE_FLAT_COMPRESSION_LEGACY; + inode->datalayout = EROFS_INODE_FLAT_COMPRESSION_LEGACY; } else { ret = z_erofs_convert_to_compacted_format(inode, blkaddr - 1, legacymetasize, 12); diff --git a/lib/config.c b/lib/config.c index 2e91b92..9c78142 100644 --- a/lib/config.c +++ b/lib/config.c @@ -21,7 +21,7 @@ void erofs_init_configure(void) cfg.c_dry_run = false; cfg.c_legacy_compress = false; cfg.c_compr_level_master = -1; - sbi.requirements = EROFS_REQUIREMENT_LZ4_0PADDING; + sbi.feature_incompat = EROFS_FEATURE_INCOMPAT_LZ4_0PADDING; } void erofs_show_config(void) diff --git a/lib/inode.c b/lib/inode.c index c8cf847..4e1e29f 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -179,7 +179,7 @@ int erofs_prepare_dir_file(struct erofs_inode *dir) dir->i_size = d_size; /* no compression for all dirs */ - dir->data_mapping_mode = EROFS_INODE_FLAT_INLINE; + dir->datalayout = EROFS_INODE_FLAT_INLINE; /* allocate dir main data */ ret = __allocate_inode_bh_data(dir, erofs_blknr(d_size)); @@ -274,7 +274,7 @@ int erofs_write_file_from_buffer(struct erofs_inode *inode, char *buf) const unsigned int nblocks = erofs_blknr(inode->i_size); int ret; - inode->data_mapping_mode = EROFS_INODE_FLAT_INLINE; + inode->datalayout = EROFS_INODE_FLAT_INLINE; ret = __allocate_inode_bh_data(inode, nblocks); if (ret) @@ -303,7 +303,7 @@ int erofs_write_file(struct erofs_inode *inode) int ret, fd; if (!inode->i_size) { - inode->data_mapping_mode = EROFS_INODE_FLAT_PLAIN; + inode->datalayout = EROFS_INODE_FLAT_PLAIN; return 0; } @@ -315,7 +315,7 @@ int erofs_write_file(struct erofs_inode *inode) } /* fallback to all data uncompressed */ - inode->data_mapping_mode = EROFS_INODE_FLAT_INLINE; + inode->datalayout = EROFS_INODE_FLAT_INLINE; nblocks = inode->i_size / EROFS_BLKSIZ; ret = __allocate_inode_bh_data(inode, nblocks); @@ -366,39 +366,39 @@ static bool erofs_bh_flush_write_inode(struct erofs_buffer_head *bh) struct erofs_inode *const inode = bh->fsprivate; erofs_off_t off = erofs_btell(bh, false); - /* let's support v1 currently */ - struct erofs_inode_v1 v1 = {0}; + /* let's support compact inode currently */ + struct erofs_inode_compact dic = {0}; int ret; - v1.i_advise = cpu_to_le16(0 | (inode->data_mapping_mode << 1)); - v1.i_mode = cpu_to_le16(inode->i_mode); - v1.i_nlink = cpu_to_le16(inode->i_nlink); - v1.i_size = cpu_to_le32((u32)inode->i_size); + dic.i_format = cpu_to_le16(0 | (inode->datalayout << 1)); + dic.i_mode = cpu_to_le16(inode->i_mode); + dic.i_nlink = cpu_to_le16(inode->i_nlink); + dic.i_size = cpu_to_le32((u32)inode->i_size); - v1.i_ino = cpu_to_le32(inode->i_ino[0]); + dic.i_ino = cpu_to_le32(inode->i_ino[0]); - v1.i_uid = cpu_to_le16((u16)inode->i_uid); - v1.i_gid = cpu_to_le16((u16)inode->i_gid); + dic.i_uid = cpu_to_le16((u16)inode->i_uid); + dic.i_gid = cpu_to_le16((u16)inode->i_gid); switch ((inode->i_mode) >> S_SHIFT) { case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: - v1.i_u.rdev = cpu_to_le32(inode->u.i_rdev); + dic.i_u.rdev = cpu_to_le32(inode->u.i_rdev); break; default: if (is_inode_layout_compression(inode)) - v1.i_u.compressed_blocks = + dic.i_u.compressed_blocks = cpu_to_le32(inode->u.i_blocks); else - v1.i_u.raw_blkaddr = + dic.i_u.raw_blkaddr = cpu_to_le32(inode->u.i_blkaddr); break; } - ret = dev_write(&v1, off, sizeof(struct erofs_inode_v1)); + ret = dev_write(&dic, off, sizeof(struct erofs_inode_compact)); if (ret) return false; off += inode->inode_isize; @@ -468,13 +468,13 @@ int erofs_prepare_inode_buffer(struct erofs_inode *inode) * should use EROFS_INODE_FLAT_PLAIN data mapping mode. */ if (!inode->idata_size) - inode->data_mapping_mode = EROFS_INODE_FLAT_PLAIN; + inode->datalayout = EROFS_INODE_FLAT_PLAIN; bh = erofs_balloc(INODE, inodesize, 0, inode->idata_size); if (bh == ERR_PTR(-ENOSPC)) { int ret; - inode->data_mapping_mode = EROFS_INODE_FLAT_PLAIN; + inode->datalayout = EROFS_INODE_FLAT_PLAIN; noinline: /* expend an extra block for tail-end data */ ret = erofs_prepare_tail_block(inode); @@ -487,7 +487,7 @@ noinline: } else if (IS_ERR(bh)) { return PTR_ERR(bh); } else if (inode->idata_size) { - inode->data_mapping_mode = EROFS_INODE_FLAT_INLINE; + inode->datalayout = EROFS_INODE_FLAT_INLINE; /* allocate inline buffer */ ibh = erofs_battach(bh, META, inode->idata_size); @@ -616,7 +616,7 @@ int erofs_fill_inode(struct erofs_inode *inode, inode->i_srcpath[sizeof(inode->i_srcpath) - 1] = '\0'; inode->i_ino[1] = st->st_ino; - inode->inode_isize = sizeof(struct erofs_inode_v1); + inode->inode_isize = sizeof(struct erofs_inode_compact); list_add(&inode->i_hash, &inode_hashtable[st->st_ino % NR_INODE_HASHTABLE]); diff --git a/mkfs/main.c b/mkfs/main.c index 2dfd68e..effc26b 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -69,7 +69,8 @@ static int parse_extended_opts(const char *opts) return -EINVAL; /* disable compacted indexes and 0padding */ cfg.c_legacy_compress = true; - sbi.requirements &= ~EROFS_REQUIREMENT_LZ4_0PADDING; + sbi.feature_incompat &= + ~EROFS_FEATURE_INCOMPAT_LZ4_0PADDING; } } return 0; @@ -155,7 +156,7 @@ int erofs_mkfs_update_super_block(struct erofs_buffer_head *bh, .blocks = 0, .meta_blkaddr = sbi.meta_blkaddr, .xattr_blkaddr = 0, - .requirements = cpu_to_le32(sbi.requirements), + .feature_incompat = cpu_to_le32(sbi.feature_incompat), }; const unsigned int sb_blksize = round_up(EROFS_SUPER_END, EROFS_BLKSIZ); |