Files
erofs-freebsd-out-tree/tests/results/manual/2026-08-09T0124Z-final-review/manual-test-report.md
T
2026-08-18 09:20:44 +02:00

5.6 KiB

repo22 Final Review WIP Manual Test Report

Started: 2026-08-09 01:24 UTC

Completed: 2026-08-09 03:33 UTC

Parent commit: 9a3604fba32cfe2ff263d954d80fe588f99db88f

Guest: FreeBSD 15.0-RELEASE-p8 amd64, QEMU TCG

Linux reference: /work/dev-src-linux/fs/erofs

FreeBSD reference: /work/dev-freebsd-releng

Scope

This run reviews and validates four final correctness findings:

  • Linux-compatible 48-bit superblock union selection;
  • rejection of extended inode sizes above FreeBSD OFF_MAX;
  • bounded reads from multi-GiB explicit extent holes;
  • 64-bit directory block-search indexes.

No CI work, binary fixture, guest overlay, build object, or raw VM artifact is part of the intended commit.

Result

Test Result Evidence
TC150 48-bit fallback root PASS Real FreeBSD mount, root read, inode and df
TC151 size above OFF_MAX PASS Six direct failures, rc 1, syscall errno 97
TC152 bounded extent hole PASS Two pread/mmap probes, stable active allocation
TC153 large directory index SHELVED Host fixture reproducible; kernel run incomplete

TC153 is deliberately not marked PASS. See issues/TC153-large-directory-block-index-validation.md.

Source Review

Linux super.c initializes blocks_lo and uses rb.blocks_hi only inside 48BIT && rootnid_8b. repo22 now decodes blocks and root NID together under that same selector.

FreeBSD exposes signed off_t pager and vnode interfaces bounded by OFF_MAX; repo22 rejects a larger decoded inode before vnode/pager setup.

The extent-hole path now zeroes only the current requested span in z_erofs_do_read() instead of allocating the complete logical extent.

The directory block search now uses 64-bit bounds and a checked block-offset multiplication. The within-block search remains 32-bit, matching the validated block-sized domain.

Build Results

Commands:

EROFS_ZSTDIO=0 ./build.sh
EROFS_ZSTDIO=1 ./build.sh
nm -u build/erofs.ko
git diff --check -- repo-community/repo22
Configuration Module SHA256 Result
EROFS_ZSTDIO=0 65bc19d53a2a7f0525bfacadb441dab37ee318f5f5b4c62b5ecd1b5090fe46d2 PASS
EROFS_ZSTDIO=1 d46ca4dfc858deaf4840fad8b8589b16d4b71b34afa96dc7acf1255890c5cef7 PASS

Both freestanding builds completed. Neither module had an unresolved bcmp reference. The ZSTDIO-enabled module was transferred to the guest, loaded as KLD ID 7, and unloaded after testing.

Fixture Evidence

Fixture SHA256
fallback-48bit-root2.erofs bed3be4dfb8499d4e794b03eddd5b9cda95bc8e5571ae7d765c4852ece0d95a3
extended-size-bit63.erofs e4a0f550168f1a2911603863d0074d474e61adc787c14c0278c83a060643ee38
extent-hole-5g.erofs 50014a24493918247e36511ad34a2fe8ab47ae09ea46d7fd62a1bed445a6c65f
large-dir-intmax.erofs 0f90d3d57adbbbd946e41b225c1f6c464915c6abb0b13478ec9b2a318def1f72

The TC153 hash is host generator evidence only.

TC150

The fixture encoded rootnid_2b=36, rootnid_8b=0, blocks_lo=1, and the 48-bit incompat bit. The 4 KiB image mounted on /dev/md0 and produced:

content=48-bit fallback root
sha256=d361f537492113ca93cfbf91c06ebc06e2b8b695d8b6e63ad3666013eaa029f0
root inode=36
df total=4 one-KiB blocks

This proves the union was not shifted into a high block count. It does not replace the large-provider TC010 test.

TC151

The fixture used extended inode NID 40 at byte 1280 with i_size=0x8000000000000000. The image mounted, but every access to big.dat failed before open or pager setup:

Access Attempts Direct rc truss result
stat 2 1, 1 fstatat ... ERR#97
cat 2 1, 1 openat ... ERR#97
mmap_fault 2 1, 1 openat ... ERR#97

All six errors were Integrity check failed. No file descriptor reached the read or mmap phase.

TC152

The mounted file size was 5368713216 bytes. The native helper probed offset 3221225472 with a one-byte pread and one-page private mmap:

attempt 1: PASS, real 0.03 s
attempt 2: PASS, real 0.02 s

The erofs malloc row was 3 active allocations and 768 active bytes both before and after. The cumulative allocation counter moved from 89 to 95, as expected for temporary request buffers; active memory did not scale with the 5 GiB hole.

TC153

The first 4096-byte fixture was Layout 2 and failed before the target namei path. A second 65536-byte base with 400 entries was still Layout 2. The tracked generator now converts the directory to Layout 0 by moving its complete data to appended blocks and produced a 90112-byte patched image with raw block 16, 22 image blocks, and the hash listed above.

The corrected fixture was not executed in the FreeBSD kernel during this run. TC153 remains SHELVED, and the complete attempt history and acceptance criteria are in its issue document.

Cleanup

The qualified rerun used dmesg line count 123 before and after. It ended with:

EROFS mounts: 0
md providers: none
EROFS modules: 0

An earlier unqualified probe encountered a preloaded differently named EROFS KLD and a truss exit-status ambiguity. It was discarded. The qualified run first unloaded that KLD, loaded the exact module hash above, captured direct command exit codes separately from syscall traces, and then cleaned up.

Deferred Issues

  • issues/TC153-large-directory-block-index-validation.md
  • issues/TC010-48bit-statfs-large-provider.md
  • issues/extent-metadata-fixture-unavailable.md

The raw guest transcripts remain untracked under /work/build. This report, the deterministic generator, and source/test documentation are the tracked evidence.