platform/upstream/erofs-utils.git
3 months agoerofs-utils: avoid overly large temporary buffers for compressed data
Gao Xiang [Fri, 14 Feb 2025 16:36:21 +0000 (00:36 +0800)]
erofs-utils: avoid overly large temporary buffers for compressed data

... and use `EROFS_MAX_BLOCK_SIZE * 2` to avoid potential issues
with buggy compressors.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250214163621.4109215-2-hsiangkao@linux.alibaba.com
3 months agoerofs-utils: mkfs: add per-segment reaper for multi-threaded compression
Gao Xiang [Fri, 14 Feb 2025 16:36:20 +0000 (00:36 +0800)]
erofs-utils: mkfs: add per-segment reaper for multi-threaded compression

Replace the old per-inode reaper to avoid unnecessary memory overhead.
It also speeds up the multithreaded compression a bit.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250214163621.4109215-1-hsiangkao@linux.alibaba.com
3 months agoerofs-utils: lib: get rid of tmpfile()
Gao Xiang [Fri, 14 Feb 2025 06:24:06 +0000 (14:24 +0800)]
erofs-utils: lib: get rid of tmpfile()

Currently, `tmpfile()` is problematic:

 - It uses `FILE *` instead of `fd`;
 - It may not leverage `$TMPDIR`, see `__gen_tempfd()`:
   https://sourceware.org/git?p=glibc.git;a=blob;f=stdio-common/tmpfile.c;hb=glibc-2.41

Switch to `erofs_tmpfile()` throughout the codebase.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250214062407.3281416-2-hsiangkao@linux.alibaba.com
3 months agoerofs-utils: mkfs: add missing `errno = 0` before strto[u]l
Gao Xiang [Fri, 14 Feb 2025 06:24:05 +0000 (14:24 +0800)]
erofs-utils: mkfs: add missing `errno = 0` before strto[u]l

strtoull(3) says:

```
Since strtoul() can legitimately return 0 or ULONG_MAX (ULLONG_MAX for
strtoull()) on both success and failure, the calling program should set
errno to 0 before the call, and then determine if an error occurred by
checking whether errno has a nonzero value after the call.
```

Otherwise, `--workers=` could exit with `invalid worker number`.

Fixes: 7894301e1a80 ("erofs-utils: mkfs: add `--workers=#` parameter")
Fixes: 0132cb5ea7d0 ("erofs-utils: mkfs: add `--zfeature-bits` option")
Fixes: 7550a30c332c ("erofs-utils: enable incremental builds")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250214062407.3281416-1-hsiangkao@linux.alibaba.com
3 months agoerofs-utils: mkfs: reduce default dict size for LZMA
Gao Xiang [Wed, 12 Feb 2025 19:15:45 +0000 (03:15 +0800)]
erofs-utils: mkfs: reduce default dict size for LZMA

Change the default dictionary size to 4 times the pcluster size.
This will halve the LZMA internal dictionary size to a maximum of
4MiB per LZMA worker (one worker per CPU in the kernel implementation
unless the module parameter `lzma_streams=` is given.)

It has a very slight impact on the final image sizes, yet users can
always use `-zlzma,dictsize=` to specify a custom value.

  _________________________________________________________________________
 |______ Testset _____|_______ Vanilla _________|_________ After __________| Command Line
 |  CoreOS            |   741978112 (708 MiB)   |   742293504 (708 MiB)    | -zlzma,6 -Eall-fragments,fragdedupe=inode -C8192
 |                    |   687501312 (656 MiB)   |   687652864 (656 MiB)    | -zlzma,6 -Eall-fragments,fragdedupe=inode -C131072
 |____________________|__ 658485248 (628 MiB) __|__ 658698240 (629 MiB)  __| -zlzma,6 -Eall-fragments,fragdedupe=inode -C1048576
 |  Fedora KIWI       |  2974957568 (2838 MiB)  |  2977394688 (2840 MiB)   | -zlzma,6 -Eall-fragments,fragdedupe=inode -C8192
 |                    |  2684272640 (2560 MiB)  |  2686750720 (2563 MiB)   | -zlzma,6 -Eall-fragments,fragdedupe=inode -C131072
 |____________________|_ 2550800384 (2433 MiB) _|_ 2553278464 (2435 MiB) __| -zlzma,6 -Eall-fragments,fragdedupe=inode -C1048576
 |  AOSP system       |   432562176 (413 MiB)   |   432738304 (413 MiB)    | -zlzma,6 -Eall-fragments,fragdedupe=inode -C8192
 |  partition         |   393277440 (376 MiB)   |   393351168 (376 MiB)    | -zlzma,6 -Eall-fragments,fragdedupe=inode -C131072
 |____________________|__ 379260928 (362 MiB) __|__ 379285504 (362 MiB)  __| -zlzma,6 -Eall-fragments,fragdedupe=inode -C1048576

Link: https://lore.kernel.org/r/20250212191545.580768-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
3 months agoerofs-utils: mkfs: fragment: gracefully exit if temporary storage is low
Gao Xiang [Wed, 12 Feb 2025 12:36:33 +0000 (20:36 +0800)]
erofs-utils: mkfs: fragment: gracefully exit if temporary storage is low

Currently, EROFS keeps all fragments into a temporary file for later
packed inode compression.  However, this could trigger an unexpected
segfault if temporary storage runs low.

Print a proper error message and gracefully exit.

Closes: https://github.com/erofs/erofs-utils/issues/13
Link: https://lore.kernel.org/r/20250212123633.40004-1-hsiangkao@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
4 months agoerofs-utils: release 1.8.5
Gao Xiang [Sun, 9 Feb 2025 16:00:00 +0000 (00:00 +0800)]
erofs-utils: release 1.8.5

Signed-off-by: Gao Xiang <xiang@kernel.org>
4 months agoerofs-utils: lib: restrict pcluster size limitations
Gao Xiang [Sun, 9 Feb 2025 14:38:08 +0000 (22:38 +0800)]
erofs-utils: lib: restrict pcluster size limitations

Source kernel commit: 7c3ca1838a7831855cbf2e6927a10e0e4723edf6

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250209143808.2984785-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: tar: keep non-existent directories with their parents
Gao Xiang [Sun, 9 Feb 2025 03:51:24 +0000 (11:51 +0800)]
erofs-utils: lib: tar: keep non-existent directories with their parents

To avoid lack of basic permissions for now.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250209035124.2168333-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: clean up z_erofs_extent_lookback
Gao Xiang [Thu, 6 Feb 2025 12:50:34 +0000 (20:50 +0800)]
erofs-utils: lib: clean up z_erofs_extent_lookback

