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

11 KiB

repo22 G2 Full Manual Regression Report

Started: 2026-08-09 06:07 UTC

Completed: 2026-08-09 07:10 UTC

Baseline: cd0e985b5ac54a4b7acb7042422329ad1729fb3e

Branch: manual-g2-20260809T060709Z

Guest: FreeBSD 15.0-RELEASE-p8 amd64, QEMU TCG, isolated port 9223

Overlay: /work/build/repo22-manual-g2-20260809T060709Z-freebsd15-overlay.qcow2

Scope and Result

The exact assigned set was executed manually from the numbered Markdown procedures. No CI, runner, result wrapper, or unassigned TC was used.

Test Result Primary evidence
TC002 PASS Real CRC32C ranges; valid mount; bad covered byte ERR#97
TC008 PASS Bad magic ERR#22; 1023-byte provider ERR#6; empty md EINVAL
TC010 PASS Qualified 16 TiB sparse provider; exact 64-bit df total
TC015 PASS Bad block size/root/feature returned 22/97/45
TC016 PASS Checksum-field-only mutation returned ERR#97
TC017 PASS Raw union fields; short ERR#6; qualified sparse mount
TC018 PASS Exact read at physical offset 17592191561728
TC112 PASS Bad magic field returned ERR#22 before root load
TC113 PASS Resolved inode openat returned ERR#45
TC114 PASS OOB FLAT_PLAIN read returned ERR#97
TC115 PASS Future algorithm bit returned ERR#45
TC116 PASS FBT decompressor entry count 1; read returned ERR#5
TC119 PASS FLAT_PLAIN changed byte/hash returned without kernel error

Count: 13 assigned, 13 PASS, 0 KERNEL-FAIL, 0 SHELVED, 0 ENV, 0 duplicate, 0 omitted, 0 extra.

Build and Guest

Both configurations were built natively in the isolated guest with kernel -Werror, FREEBSD_SRC=/tmp/repo22-freebsd15-src, and FreeBSD source 15.0-RELEASE-p9. The running guest was 15.0-RELEASE-p8.

Configuration KLD SHA256 Result
WITH_ZSTDIO=0 482e9c072c949f0459c422aa1efd9b35a2d99cf90b25bb01e59e00b440b6d0fe PASS
WITH_ZSTDIO=1 8349c97c7ced253fff32a9e706f29313f309cb63a270e4e39a4501426f2b95c6 PASS

The ZSTDIO KLD was loaded as ID 5 and was the only repo22 test KLD. It had the expected FreeBSD ZSTD_* references and no unresolved bcmp. The disabled KLD had neither ZSTD_* nor bcmp unresolved symbols.

Fixture Qualification

tests/prepare_error_fixtures.sh ran twice in independent empty host directories with erofs-utils 1.8.6. Both SHA256SUMS files were identical and self-verified. Every field mutation records its exact field/path and old/new value. Same-size corruption variants preserve provider length; short and empty providers record their intentionally different lengths.

The helper independently proved the 4096-byte-block checksum forms:

canonical: field 1028 cleared, CRC32C [1024,4096), initial 0xffffffff
kernel:    CRC32C [1032,4096), seed 0x5045b54a
valid control: stored=canonical=kernel=0xf7429681

Raw transcripts, build logs, KLDs, guest logs, fixture trees, and the overlay remain untracked under /work/build/repo22-manual-g2-20260809T060709Z*.

TC002

Result: PASS.

Commands: helper inspect; sha256; dynamic mdconfig; valid mount/cmp; direct negative mount; independent truss.

Hashes: valid eb97860671931c76a171d13caa70ddc2c9731c6cdef1e99b9a3deb580baf70ae; bad CRC 3f684e8cb03e3cb20a1920dccf23d9b7b19bc09d5745be04608e195c541ebf73. Both were 7622656 bytes. The corruption changed byte 1088 without recomputing CRC; calculated checksum became 0x202160ab while stored remained 0xf7429681. Valid data matched; bad direct mount rc was 1 and nmount returned errno 97. Cleanup: mount absent and exact md detached.

TC008

Result: PASS.

