diff options
author | Gao Xiang <hsiangkao@linux.alibaba.com> | 2022-10-17 11:17:36 +0800 |
---|---|---|
committer | Gao Xiang <hsiangkao@linux.alibaba.com> | 2022-10-19 00:25:39 +0800 |
commit | 148c12a79f3b39eefc3878aaac57f4ea69af8ee3 (patch) | |
tree | 3de43115cb57414a8c59349a30c63f33c3a41f91 | |
parent | 9410884c64544d0dd189e8840bdb035ffeb46a98 (diff) | |
download | erofs-utils-148c12a79f3b39eefc3878aaac57f4ea69af8ee3.tar.gz |
erofs-utils: use chunk-based data deduplication if compression is off
After this patch, "-E dedupe" can now support chunk-based data
deduplication with block-sized chunks if compression is off.
Link: https://lore.kernel.org/r/20221017031736.90542-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
-rw-r--r-- | mkfs/main.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/mkfs/main.c b/mkfs/main.c index 00a2deb..77d635c 100644 --- a/mkfs/main.c +++ b/mkfs/main.c @@ -663,12 +663,6 @@ int main(int argc, char **argv) return 1; } - if (cfg.c_chunkbits) { - err = erofs_blob_init(cfg.c_blobdev_path); - if (err) - return 1; - } - err = lstat64(cfg.c_src_path, &st); if (err) return 1; @@ -747,15 +741,6 @@ int main(int argc, char **argv) goto exit; } - if (cfg.c_dedupe) { - err = z_erofs_dedupe_init(EROFS_BLKSIZ); - if (err) { - erofs_err("failed to initialize deduplication: %s", - erofs_strerror(err)); - goto exit; - } - } - err = z_erofs_compress_init(sb_bh); if (err) { erofs_err("failed to initialize compressor: %s", @@ -763,6 +748,26 @@ int main(int argc, char **argv) goto exit; } + if (cfg.c_dedupe) { + if (!cfg.c_compr_alg_master) { + erofs_err("Compression is not enabled. Turn on chunk-based data deduplication instead."); + cfg.c_chunkbits = LOG_BLOCK_SIZE; + } else { + err = z_erofs_dedupe_init(EROFS_BLKSIZ); + if (err) { + erofs_err("failed to initialize deduplication: %s", + erofs_strerror(err)); + goto exit; + } + } + } + + if (cfg.c_chunkbits) { + err = erofs_blob_init(cfg.c_blobdev_path); + if (err) + return 1; + } + err = erofs_generate_devtable(); if (err) { erofs_err("failed to generate device table: %s", |