Source kernel commit: ab474fccd04509db89fde8d3b28c39aa9a47db64

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-9-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: refine z_erofs_get_extent_compressedlen()
Gao Xiang [Thu, 6 Feb 2025 12:50:33 +0000 (20:50 +0800)]
erofs-utils: lib: refine z_erofs_get_extent_compressedlen()

Source kernel commit: 8f9530aeeb4f756bdfa70510b40e5d28ea3c742e

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-8-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: simplify z_erofs_load_compact_lcluster()
Gao Xiang [Thu, 6 Feb 2025 12:50:32 +0000 (20:50 +0800)]
erofs-utils: lib: simplify z_erofs_load_compact_lcluster()

Source kernel commit: 2a810ea79cd7a6d5f134ea69ca2ba726e600cbc4

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-7-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: handle NONHEAD !delta[1] lclusters gracefully
Gao Xiang [Thu, 6 Feb 2025 12:50:31 +0000 (20:50 +0800)]
erofs-utils: lib: handle NONHEAD !delta[1] lclusters gracefully

Source kernel commit: 0bc8061ffc733a0a246b8689b2d32a3e9204f43c

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-6-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: sync up zmap.c
Gao Xiang [Thu, 6 Feb 2025 12:50:30 +0000 (20:50 +0800)]
erofs-utils: lib: sync up zmap.c

commit 31da107fdb0a ("erofs: fold in z_erofs_reload_indexes()")
commit 53a7f9961cdd ("erofs: clean up unnecessary code and comments")
commit 9ff471800b74 ("erofs: get rid of a useless DBG_BUGON")
commit cc4efd3dd2ac ("erofs: stop parsing non-compact HEAD index if clusterofs is invalid")
commit 118a8cf504d7 ("erofs: fix inconsistent per-file compression format")
commit 9b32b063be10 ("erofs: ensure m_llen is reset to 0 if metadata is invalid")

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-5-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: introduce the secondary compression head
Gao Xiang [Thu, 6 Feb 2025 12:50:29 +0000 (20:50 +0800)]
erofs-utils: lib: introduce the secondary compression head

Source kernel commit: 72bb52620fdffca95a14ee52188a33cd84e574e2

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-4-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: get rid of z_erofs_fill_inode()
Gao Xiang [Thu, 6 Feb 2025 12:50:28 +0000 (20:50 +0800)]
erofs-utils: lib: get rid of z_erofs_fill_inode()

Source kernel commit: 4fdadd5b0f0c723c812842454f8cca1619f2e731

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-3-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: get rid of z_erofs_do_map_blocks() forward declaration
Gao Xiang [Thu, 6 Feb 2025 12:50:27 +0000 (20:50 +0800)]
erofs-utils: lib: get rid of z_erofs_do_map_blocks() forward declaration

Source kernel commit: 999f2f9a63f475192d837a2b8595eb0962984d21

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-2-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: sync up with the latest erofs_fs.h
Gao Xiang [Thu, 6 Feb 2025 12:50:26 +0000 (20:50 +0800)]
erofs-utils: lib: sync up with the latest erofs_fs.h

Mainly commit 745ed7d77834 ("erofs: cleanup i_format-related stuffs")
and commit 7c3ca1838a78 ("erofs: restrict pcluster size limitations")

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250206125034.1462966-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: manpages: update new option of mkfs.erofs
Gao Xiang [Fri, 24 Jan 2025 02:47:11 +0000 (10:47 +0800)]
erofs-utils: manpages: update new option of mkfs.erofs

Add `-E fragdedupe` and revise some descriptions.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250124024711.2320620-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: fsck: don't dump packed inode data if unneeded
Gao Xiang [Fri, 24 Jan 2025 09:06:28 +0000 (17:06 +0800)]
erofs-utils: fsck: don't dump packed inode data if unneeded

It was a vain attempt.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250124090628.2865088-2-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: fsck: keep S{U,G}ID bits properly on extraction
Gao Xiang [Fri, 24 Jan 2025 09:06:27 +0000 (17:06 +0800)]
erofs-utils: fsck: keep S{U,G}ID bits properly on extraction

As chown(2) explained, "
When the owner or group of an executable file are changed by an
unprivileged user the S_ISUID and S_ISGID mode bits are cleared.
POSIX does not specify whether this also should happen when root does
the chown(); the Linux behavior depends on the kernel version."

Fix it by chown() first.

Fixes: 412c8f908132 ("erofs-utils: fsck: add --extract=X support to extract to path X")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250124090628.2865088-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: mkfs: keep one-block uncompressed data for deduplication
Gao Xiang [Tue, 21 Jan 2025 16:56:22 +0000 (00:56 +0800)]
erofs-utils: mkfs: keep one-block uncompressed data for deduplication

Otherwise, the deduplication rate will be impacted, but it doesn't
matter since `-Ededupe` is still single-threaded.

Fixes: 341d23a878a2 ("erofs-utils: mkfs: speed up uncompressed data handling")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250121165622.2095470-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: introduce fragment cache
Gao Xiang [Mon, 20 Jan 2025 02:35:38 +0000 (10:35 +0800)]
erofs-utils: introduce fragment cache

Difference from the previous Yiyan's version [1], it just uses
a tmpfile to keep all decompressed data for fragments.

Dataset: linux 5.4.140
mkfs.erofs command line:
mkfs.erofs -zlzma -C131072 -T0 -Eall-fragments,fragdedupe=inode foo.erofs <dir>
Test command line:
hyperfine -p "echo 3 > /proc/sys/vm/drop_caches; sleep 1" "fsck/fsck.erofs --extract foo.erofs"

Vanilla:
  Time (mean ± σ):     362.309 s ±  0.406 s   [User: 360.298 s, System: 0.956 s]

After:
  Time (mean ± σ):     20.880 s ±  0.026 s    [User: 19.751 s, System: 1.058 s]

An in-memory LRU cache could also be implemented later to meet
different needs.

[1] https://lore.kernel.org/r/20231023071528.1912105-1-lyy0627@sjtu.edu.cn

Cc: Li Yiyan <lyy0627@sjtu.edu.cn>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250120023538.3156606-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: add some bit operations
Hongzhen Luo [Fri, 3 Jan 2025 09:03:35 +0000 (17:03 +0800)]
erofs-utils: lib: add some bit operations

Introduce following bitmap helpers:
erofs_test_bit
__erofs_set_bit
__erofs_clear_bit
erofs_find_next_bit

[1] https://lore.kernel.org/r/20230802091750.74181-3-jefflexu@linux.alibaba.com

Signed-off-by: Jingbo Xu <jefflexu@linux.alibaba.com> [1]
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250103090338.740593-2-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: mkfs: fix inefficient fragment deduplication
Gao Xiang [Tue, 21 Jan 2025 14:34:00 +0000 (22:34 +0800)]
erofs-utils: mkfs: fix inefficient fragment deduplication