Commands: wc -c, sha256, dynamic mdconfig, direct mount, and truss for each attachable provider.

Hashes: bad magic d1bc3aec03c58dae1b74b54d895c0a72e5b3088f05907ab2f6a0cb8dc38a615f; 1023-byte provider 5724796860baa23469b3118eff2567c96a0b64b7dadaf99eafb7ba3c65b9aa56; empty provider e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855. Bad magic returned errno 22. The 1023-byte md attached and mount returned errno 6. The zero-byte provider was rejected by mdconfig with EINVAL. Cleanup: zero mounts and md units after all three subcases.

TC010

Result: PASS, not SHELVED.

Commands: copy qualified prefix, truncate -s 17592193667072, stat, dynamic mdconfig, diskinfo, mount, df -kT, df -iT, and cmp.

Prefix hash: d3ffadc6fc9e73f85a8a5973b4ac5ee2a2da57b4e8baeccd259fa4325a2146cf. Fields were blocks_hi=1, blocks_lo=1861, rootnid_8b=36, and total_blocks=4294969157. The sparse file allocated 15232 UFS blocks while GEOM reported all 17592193667072 bytes. df -k total and Used were exactly 17179876628; Avail was zero. Cleanup: unmounted, md detached, sparse provider removed. The former environmental issue is now RESOLVED.

TC015

Result: PASS.

Commands: evidence/hash/length checks; three dynamic md attachments; direct mount status followed by independent truss errno capture.

Hashes: bad block size b5c52c44ace6f693e39161102acde157efec2fce34eb4fef198681dfc7942b58; bad root 9cdd61eb99b2e7f45d2505b3b95d6427f8f636e117b5ffabed064a3f83997d55; unknown feature 95d19a490c38657a8c579a10f1f12088ab43c1819aa9b37ae86b841bb26a592a. All were 7622656 bytes with recomputed valid CRC. Direct mount rc was 1 for each; nmount returned 22, 97, and 45 respectively. Cleanup: zero mounts/md.

TC016

Result: PASS.

Commands: field evidence, sha256, wc -c, direct mount, and truss.

Hash: 04249f6b7d9b7322c171f1727408130d23cb0b83709aad7a4b77b39358a8dfe6. The 7622656-byte image changed only checksum 0xf7429681 -> 0xf7429680. Direct mount rc was 1 and nmount returned errno 97. Cleanup: no mount/md.

TC017

Result: PASS with both negative guard and positive dynamic coverage.

Commands: raw od at offsets 1038/1060/1136; small-prefix mount; sparse provider creation; diskinfo; positive mount; cmp; df -kT.

Hash: d3ffadc6fc9e73f85a8a5973b4ac5ee2a2da57b4e8baeccd259fa4325a2146cf. Raw values were high 1, low 1861, root 36. The short prefix returned errno 6. The qualified provider mounted and reported exactly 17179876628 one-KiB blocks. Cleanup: unmounted, detached, sparse provider removed.

TC018

Result: PASS with real I/O above 16 TiB.

Commands: sparse provider creation; high-offset dd; two raw read_probe calls; low-decoy and high-source cmp/hash; dynamic md mount and mounted hash.

Prefix hash: cfd86ed1e39528d958e32819282c7fd87191f80a25d9575078dad473f40563a8. The inode encoded startblk_hi=1, low 1347, combined block 4294968643, and physical offset 17592191561728. The original low payload at 5517312 was zeroed: its hash was 6a4875ddaceaa91fb3369f0f6d962f77442daf1b1d97733457d12bcabdf79441. Raw high and mounted hashes both matched source 25eb31e024bc60745d68a5f7318753951804c7858b576cb698a4260af4a334a3. Cleanup: unmounted, detached, sparse provider and probe outputs removed.

TC112

Result: PASS.

Commands: raw magic od, hash/length, direct mount, and truss.

Hash: d1bc3aec03c58dae1b74b54d895c0a72e5b3088f05907ab2f6a0cb8dc38a615f. Magic was 0x21444142; provider length remained 7622656. The canonical CRC was invalid as required after changing magic, while the unchanged production suffix checksum still matched 0xf7429681. Direct rc was 1 and nmount returned errno 22. Cleanup: no mount/md.

