diff --git a/.gitignore b/.gitignore index cd0195d..e7f29fe 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /erofs-utils-1.7.1.tar.gz /erofs-utils-1.8.2.tar.gz +/erofs-utils-1.8.4.tar.gz diff --git a/erofs-utils-1.8.2-fix-all-fragments.patch b/erofs-utils-1.8.2-fix-all-fragments.patch deleted file mode 100644 index 2d71eed..0000000 --- a/erofs-utils-1.8.2-fix-all-fragments.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 882ad1c3157f7544bd4d004e3b6d744f0cbe3ffc Mon Sep 17 00:00:00 2001 -From: Gao Xiang -Date: Sat, 12 Oct 2024 11:52:13 +0800 -Subject: erofs-utils: mkfs: fix `-Eall-fragments` for multi-threaded - compression - -If `-Eall-fragments` is specified when multi-threaded compression is -enabled, it should only apply to the packed inode instead of other -real inodes for now. - -Fixes: 10c1590c0920 ("erofs-utils: enable multi-threaded support for `-Eall-fragments`") -Signed-off-by: Gao Xiang -Link: https://lore.kernel.org/r/20241012035213.3729725-1-hsiangkao@linux.alibaba.com ---- - lib/compress.c | 13 +++++++------ - 1 file changed, 7 insertions(+), 6 deletions(-) - -diff --git a/lib/compress.c b/lib/compress.c -index 5d6fb2a..cbd4620 100644 ---- a/lib/compress.c -+++ b/lib/compress.c -@@ -1456,12 +1456,8 @@ void *erofs_begin_compressed_file(struct erofs_inode *inode, int fd, u64 fpos) - inode->idata_size = 0; - inode->fragment_size = 0; - -- if (z_erofs_mt_enabled) { -- ictx = malloc(sizeof(*ictx)); -- if (!ictx) -- return ERR_PTR(-ENOMEM); -- ictx->fd = dup(fd); -- } else { -+ if (!z_erofs_mt_enabled || -+ (cfg.c_all_fragments && !erofs_is_packed_inode(inode))) { - #ifdef EROFS_MT_ENABLED - pthread_mutex_lock(&g_ictx.mutex); - if (g_ictx.seg_num) -@@ -1471,6 +1467,11 @@ void *erofs_begin_compressed_file(struct erofs_inode *inode, int fd, u64 fpos) - #endif - ictx = &g_ictx; - ictx->fd = fd; -+ } else { -+ ictx = malloc(sizeof(*ictx)); -+ if (!ictx) -+ return ERR_PTR(-ENOMEM); -+ ictx->fd = dup(fd); - } - - ictx->ccfg = &erofs_ccfg[inode->z_algorithmtype[0]]; --- -cgit 1.2.3-korg - diff --git a/erofs-utils-1.8.4-fragdedupe-inode-support.patch b/erofs-utils-1.8.4-fragdedupe-inode-support.patch new file mode 100644 index 0000000..216b61a --- /dev/null +++ b/erofs-utils-1.8.4-fragdedupe-inode-support.patch @@ -0,0 +1,102 @@ +From 06875b3f2182eab24b81083dfde542f778b201cc Mon Sep 17 00:00:00 2001 +From: Gao Xiang +Date: Fri, 3 Jan 2025 10:40:11 +0800 +Subject: erofs-utils: mkfs: support `-Efragdedupe=inode` + +If the entire inode can be deduplicated against an existing fragment, +simply reuse it. + +Multi-threading can still be applied for `-Efragdedupe=inode` with +the current codebase: + +Fedora Linux 39 (Workstation Edition) LiveCD results: + -zlzma,level=6,dictsize=131072 -C65536 -Eall-fragments + + `-E^fragdedupe` 2,003,587,072 bytes (1911 MiB) + `-Efragdedupe=inode` 1,970,577,408 bytes (1880 MiB) + +Signed-off-by: Gao Xiang +Link: https://lore.kernel.org/r/20250103024011.198163-1-hsiangkao@linux.alibaba.com +--- + include/erofs/config.h | 8 +++++++- + lib/compress.c | 9 +++++++-- + mkfs/main.c | 13 ++++++++++--- + 3 files changed, 24 insertions(+), 6 deletions(-) + +diff --git a/include/erofs/config.h b/include/erofs/config.h +index 47e4d00..92c1467 100644 +--- a/include/erofs/config.h ++++ b/include/erofs/config.h +@@ -33,6 +33,12 @@ enum { + TIMESTAMP_CLAMPING, + }; + ++enum { ++ FRAGDEDUPE_FULL, ++ FRAGDEDUPE_INODE, ++ FRAGDEDUPE_OFF, ++}; ++ + #define EROFS_MAX_COMPR_CFGS 64 + + struct erofs_compr_opts { +@@ -53,7 +59,7 @@ struct erofs_configure { + bool c_fragments; + bool c_all_fragments; + bool c_dedupe; +- bool c_nofragdedupe; ++ char c_fragdedupe; + bool c_ignore_mtime; + bool c_showprogress; + bool c_extra_ea_name_prefixes; +diff --git a/lib/compress.c b/lib/compress.c +index 0e8faad..20ab208 100644 +--- a/lib/compress.c ++++ b/lib/compress.c +@@ -1527,12 +1527,17 @@ void *erofs_begin_compressed_file(struct erofs_inode *inode, int fd, u64 fpos) + * parts into the packed inode. + */ + if (cfg.c_fragments && !erofs_is_packed_inode(inode) && +- !cfg.c_nofragdedupe) { ++ cfg.c_fragdedupe != FRAGDEDUPE_OFF) { + ret = z_erofs_fragments_dedupe(inode, fd, &ictx->tof_chksum); + if (ret < 0) + goto err_free_ictx; +- } + ++ if (cfg.c_fragdedupe == FRAGDEDUPE_INODE && ++ inode->fragment_size < inode->i_size) { ++ erofs_dbg("Discard the sub-inode tail fragment @ nid %llu", inode->nid); ++ inode->fragment_size = 0; ++ } ++ } + ictx->inode = inode; + ictx->fpos = fpos; + init_list_head(&ictx->extents); +diff --git a/mkfs/main.c b/mkfs/main.c +index 3f74fa2..0f6a32b 100644 +--- a/mkfs/main.c ++++ b/mkfs/main.c +@@ -306,9 +306,16 @@ static int erofs_mkfs_feat_set_dedupe(bool en, const char *val, + static int erofs_mkfs_feat_set_fragdedupe(bool en, const char *val, + unsigned int vallen) + { +- if (vallen) +- return -EINVAL; +- cfg.c_nofragdedupe = !en; ++ if (!en) { ++ if (vallen) ++ return -EINVAL; ++ cfg.c_fragdedupe = FRAGDEDUPE_OFF; ++ } else if (vallen == sizeof("inode") - 1 && ++ !memcmp(val, "inode", vallen)) { ++ cfg.c_fragdedupe = FRAGDEDUPE_INODE; ++ } else { ++ cfg.c_fragdedupe = FRAGDEDUPE_FULL; ++ } + return 0; + } + +-- +cgit 1.2.3-korg + diff --git a/erofs-utils.spec b/erofs-utils.spec index 007bab9..3cc1eaa 100644 --- a/erofs-utils.spec +++ b/erofs-utils.spec @@ -5,11 +5,12 @@ %bcond qpl %[ 0%{?fedora} >= 41 && "%{_arch}" == "x86_64" ] %bcond selinux 1 %bcond uuid 1 +%bcond xxhash %[ 0%{?fedora} || (0%{?rhel} >= 9 && 0%{?rhel} < 10) ] %bcond zlib 1 %bcond zstd 1 Name: erofs-utils -Version: 1.8.2 +Version: 1.8.4 Release: 2%{?dist} Summary: Utilities for working with EROFS @@ -17,18 +18,19 @@ License: GPL-2.0-only AND GPL-2.0-or-later AND (GPL-2.0-only OR Apache-2. URL: https://erofs.docs.kernel.org/ Source: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git/snapshot/%{name}-%{version}.tar.gz -Patch: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git/patch/?id=882ad1c3157f7544bd4d004e3b6d744f0cbe3ffc#/%{name}-1.8.2-fix-all-fragments.patch +Patch: https://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs-utils.git/patch/?id=06875b3f2182eab24b81083dfde542f778b201cc#/%{name}-1.8.4-fragdedupe-inode-support.patch BuildRequires: %[ "%{toolchain}" == "clang" ? "clang compiler-rt" : "gcc" ] BuildRequires: libtool BuildRequires: make %{?with_deflate:BuildRequires: pkgconfig(libdeflate)} %{?with_fuse:BuildRequires: pkgconfig(fuse3) >= 3.2} -%{?with_lz4:BuildRequires: lz4-devel >= 1.9.3} +%{?with_lz4:BuildRequires: pkgconfig(liblz4) >= 1.9.3} %{?with_lzma:BuildRequires: pkgconfig(liblzma) >= 5.4} %{?with_qpl:BuildRequires: pkgconfig(qpl) >= 1.5.0} %{?with_selinux:BuildRequires: pkgconfig(libselinux)} %{?with_uuid:BuildRequires: pkgconfig(uuid)} +%{?with_xxhash:BuildRequires: pkgconfig(libxxhash)} %{?with_zlib:BuildRequires: pkgconfig(zlib)} %{?with_zstd:BuildRequires: pkgconfig(libzstd) >= 1.4.0} @@ -55,9 +57,9 @@ This package includes erofsfuse to mount EROFS images. %prep %autosetup -p1 -autoreconf -fi %build +autoreconf -fi %configure \ --enable-multithreading \ --%{?with_deflate:with}%{!?with_deflate:without}-libdeflate \ @@ -67,6 +69,7 @@ autoreconf -fi --%{?with_qpl:with}%{!?with_qpl:without}-qpl \ --%{?with_selinux:with}%{!?with_selinux:without}-selinux \ --%{?with_uuid:with}%{!?with_uuid:without}-uuid \ + --%{?with_xxhash:with}%{!?with_xxhash:without}-xxhash \ --%{?with_zlib:with}%{!?with_zlib:without}-zlib \ --%{?with_zstd:with}%{!?with_zstd:without}-libzstd %make_build @@ -95,8 +98,12 @@ autoreconf -fi %changelog -* Wed Nov 20 2024 Abhi Das - 1.8.2-2 -- Rebase to 1.8.2-2 for zstd and multithreading support and +* Thu Jan 02 2025 Neal Gompa - 1.8.4-2 +- Rebase to 1.8.4-2 for performance and compression fixes + Resolves: RHEL-72588 + +* Wed Nov 20 2024 Abhi Das - 1.8.2-2 +- Rebase to 1.8.2-2 for zstd and multithreading support and Remove erroneously added gating.yaml Resolves: RHEL-68370 diff --git a/sources b/sources index 4a8115d..0428664 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (erofs-utils-1.8.2.tar.gz) = 474ea30662e498e6ece5d4e5171c333ec040eaffa4f5670d1b728b1461a2a18fa90ea6cc2ad7b26e87732d735985e9108a9c49a7072b4dc4fdfee7916df48593 +SHA512 (erofs-utils-1.8.4.tar.gz) = c941b0a2ab6c650a9aa4c9cadeb277ebc87007dc51354ff013c7cb763e6e8c9d44ed9e4791730ed05088faaba8c612198b924e70f5e52019382cfdf6d2e6b677