Currently, long fragment comparisons could cause suboptimal results,
leading to final image sizes still larger than expected:
 _________________________________________________________________________
|______ Testset _____|_______ Vanilla _________|_________ After __________| Command Line
|  CoreOS [1]        |   802107392 (765 MiB)   |   687501312 (656 MiB)    | -zlzma,6 -Eall-fragments,fragdedupe=inode -C131072
|____________________|__ 771715072 (736 MiB) __|__ 658485248 (628 MiB)  __| -zlzma,6 -Eall-fragments,fragdedupe=inode -C1048576
|  Fedora KIWI [2]   |_ 2584076288 (2465 MiB) _|_ 2550837248 (2433 MiB) __| -zlzma,6 -Eall-fragments,fragdedupe=inode -C1048576
|____________________|_ 2843598848 (2712 MiB) _|_ 2810359808 (2681 MiB) __| (Fedora-KDE-Desktop-Live-Rawhide.0.x86_64.iso)

Almost all images that use `-Eall-fragments` could benefit from this.

[1] https://builds.coreos.fedoraproject.org/prod/streams/stable/builds/41.20241215.3.0/x86_64/fedora-coreos-41.20241215.3.0-live.x86_64.iso
[2] https://pagure.io/fedora-kiwi-descriptions.git

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250121143400.1857269-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: rework per-sb fragment generator
Gao Xiang [Fri, 17 Jan 2025 07:46:01 +0000 (15:46 +0800)]
erofs-utils: lib: rework per-sb fragment generator

It's also used for the upcoming fragment cache.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250117074602.2223094-2-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: use erofs_map_blocks() for all datalayouts
Gao Xiang [Fri, 17 Jan 2025 07:46:00 +0000 (15:46 +0800)]
erofs-utils: lib: use erofs_map_blocks() for all datalayouts

It simplifies the codebase a bit.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250117074602.2223094-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: dynamically sized `struct erofs_dentry`
Gao Xiang [Wed, 15 Jan 2025 02:27:20 +0000 (10:27 +0800)]
erofs-utils: lib: dynamically sized `struct erofs_dentry`

 - Reduced memory footprints;

 - Optimize dname sorting and strlen(dname).

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250115022720.2204033-1-hsiangkao@linux.alibaba.com
4 months agoerofs-utils: lib: limit NONHEAD delta1 for compact indexes
Gao Xiang [Tue, 21 Jan 2025 13:08:25 +0000 (21:08 +0800)]
erofs-utils: lib: limit NONHEAD delta1 for compact indexes

Otherwise it could be identified as a CBLKCNT lcluster.

It actually has no real impact for 4 KiB lclusters (blocks) since
EROFS_CONFIG_COMPR_MAX_SZ == 4 MiB and Z_EROFS_LI_D0_CBLKCNT means
2048 * 4KiB == 8 MiB.

Fixes: 0917ff150846 ("erofs-utils: fix delta[1] out-of-bound of compact indexes")
Fixes: 2f871035cca6 ("erofs-utils: mkfs: support compact indexes for bigpcluster")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250121130825.1722009-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: dump: Add --cat flag to show file contents
Juan Hernandez [Thu, 9 Jan 2025 10:56:11 +0000 (11:56 +0100)]
erofs-utils: dump: Add --cat flag to show file contents

This patch adds a new '--cat' flag to the 'dump.erofs' command. When
used it will write to the standard output the content of the file
indicated by the '--path' or '--nid' options. For example, if there is a
'/mydir/myfile.txt' file containg the text 'mytext':

    $ dump.erofs --cat --path=/mydir/myfile.txt myimage.erofs
    mytext

Signed-off-by: Juan Hernandez <jhernand@redhat.com>
Link: https://lore.kernel.org/r/20250109105611.178398-1-jhernand@redhat.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
5 months agoerofs-utils: mkfs: fix crash when failing to build tree
Gao Xiang [Thu, 9 Jan 2025 05:05:14 +0000 (13:05 +0800)]
erofs-utils: mkfs: fix crash when failing to build tree

For example: It crashes instead of cleanly erroring out if there's
a file for which it doesn't have permissions to read (e.g. /etc/gshadow
has mode 000).

Reported-by: Jonathan Lebon <jonathan@jlebon.com>
Fixes: 6a8e395ae4fd ("erofs-utils: fix up root inode for incremental builds")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250109050514.3836023-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: mkfs: support `-Efragdedupe=inode`
Gao Xiang [Fri, 3 Jan 2025 02:40:11 +0000 (10:40 +0800)]
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 <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250103024011.198163-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: release 1.8.4
Gao Xiang [Thu, 2 Jan 2025 16:00:00 +0000 (00:00 +0800)]
erofs-utils: release 1.8.4

Signed-off-by: Gao Xiang <xiang@kernel.org>
5 months agoerofs-utils: fix -Ededupe crash without fragments enabled
Gao Xiang [Thu, 2 Jan 2025 11:34:18 +0000 (19:34 +0800)]
erofs-utils: fix -Ededupe crash without fragments enabled