TC113

Result: PASS.

Commands: structured path inspection; mount/control cmp; direct and trussed read_probe expect-error ... 45; second control cmp.

Hash: 28d972c4065927326607fcd51dabff81cc88a28e2343f6056e55d04418172814. Resolved NID 52 at inode offset 1664 changed format 0x0001 -> 0x8001 with valid CRC and equal provider length. openat returned errno 45; unaffected data remained exact. Cleanup: clean unmount and md detach.

TC114

Result: PASS.

Commands: path inspection; mount/control cmp; direct and trussed read_probe expect-error ... 97; second control cmp.

Hash: 2afcb9dde4c8eaf30bb2541d00be36f726f5cf151d887e0d999803b3993285ed. NID 54 field offset 1744 changed start block 1349 -> 1861, equal to declared blocks, with valid CRC and equal media size. Target read returned errno 97; control remained exact. Cleanup: clean unmount and md detach.

TC115

Result: PASS.

Commands: raw field od, hash/length, direct mount, and truss.

Hash: a8d7d9cf0abcf34a5cd2366059c0294e08fdd20d02ed3b5b21005ddf78c69029. available_compr_algs at byte 1106 changed 0x0000 -> 0x8000; CRC was recomputed and media remained 716800 bytes. Direct rc was 1 and nmount returned errno 45. Cleanup: no mount/md.

TC116

Result: PASS with direct decompressor-path proof.

Commands: parsed dump.erofs -e evidence; failed userspace extraction record; mount/control cmp; FBT enumeration and count; direct/trussed read_probe.

Hash: f442785ea7cdbdc3f64b2ff89ea04942460cbdc5bea5615cbed237029edda8d8. The equal-length 716800-byte image changed 64 bytes at 4128, wholly inside the parsed first physical extent [4096,69632). Mount succeeded, excluding the media-size precheck. fbt:erofs-zstdio:z_erofs_decompress:entry counted one call for the target command, and read returned errno 5. Control remained exact. Cleanup: unmounted/detached; dtraceall and dependencies unloaded.

TC119

Result: PASS with the revised real integrity semantics.

Commands: path/field evidence; image/source hashes; mount; complete mounted hash; two one-byte read_probe calls; byte compare; control cmp.

Hash: 74b54f998481f9e55b30f2393ee780e3b46144157a54b4dc0fc0c044c160bb5a. The equal-length image flipped /plain.bin file offset 257 at provider byte 5525761 from 0x00 to 0x80; the valid superblock CRC remained unchanged. Source hash was 5647f05ec18958947d32874eeb788fa396a05d0bab7c1b71f112ceb7e9b31eee; mounted hash was e98bb2acaecb24ab86112478bc8cc1e3668c127b449fe2e664dc4804f9477d81. Reads succeeded, the target byte differed, and control matched. Cleanup: clean unmount and md detach.

Harness Notes

Four incomplete attempts were discarded and are not PASS evidence:

  1. TC002 repeated host Python inspection in a guest without Python and exited before md attachment.
  2. TC002 initially trusted truss wrapper status; the qualified run separated direct mount rc from syscall tracing because FreeBSD truss -o returned 0 around a failing mount.
  3. TC008 had a stray patch marker after its second subcase; trap cleanup ran and the complete three-subcase command was repeated.
  4. TC010 initially asserted the df Used column was free blocks; the qualified run used the correct f_bfree=0 interpretation and repeated all steps.

Final Cleanup

Per-TC cleanup ended with zero EROFS mounts and zero md providers. Global dmesg changed from 102 to 104 lines; both new lines were the expected md0: truncating fractional last sector by 511 bytes from TC008. New panic, fatal trap, page fault, general-protection fault, and double-fault count was zero. The exact test KLD unloaded successfully, leaving zero EROFS modules. The guest shut down normally and QEMU PID 285696 exited after 12 seconds. Port 9223 no longer has a VM process.

Issues

No kernel issue was found and no TC remains SHELVED. The former TC010 provider issue is retained as a resolved record in issues/TC010-48bit-statfs-large-provider.md.