From: Gao Xiang <[email protected]> Use 4-byte block map format by default unless a blob device is given or chunk index format is forcely specified.
Signed-off-by: Gao Xiang <[email protected]> --- include/erofs/config.h | 8 +++++++- lib/blobchunk.c | 12 +++++++----- lib/inode.c | 5 ++++- man/mkfs.erofs.1 | 6 ++++++ mkfs/main.c | 20 ++++++++++++++++++++ 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/include/erofs/config.h b/include/erofs/config.h index 8d459c692dac..2040dc6ff154 100644 --- a/include/erofs/config.h +++ b/include/erofs/config.h @@ -27,6 +27,11 @@ enum { FORCE_INODE_EXTENDED, }; +enum { + FORCE_INODE_BLOCK_MAP = 1, + FORCE_INODE_CHUNK_INDEXES, +}; + enum { TIMESTAMP_NONE, TIMESTAMP_FIXED, @@ -55,7 +60,8 @@ struct erofs_configure { char *c_compress_hints_file; char *c_compr_alg_master; int c_compr_level_master; - int c_force_inodeversion; + char c_force_inodeversion; + char c_force_chunkformat; /* < 0, xattr disabled and INT_MAX, always use inline xattrs */ int c_inline_xattr_tolerance; diff --git a/lib/blobchunk.c b/lib/blobchunk.c index a10ca8cc8750..5cbb8315b277 100644 --- a/lib/blobchunk.c +++ b/lib/blobchunk.c @@ -110,16 +110,18 @@ int erofs_blob_write_chunk_indexes(struct erofs_inode *inode, bool first_extent = true; erofs_blk_t base_blkaddr = 0; + if (multidev) { + idx.device_id = 1; + inode->u.chunkformat |= EROFS_CHUNK_FORMAT_INDEXES; + } else { + base_blkaddr = remapped_base; + } + if (inode->u.chunkformat & EROFS_CHUNK_FORMAT_INDEXES) unit = sizeof(struct erofs_inode_chunk_index); else unit = EROFS_BLOCK_MAP_ENTRY_SIZE; - if (multidev) - idx.device_id = 1; - else - base_blkaddr = remapped_base; - for (dst = src = 0; dst < inode->extent_isize; src += sizeof(void *), dst += unit) { struct erofs_blobchunk *chunk; diff --git a/lib/inode.c b/lib/inode.c index 855a0383f31e..5cbfc780e45f 100644 --- a/lib/inode.c +++ b/lib/inode.c @@ -390,7 +390,10 @@ int erofs_write_file(struct erofs_inode *inode) if (cfg.c_chunkbits) { inode->u.chunkbits = cfg.c_chunkbits; - inode->u.chunkformat = EROFS_CHUNK_FORMAT_INDEXES; + /* chunk indexes when explicitly specified */ + inode->u.chunkformat = 0; + if (cfg.c_force_chunkformat == FORCE_INODE_CHUNK_INDEXES) + inode->u.chunkformat = EROFS_CHUNK_FORMAT_INDEXES; return erofs_blob_write_chunked_file(inode); } diff --git a/man/mkfs.erofs.1 b/man/mkfs.erofs.1 index 71a26d88121a..f2e7d690c215 100644 --- a/man/mkfs.erofs.1 +++ b/man/mkfs.erofs.1 @@ -51,6 +51,12 @@ Forcely generate compact inodes (32-byte inodes) to output. .TP .BI force-inode-extended Forcely generate extended inodes (64-byte inodes) to output. +.TP +.BI force-inode-blockmap +Forcely generate inode chunk format in 4-byte block address array. +.TP +.BI force-chunk-indexes +Forcely generate inode chunk format in 8-byte chunk indexes (with device id). .RE .TP .BI "\-T " # diff --git a/mkfs/main.c b/mkfs/main.c index 29042c801794..58a64411b868 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -174,6 +174,18 @@ static int parse_extended_opts(const char *opts) return -EINVAL; cfg.c_noinline_data = true; } + + if (MATCH_EXTENTED_OPT("force-inode-blockmap", token, keylen)) { + if (vallen) + return -EINVAL; + cfg.c_force_chunkformat = FORCE_INODE_BLOCK_MAP; + } + + if (MATCH_EXTENTED_OPT("force-chunk-indexes", token, keylen)) { + if (vallen) + return -EINVAL; + cfg.c_force_chunkformat = FORCE_INODE_CHUNK_INDEXES; + } } return 0; } @@ -369,6 +381,14 @@ static int mkfs_parse_options_cfg(int argc, char *argv[]) erofs_err("--blobdev must be used together with --chunksize"); return -EINVAL; } + + /* TODO: can be implemented with (deviceslot) mapped_blkaddr */ + if (cfg.c_blobdev_path && + cfg.c_force_chunkformat == FORCE_INODE_BLOCK_MAP) { + erofs_err("--blobdev cannot work with block map currently"); + return -EINVAL; + } + cfg.c_img_path = strdup(argv[optind++]); if (!cfg.c_img_path) return -ENOMEM; -- 2.20.1