The root cause is the same as commit d9baceba7026 ("erofs-utils:
fix -Ededupe crash without fragments enabled").

In fact, the fragment manager should be reworked in the next major
erofs-utils version to avoid those dirty hacks.

Fixes: fc880e31b7c7 ("erofs-utils: mkfs: minor cleanup & rearrangement")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250102113418.3246744-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: mkfs: fix `-Eall-fragments` for multi-threaded compression
Gao Xiang [Thu, 2 Jan 2025 02:42:25 +0000 (10:42 +0800)]
erofs-utils: mkfs: fix `-Eall-fragments` for multi-threaded compression

`may_packing` in __z_erofs_compress_one() is still bypassed when
multi-threaded compression is enabled, which is unexpected.

Furthermore, multi-threaded `-Eall-fragments,ztailpacking` can
sometimes corrupt images.  Let's fix it.

Fixes: 882ad1c3157f ("erofs-utils: mkfs: fix `-Eall-fragments` for multi-threaded compression")
Fixes: 10c1590c0920 ("erofs-utils: enable multi-threaded support for `-Eall-fragments`")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20250102024225.2433419-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: mkfs: allow disabling fragment deduplication
Gao Xiang [Mon, 23 Dec 2024 09:40:31 +0000 (17:40 +0800)]
erofs-utils: mkfs: allow disabling fragment deduplication

Currently, although fragment inode compression is already
multi-threaded, the data parts of inodes prior to their own fragments
are still single-threaded if fragment deduplication is on.  This can
greatly slow down `-Eall-fragments` image building at least for
the current mkfs codebase.

Let's add an extended option `-E^fragdedupe` to explicitly disable it.

After this commit, the Fedora Kiwi builds I'm testing can be reduced
from 1148s (3,096,842,240 bytes, 2.9G) to 137s (2,969,956,352 bytes,
2.8G) with `-Eall-fragments,^fragdedupe -C524288 -z lzma,level=6,
dictsize=524288` on Intel(R) Xeon(R) Platinum 8269CY CPU @ 2.50GHz with
32 cores.

Cc: Neal Gompa <ngompa13@gmail.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241223094031.1534175-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: mkfs: speed up uncompressed data handling
Gao Xiang [Fri, 20 Dec 2024 14:38:59 +0000 (22:38 +0800)]
erofs-utils: mkfs: speed up uncompressed data handling

Currently, it only writes one uncompressed block (typically 4 KiB) and
then tries to recompress the remaining part if the entire data was
compressed and proven to be incompressible.

This is wasteful of CPU resources and slow, as such incompressible data
could be skipped entirely.

The LZMA build time for large pclusters (e.g., 512K, 1M) can be greatly
reduced if there is a significant amount of uncompressed data.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241220143859.643175-2-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: lib: get rid of `len` in z_erofs_compress_one()
Gao Xiang [Fri, 20 Dec 2024 14:38:58 +0000 (22:38 +0800)]
erofs-utils: lib: get rid of `len` in z_erofs_compress_one()

More than one extent could be emitted in __z_erofs_compress_one()
later.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241220143859.643175-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: lib: tar: fix LIBARCHIVE.xattr URL-encoded keys
Gao Xiang [Thu, 26 Dec 2024 04:58:08 +0000 (12:58 +0800)]
erofs-utils: lib: tar: fix LIBARCHIVE.xattr URL-encoded keys

As tar(5) [1] mentioned: `The key value is URL-encoded: All non-ASCII
characters and the two special characters "=" and "%" are encoded as
"%" followed by two uppercase hexadecimal digits.`

Fix it now.

[1] https://man.freebsd.org/cgi/man.cgi?tar(5)

Fixes: c0063a73b01b ("erofs-utils: lib: support importing xattrs from tarerofs")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241226045808.95101-3-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: lib: tar: fix LIBARCHIVE.xattr base64 decoding
Gao Xiang [Thu, 26 Dec 2024 04:58:07 +0000 (12:58 +0800)]
erofs-utils: lib: tar: fix LIBARCHIVE.xattr base64 decoding

Base64 is described in RFC1521 [1], except that LIBARCHIVE.xattr base64
may not have padding at the end of the data using the '=' character.

[1] https://datatracker.ietf.org/doc/html/rfc1521#section-5.2

Fixes: c0063a73b01b ("erofs-utils: lib: support importing xattrs from tarerofs")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241226045808.95101-2-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: lib: tar: ignore useless fields of PAX extended headers
Gao Xiang [Thu, 26 Dec 2024 04:58:06 +0000 (12:58 +0800)]
erofs-utils: lib: tar: ignore useless fields of PAX extended headers

Since some unknown writer just leaves zero-filled mtime, e.g.
registry.k8s.io/pause:3.6  --platform windows

Layer sha256: bc8517709e9cfff223cb034ff5be8fcbfa5409de286cdac9ae1b8878ebea6b84

Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241226045808.95101-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: use external xxhash library if possible
Gao Xiang [Fri, 20 Dec 2024 14:41:39 +0000 (22:41 +0800)]
erofs-utils: use external xxhash library if possible

It's expected to be faster than the internal one.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241220144139.648210-1-hsiangkao@linux.alibaba.com
5 months agoerofs-utils: release 1.8.3
Gao Xiang [Fri, 13 Dec 2024 16:00:00 +0000 (00:00 +0800)]
erofs-utils: release 1.8.3

Signed-off-by: Gao Xiang <xiang@kernel.org>
5 months agoerofs-utils: lib: correct erofsfuse build script
ComixHe [Fri, 13 Dec 2024 06:32:50 +0000 (14:32 +0800)]
erofs-utils: lib: correct erofsfuse build script

Some of the symbols required by erofsfuse are provided by liberofs.
When option 'enable-static-fuse' is set, all these object file should be
exported to liberofsfuse.a

Signed-off-by: ComixHe <heyuming@deepin.org>
Link: https://lore.kernel.org/r/8725A28257A20420+20241213063250.314786-1-heyuming@deepin.org
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
5 months agoerofs-utils: add --hard-dereference option
Paul Meyer [Thu, 12 Dec 2024 16:48:07 +0000 (17:48 +0100)]
erofs-utils: add --hard-dereference option

Add option --hard-dereference to dereference hardlinks when
creating an image. Instead of reusing the inode, hardlinks are added
as separate inodes. This is useful for reproducible builds, when the
rootfs is space-optimized using hardlinks on some machines, but not on
others.

Co-authored-by: Leonard Cohnen <leonard.cohnen@gmail.com>
Signed-off-by: Paul Meyer <katexochen0@gmail.com>
Link: https://lore.kernel.org/r/20241212165550.58756-1-katexochen0@gmail.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
6 months agoerofs-utils: mkfs: add `-U <clear|random>` support
Gao Xiang [Wed, 11 Dec 2024 09:27:04 +0000 (17:27 +0800)]
erofs-utils: mkfs: add `-U <clear|random>` support

To match `mke2fs`.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241211092704.4008111-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: lib: get rid of pthread_cancel() for workqueue
Gao Xiang [Wed, 11 Dec 2024 02:50:09 +0000 (10:50 +0800)]
erofs-utils: lib: get rid of pthread_cancel() for workqueue

Since bionic (Android's libc) does not have pthread_cancel(),
call erofs_destroy_workqueue() when initialization fails.

Reviewed-by: Yifan Zhao <zhaoyifan@sjtu.edu.cn>
Cc: Kelvin Zhang <zhangkelvin@google.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241211025009.3393476-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: use pkg-config for lz4 configuration
Gao Xiang [Thu, 5 Dec 2024 03:08:46 +0000 (11:08 +0800)]
erofs-utils: use pkg-config for lz4 configuration

Also obsolete those `LZ4_HC_STATIC_LINKING_ONLY` versions since it's
too complicated to be maintained.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241205030846.70656-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: lib: add missing dependencies
Gao Xiang [Thu, 5 Dec 2024 02:09:15 +0000 (10:09 +0800)]
erofs-utils: lib: add missing dependencies

Add the missing ${libdeflate_CFLAGS} and ${libzstd_CFLAGS} to avoid
compilation errors.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241205020915.966196-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: mkfs: make output stable
Jooyung Han [Tue, 3 Dec 2024 07:45:31 +0000 (16:45 +0900)]
erofs-utils: mkfs: make output stable

The iteration order of opendir/readdir depends on filesystem
implementation. Initializng inode->i_ino[0] in the loop causes the
output unstable even though the entries are sorted in
erofs_prepare_dir_file().

In this change,  inode->i_ino[0] is initialized in
erofs_prepare_inode_buffer() instead to make the output stable. (not
affected by readdir())

  # should generate the same output

Test: mkfs.erofs ... inputdir(ext3)
Test: mkfs.erofs ... inputdir(tmpfs)
Signed-off-by: Jooyung Han <jooyung@google.com>
Link: https://lore.kernel.org/r/20241203074531.3728133-1-jooyung@google.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
6 months agoerofs-utils: lib: fix user-after-free in xattr.c
Hongzhen Luo [Mon, 2 Dec 2024 02:40:19 +0000 (10:40 +0800)]
erofs-utils: lib: fix user-after-free in xattr.c

Currently, put_xattritem() does not remove the `item`
from the hash table after freeing it, which may lead
to a user-after-free issue.

This patch fixes it.

Fixes: 47d6895a5ff9 ("erofs-utils: introduce inline xattr support")
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20241202024019.85901-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
6 months agoerofs-utils: rebuild: set the appropriate `dev` field for dirs
Hongzhen Luo [Wed, 27 Nov 2024 11:13:46 +0000 (19:13 +0800)]
erofs-utils: rebuild: set the appropriate `dev` field for dirs

Currently, setting a default `dev` value (i.e., 0) for directories
during parsing tar files can lead to the following error:

<E> erofs: bogus i_mode (0) @ nid 0
<E> erofs: failed to read inode @ 0

Consider the following incremental build scenario, where the path
"dir1/dir2" is currently being parsed in tarerofs_parse_tar() and
the directory "dir1" has never appeared before.
`erofs_rebuild_get_dentry()` will call erofs_rebuild_mkdir() to
allocate a new inode for "dir1", with its `dev` field set to 0 by
default.

During the dump tree phase, since `dir1->dev` matches `sbi->dev`
(both are 0), erofs_rebuild_load_basedir() will be called to read
the contents of directory "dir1" from the disk. However, since
there is no information for the new directory "dir1" on the disk,
the above error occurs.

This patch resolves the above issue by setting the appropriate value
for the directory's `dev` field during the tar file parsing phase.

Fixes: f64d9d02576b ("erofs-utils: introduce incremental builds")
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241127111346.49290-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
6 months agoerofs-utils: avoid silent corruption caused by `c_root_xattr_isize`
Hongzhen Luo [Wed, 27 Nov 2024 09:28:25 +0000 (17:28 +0800)]
erofs-utils: avoid silent corruption caused by `c_root_xattr_isize`

When `c_root_xattr_isize` is too large, `i_xattr_icount` will overflow,
resulting in silent corruption of the filesystem image. This patch performs
checks in advance and reports errors.

Fixes: 8f93c2f83962 ("erofs-utils: mkfs: support inline xattr reservation for rootdirs")
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241127092825.4105724-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
6 months agoerofs-utils: lib: clean up z_erofs_load_full_lcluster()
Gao Xiang [Thu, 21 Nov 2024 02:35:17 +0000 (10:35 +0800)]
erofs-utils: lib: clean up z_erofs_load_full_lcluster()

Let's keep in sync with kernel commit d69189428d50 ("erofs: clean up
z_erofs_load_full_lcluster()").

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241121023517.581040-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: lib: clean up zmap.c
Gao Xiang [Tue, 19 Nov 2024 08:54:26 +0000 (16:54 +0800)]
erofs-utils: lib: clean up zmap.c

Let's keep in sync with kernel commit 8241fdd3cdfe ("erofs: clean up
zmap.c").

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241119085427.1672789-1-hsiangkao@linux.alibaba.com
6 months agoerofs-utils: fix `Not a directory` error for incremental builds
Gao Xiang [Fri, 22 Nov 2024 07:56:59 +0000 (15:56 +0800)]
erofs-utils: fix `Not a directory` error for incremental builds

If an incremental layer contains a directory but the same path in
the base layer is a non-directory, it will fail unexpectedly.

Fix it now.

Reported-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Co-developped-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Fixes: f64d9d02576b ("erofs-utils: introduce incremental builds")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241122075659.2869515-1-hsiangkao@linux.alibaba.com
7 months agoerofs-utils: lib: capture errors from {mkfs,rebuild}_handle_inode()
Hongzhen Luo [Tue, 12 Nov 2024 02:08:30 +0000 (10:08 +0800)]
erofs-utils: lib: capture errors from {mkfs,rebuild}_handle_inode()

Currently, the error code returned by erofs_{mkfs,rebuild}_handle_inode()
in erofs_mkfs_dump_tree() may be ignored. This patch introduces `err2` to
capture errors from {mkfs,rebuild}_handle_inode().

Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241112020830.849210-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
7 months agoerofs-utils: lib: rearrange struct erofs_configure
Hongzhen Luo [Mon, 11 Nov 2024 09:57:15 +0000 (17:57 +0800)]
erofs-utils: lib: rearrange struct erofs_configure

Move the fields controlled by the NDEBUG macro to the end
to maintain a consistent layout for preceding variables.

It addresses cases where a third-party application does not define
NDEBUG while erofs-utils does.  Ideally, third-party applications
should use the same macros as erofs-utils to get a unique
`struct erofs_configure`. However, since NDEBUG enables unnecessary
assertions, restructuring the layout resolves such inconsistencies.

Fixes: ad6c80dc168d ("erofs-utils: lib: add erofs_get_configure()")
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241111095715.3814956-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
7 months agoerofs-utils: mkfs: Fix input offset counting in headerball mode
Mike Baynton [Mon, 11 Nov 2024 16:48:19 +0000 (10:48 -0600)]
erofs-utils: mkfs: Fix input offset counting in headerball mode

When using --tar=headerball, most files included in the headerball are
not included in the EROFS image. mkfs.erofs typically exits prematurely,
having processed non-USTAR blocks as USTAR and believing they are
end-of-archive markers. (Other failure modes are probably also possible
if the input stream doesn't look like end-of-archive markers at the
locations that are being read.)

This is because we lost correct count of bytes that are read from the
input stream when in headerball (or ddtaridx) modes. We were assuming that
in these modes no data would be read following the ustar block, but in
case of things like PAX headers, lots more data may be read without
incrementing tar->offset.

This corrects by always incrementing the offset counter, and then
decrementing it again in the one case where headerballs differ -
regular file data blocks are not present.

Signed-off-by: Mike Baynton <mike@mbaynton.com>
Link: https://lore.kernel.org/r/20241111164819.560567-1-mike@mbaynton.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
7 months agoerofs-utils: avoid allocating large arrays on the stack
Jianan Huang [Fri, 25 Oct 2024 01:52:46 +0000 (09:52 +0800)]
erofs-utils: avoid allocating large arrays on the stack

The default pthread stack size of bionic is 1M. Use malloc to avoid
stack overflow.

Signed-off-by: Jianan Huang <huangjianan@xiaomi.com>
Link: https://lore.kernel.org/r/20241025015246.649209-1-huangjianan@xiaomi.com
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
7 months agoerofs-utils: lib: report leftovers for partially filled blocks
Gao Xiang [Fri, 18 Oct 2024 06:24:17 +0000 (14:24 +0800)]
erofs-utils: lib: report leftovers for partially filled blocks

3rd-party applications may need the exact zeroed size for each
partial filesystem block to populate remote data.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241018062417.2297930-1-hsiangkao@linux.alibaba.com
7 months agoerofs-utils: mkfs: fix unexpected errors for chunk-based images
Gao Xiang [Wed, 16 Oct 2024 07:48:49 +0000 (15:48 +0800)]
erofs-utils: mkfs: fix unexpected errors for chunk-based images

mkfs.erofs may fail because copy_file_range() returns the number of
bytes which could be less than the length originally requested.

Fixes: 03cbf7b8f7f7 ("erofs-utils: mkfs: support chunk-based uncompressed files")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241016074849.2862282-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: mkfs: fix `-Eall-fragments` for multi-threaded compression
Gao Xiang [Sat, 12 Oct 2024 03:52:13 +0000 (11:52 +0800)]
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 <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241012035213.3729725-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: lib: Explicitly include <pthread.h> where used
Satoshi Niwa [Tue, 8 Oct 2024 06:08:19 +0000 (15:08 +0900)]
erofs-utils: lib: Explicitly include <pthread.h> where used

compress.c and inode.c use pthread functions but do not explicitly include <pthread.h>.
This causes build failures with the Android build system,
which throws "error: implicit declaration of function pthread_*".

Signed-off-by: Satoshi Niwa <niwa@google.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20241008060819.2442945-1-niwa@google.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
8 months agoerofs-utils: release 1.8.2 v1.8.2
Gao Xiang [Mon, 23 Sep 2024 16:00:00 +0000 (00:00 +0800)]
erofs-utils: release 1.8.2

Signed-off-by: Gao Xiang <xiang@kernel.org>
8 months agoerofs-utils: lib: fix compressed packed inodes
Danny Lin [Mon, 23 Sep 2024 05:17:29 +0000 (22:17 -0700)]
erofs-utils: lib: fix compressed packed inodes

Commit 2fdbd28 fixed uncompressed packed inodes by not always writing
compressed data, but it broke compressed packed inodes because now
uncompressed file data is always written after the compressed data.

The new error handling always rewinds with lseek and falls through to
write_uncompressed_file_from_fd, regardless of whether the compressed
data was written successfully (ret = 0) or not (ret = -ENOSPC). This
can result in corrupted files.

Fix it by simplifying the error handling to better match the old code.

Fixes: 2fdbd28 ("erofs-utils: lib: fix uncompressed packed inode")
Co-authored-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Signed-off-by: Danny Lin <danny@orbstack.dev>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240923051759.7563-2-danny@orbstack.dev
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
8 months agoerofs-utils: mkfs: add `--sort=none`
Gao Xiang [Mon, 23 Sep 2024 07:49:29 +0000 (15:49 +0800)]
erofs-utils: mkfs: add `--sort=none`

Currently, `--tar=f` writes file data twice due to unseekable streams
and EROFS data ordering requirements.  Some use cases may need to avoid
unnecessary data writes for performance and do NOT require a strict
data ordering.

It adds `--sort=none` to address this.  The image is still reproducible;
it simply means no specific file data ordering is implied.

Currently, It comes into effect if `-E^inline_data` is specified and no
compression is applied.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240923074929.2445674-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: mkfs: get rid of outdated subpage compression warning
Gao Xiang [Thu, 19 Sep 2024 10:55:19 +0000 (18:55 +0800)]
erofs-utils: mkfs: get rid of outdated subpage compression warning

It has been supported since Linux 6.8.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240919105519.3656878-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: mkfs: fix a regression where rebuild mode does not work
Gao Xiang [Thu, 19 Sep 2024 02:16:35 +0000 (10:16 +0800)]
erofs-utils: mkfs: fix a regression where rebuild mode does not work

It will fail unexpectedly if any sub-image lacks an extra device (blob).

Fixes: 7550a30c332c ("erofs-utils: enable incremental builds")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240919021635.2922387-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: lib: fix off-by-one issue with invalid device ID
Gao Xiang [Tue, 17 Sep 2024 09:11:15 +0000 (17:11 +0800)]
erofs-utils: lib: fix off-by-one issue with invalid device ID

The device ID should be no less than `1 + number of blobs`. In other
words, it should be greater than `number of blobs`.

Fixes: 89dfe997c2ee ("erofs-utils: lib: fix global-buffer-overflow due to invalid device")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240917091115.3920734-1-hsiangkao@linux.alibaba.com
8 months agoerofs-utils: lib: fix sorting shared xattrs
Sheng Yong [Fri, 13 Sep 2024 14:35:42 +0000 (22:35 +0800)]
erofs-utils: lib: fix sorting shared xattrs

The length of xattr_item->kvbuf is calculated by EROFS_XATTR_KVSIZE,
and the key part has a trailing '\0' before the value part. When qsort
compares two xattr_items, the key-value length should be calculated by
EROFS_XATTR_KVSIZE, and use memcmp instead of strncmp to avoid key-value
string being cut by '\0'.

Fixes: 5df285cf405d ("erofs-utils: lib: refactor extended attribute name prefixes")
Signed-off-by: Sheng Yong <shengyong@oppo.com>
Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240913143542.3265071-1-shengyong@oppo.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
8 months agoerofs-utils: fsck: introduce exporting xattrs
Hongzhen Luo [Fri, 13 Sep 2024 07:21:00 +0000 (15:21 +0800)]
erofs-utils: fsck: introduce exporting xattrs

Currently `fsck --extract` does not support exporting
extended attributes. This patch adds the `--xattrs` option
to dump extended attributes and the `--no-xattrs` option to
omit them (the default behavior).

Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240913072100.577753-2-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
8 months agoerofs-utils: lib: expose erofs_xattr_prefix_matches()
Hongzhen Luo [Fri, 13 Sep 2024 07:20:59 +0000 (15:20 +0800)]
erofs-utils: lib: expose erofs_xattr_prefix_matches()

Prepare for the feature of exporting extended attributes for
`fsck.erofs`.

Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240913072100.577753-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: lib: fix incorrect nblocks in block list for chunked inodes
Hongzhen Luo [Wed, 11 Sep 2024 08:55:31 +0000 (16:55 +0800)]
erofs-utils: lib: fix incorrect nblocks in block list for chunked inodes

Currently, the number of physical blocks (nblocks) for the last chunk
written to the block list file is incorrectly recorded as the inode
chunksize.

This patch writes the actual number of physical blocks for the inode in
the last chunk to the block list file.

Fixes: 7b46f7a0160a ("erofs-utils: lib: merge consecutive chunks if possible")
Fixes: b6749839e710 ("erofs-utils: generate preallocated extents for tarerofs")
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240911085531.2133723-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: lib: use another way to check power-of-2
Gao Xiang [Tue, 10 Sep 2024 07:52:56 +0000 (15:52 +0800)]
erofs-utils: lib: use another way to check power-of-2

Otherwise, Coverity will complain with "Operands don't affect result
(CONSTANT_EXPRESSION_RESULT)", which I don't think is an issue.

Coverity-id: 508261
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240910075256.3423180-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: mkfs: fix inaccurate assertion of hardlinks in rebuild mode
Gao Xiang [Mon, 9 Sep 2024 11:13:05 +0000 (19:13 +0800)]
erofs-utils: mkfs: fix inaccurate assertion of hardlinks in rebuild mode

`erofs_parent_inode(inode) == dir` is only true for non-hardlink
inodes and directories.

Only debug builds are impacted.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240909111305.1850391-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: lib: tar: allow pax headers with empty names
Gao Xiang [Mon, 9 Sep 2024 09:33:54 +0000 (17:33 +0800)]
erofs-utils: lib: tar: allow pax headers with empty names

Usually, `exthdr.name`s are set as "%d/PaxHeaders.%p/%f" [1].

However, since both `GNU tar` and `bsdtar` can process empty
`exthdr.name`s, let's allow them too.

[1] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/pax.html

Reported-by: Colin Walters <walters@verbum.org>
Fixes: 95d315fd7958 ("erofs-utils: introduce tarerofs")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240909093354.1712460-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: mkfs: fix an undefined behavior of memcpy
Gao Xiang [Fri, 6 Sep 2024 08:36:51 +0000 (16:36 +0800)]
erofs-utils: mkfs: fix an undefined behavior of memcpy

Call trace:
 - erofs_mkfs_build_tree
  - erofs_mkfs_go(sbi, ~0, NULL, 0);

inode.c:1395:20: runtime error: null pointer passed as argument 2, which is declared to never be null
/usr/include/string.h:44:28: note: nonnull attribute specified here
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior inode.c:1395:20 in

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240906083651.341555-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: fix invalid argument type in erofs_err()
Hongzhen Luo [Fri, 30 Aug 2024 10:03:54 +0000 (18:03 +0800)]
erofs-utils: fix invalid argument type in erofs_err()

Fix several issues found by Coverity regarding "Invalid type in argument
for printf format specifier".

Coverity-id: 502374, 502367, 502362, 502348, 502342, 502341,
     502340, 502358
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240830100354.2093735-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: lib: don't include <lzma.h> and <zlib.h> in external headers
Gao Xiang [Fri, 30 Aug 2024 06:55:42 +0000 (14:55 +0800)]
erofs-utils: lib: don't include <lzma.h> and <zlib.h> in external headers

Applications don't need internal header dependencies.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240830065542.94908-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: lib: actually skip the unidentified xattrs
Sandeep Dhavale [Tue, 20 Aug 2024 21:01:23 +0000 (14:01 -0700)]
erofs-utils: lib: actually skip the unidentified xattrs

parse_one_xattr() will return null if it detects unidentified xattr.
In such cases we need to skip this xattr which was our intention than
try to add it in erofs_xattr_add() which results in null pointer
dereference.

Fixes: 3037f8958f3b ("erofs-utils: skip all unidentified xattrs from local paths")
Signed-off-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240820210123.2684886-2-dhavale@google.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: mkfs: fix an indefinite wait race
Gao Xiang [Wed, 21 Aug 2024 03:43:26 +0000 (11:43 +0800)]
erofs-utils: mkfs: fix an indefinite wait race

Coverity reports: In erofs_mkfs_flushjobs, a thread waits for
a thread-shared condition that may have already been satisfied,
causing a hang.

It might indeed happen if the dfops worker runs with the specific
timing.  Let's try to fix it and see if the report is cleared.

Coverity-id: 502330
Fixes: 37e5abcd8720 ("erofs-utils: mkfs: assign root NID in the main thread")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240821034326.2464146-1-hsiangkao@linux.alibaba.com
9 months agoerofs-utils: lib: fix potential overflow issue
Hongzhen Luo [Tue, 13 Aug 2024 12:10:23 +0000 (20:10 +0800)]
erofs-utils: lib: fix potential overflow issue

Change 8U to 8ULL to avoid arithmetic multiplication overflow.

Coverity-id: 502353
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240813121023.781122-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: adjust volume label maximum length to the kernel implementation
Naoto Yamaguchi [Fri, 16 Aug 2024 03:13:36 +0000 (12:13 +0900)]
erofs-utils: adjust volume label maximum length to the kernel implementation

The erofs implementation of kernel has limitation of the volume label length.
The volume label data size of super block is 16 bytes.
The kernel implementation requires to null terminate inside a that 16 bytes.

Logs:
  $ ./mkfs/mkfs.erofs test16.erofs -L 0123456789abcdef test/
  $ mount -o loop ./test16.erofs ./mnt/
  $ dmesg
  [26477.019283] erofs: (device loop0): erofs_read_superblock: bad volume name without NIL terminator

  $ ./mkfs/mkfs.erofs test15.erofs -L 0123456789abcde test/
  $ mount -o loop ./test15.erofs ./mnt/
  $ dmesg
  [26500.516871] erofs: (device loop0): mounted with root inode @ nid 36.

This patch adjusts volume label maximum length to the kernel implementation.

Signed-off-by: Naoto Yamaguchi <naoto.yamaguchi@aisin.co.jp>
Link: https://lore.kernel.org/r/20240816031601.45848-1-naoto.yamaguchi@aisin.co.jp
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: use $EROFS_UTILS_VERSION, if set, as the version
Ahelenia Ziemiańska [Fri, 16 Aug 2024 03:05:41 +0000 (05:05 +0200)]
erofs-utils: use $EROFS_UTILS_VERSION, if set, as the version

This lets downstreams embed the unpolluted downstream version;
when building the Debian package (from gbp) the resulting binary yields
  $ mkfs.erofs
  <E> erofs: missing argument: FILE
  mkfs.erofs 1.8.1-fead89d91-dirty
  Try 'mkfs.erofs --help' for more information.

Now, d/rules can
  export EROFS_UTILS_VERSION := $(shell IFS="$$IFS()" read -r _ v _ < debian/changelog; echo "$$v")
yielding
  $ mkfs.erofs
  <E> erofs: missing argument: FILE
  mkfs.erofs 1.8.1-1
  Try 'mkfs.erofs --help' for more information.

Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Link: https://lore.kernel.org/r/gho2b67qax222ewv5xb5cjkkgjgzftr3pyecl536g6jshcfexa@tarta.nabijaczleweli.xyz
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
9 months agoerofs-utils: lib: exclude: #include PATH_MAX workaround
Ahelenia Ziemiańska [Thu, 15 Aug 2024 20:15:44 +0000 (22:15 +0200)]
erofs-utils: lib: exclude: #include PATH_MAX workaround

Fixes build on the hurd.

Signed-off-by: Ahelenia Ziemiańska <nabijaczleweli@nabijaczleweli.xyz>
Link: https://lore.kernel.org/r/xs4azw3vs7oryqnpkvzsl6qbmma6p646igoklia2fextt6pdiw@tarta.nabijaczleweli.xyz
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
10 months agoerofs-utils: release 1.8.1 v1.8.1
Gao Xiang [Fri, 9 Aug 2024 16:00:00 +0000 (00:00 +0800)]
erofs-utils: release 1.8.1

Signed-off-by: Gao Xiang <xiang@kernel.org>
10 months agoerofs-utils: lib: fix heap-buffer-overflow on read
Gao Xiang [Fri, 9 Aug 2024 16:15:36 +0000 (00:15 +0800)]
erofs-utils: lib: fix heap-buffer-overflow on read

Wrap up into kite_mf_hc3_skip() for now.

Fixes: 861037f4fc15 ("erofs-utils: add a built-in DEFLATE compressor")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240809161536.3961647-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: fuse: fix partial decompression for libdeflate
Gao Xiang [Fri, 9 Aug 2024 10:56:36 +0000 (18:56 +0800)]
erofs-utils: fuse: fix partial decompression for libdeflate

Actually, libdeflate doesn't support partial decompression; therefore,
fix it by reallocating larger decompression buffers.

Although a better approach would be to obtain the exact decompressed
length instead for libdeflate decompressor, which requires more changes,
a quick fix is needed.

Fixes: 29b9e7140162 ("erofs-utils: fuse,fsck: add DEFLATE algorithm support")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240809105636.3641536-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: lib: fix truncated uncompressed files
Gao Xiang [Fri, 9 Aug 2024 03:37:47 +0000 (11:37 +0800)]
erofs-utils: lib: fix truncated uncompressed files

Some uncompressed files which are more than 4GiB can be truncated
incorrectly.

Fixes: 358177730598 ("erofs-utils: optimize write_uncompressed_file_from_fd()")
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240809033747.3178912-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: release 1.8 v1.8
Gao Xiang [Thu, 8 Aug 2024 17:13:10 +0000 (01:13 +0800)]
erofs-utils: release 1.8

Signed-off-by: Gao Xiang <xiang@kernel.org>
10 months agoerofs-utils: lib: fix global-buffer-overflow due to invalid device
Gao Xiang [Thu, 8 Aug 2024 16:03:43 +0000 (00:03 +0800)]
erofs-utils: lib: fix global-buffer-overflow due to invalid device

Fuzzer generates an image with crafted chunks of some invalid device.
Also refine the printed message of EOD.

Closes: https://github.com/erofs/erofsnightly/actions/runs/10172576269/job/28135408276
Closes: https://github.com/erofs/erofs-utils/issues/11
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240808160343.2544426-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: mkfs: add `--mkfs-time` option
Gao Xiang [Thu, 8 Aug 2024 09:45:22 +0000 (17:45 +0800)]
erofs-utils: mkfs: add `--mkfs-time` option

Some users need a fixed build time in the superblock for reproducible
builds rather than a fixed timestamp everywhere.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240808094522.2161075-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: update README for the upcoming 1.8
Gao Xiang [Thu, 8 Aug 2024 05:08:18 +0000 (13:08 +0800)]
erofs-utils: update README for the upcoming 1.8

Add descriptions to multi-threaded compression and reproducible builds.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240808050818.1822583-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: enable multi-threaded support for `-Eall-fragments`
Gao Xiang [Wed, 7 Aug 2024 08:54:13 +0000 (16:54 +0800)]
erofs-utils: enable multi-threaded support for `-Eall-fragments`

Since `-Eall-fragments` packs the whole data into the special inode,
it's possible to use the multi-threaded compression for this.

Some users may be interested in `-Eall-fragments` for extreme
compression anyway.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240807085413.717066-1-hsiangkao@linux.alibaba.com
10 months agoerofs-utils: lib: fix potential overflow issue
Hongzhen Luo [Mon, 5 Aug 2024 03:25:10 +0000 (11:25 +0800)]
erofs-utils: lib: fix potential overflow issue

Coverity-id: 502377
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240805032510.2637488-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
10 months agoerofs-utils: disallow new algorithms on incremental builds
Gao Xiang [Tue, 6 Aug 2024 00:08:59 +0000 (08:08 +0800)]
erofs-utils: disallow new algorithms on incremental builds

On-disk compression configurations are not rewritten on incremental
builds, therefore there is no way to add new algorithms in this mode.

Clean builds should be used instead.

Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Link: https://lore.kernel.org/r/20240806000859.66658-1-xiang@kernel.org
10 months agoerofs-utils: mkfs: fix uninitialized nblocks
Hongzhen Luo [Mon, 5 Aug 2024 07:39:53 +0000 (15:39 +0800)]
erofs-utils: mkfs: fix uninitialized nblocks

Coverity-id: 502376
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240805073953.2864289-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
10 months agoerofs-utils: fix invalid argument type in erofs_err()
Hongzhen Luo [Mon, 5 Aug 2024 02:44:08 +0000 (10:44 +0800)]
erofs-utils: fix invalid argument type in erofs_err()

Coverity-id: 502378
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240805024408.2598464-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
10 months agoerofs-utils: fix missing argument to erofs_err()
Hongzhen Luo [Mon, 5 Aug 2024 02:28:26 +0000 (10:28 +0800)]
erofs-utils: fix missing argument to erofs_err()

Fixes: cdd34def670b ("erofs-utils: mkfs: introduce rebuild mode")
Coverity-id: 502380
Signed-off-by: Hongzhen Luo <hongzhen@linux.alibaba.com>
Reviewed-by: Sandeep Dhavale <dhavale@google.com>
Link: https://lore.kernel.org/r/20240805022826.2581887-1-hongzhen@linux.alibaba.com
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>