270 lines
11 KiB
Markdown
270 lines
11 KiB
Markdown
# 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:
|
|
|
|
```text
|
|
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`.
|