test code v1
This commit is contained in:
@@ -0,0 +1,166 @@
|
||||
# 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:
|
||||
|
||||
```sh
|
||||
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:
|
||||
|
||||
```text
|
||||
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:
|
||||
|
||||
```text
|
||||
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:
|
||||
|
||||
```text
|
||||
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.
|
||||
Reference in New Issue
Block a user