34 lines
1.8 KiB
Markdown
34 lines
1.8 KiB
Markdown
# repo22 partial-reference fix manual report
|
|
|
|
- Date: 2026-08-08 UTC
|
|
- Source baseline: `616d23e59b2bc16d9735ca5ad07502a21153bc0a`
|
|
- FreeBSD guest: 15.0-RELEASE-p8 amd64, QEMU TCG
|
|
- Module SHA256: `0270671fd73c4ee604294a5f94863f1fc8cc9a63083a4c83f89887891f06f1b2`
|
|
- Scope: partial-reference output range and LZ4 regression only
|
|
|
|
## Root cause and fix
|
|
|
|
`zmap.c` correctly marked the reused extent with `EROFS_MAP_PARTIAL_REF`, but
|
|
`zdata.c` always decompressed the complete mapped logical length and passed
|
|
`partial=false`. Linux keeps such pclusters in partial-decoding mode and sets
|
|
the decompressor output size to the highest byte needed by the current read.
|
|
|
|
The synchronous FreeBSD path now preserves that behavior. For a partial
|
|
reference, it decodes only through `mapoff + want`, passes `partial=true`, and
|
|
copies exactly the requested `want` bytes beginning at `mapoff`. Non-partial
|
|
extents still require full logical output and retain strict LZ4 trailing-data
|
|
validation.
|
|
|
|
## Results
|
|
|
|
| Test | Mount | Full SHA256 | Boundary read | Result |
|
|
|---|---:|---|---|---|
|
|
| Partial reference `/b.dat` | PASS | `61b17076c2dfae88da7912d00df534b894cf6d27178863c6d8e91f8617ebb91e` matches | offset 641020, 128 bytes: `941b6e3cb9a7384428d93ca248eb9630782538e04caba30dbfbe31baacca8f60` matches | **PASS** |
|
|
| Legacy full index `/shape.dat` | PASS | `370eb0a8df86868c4842ca535ed64670f0277ea2ed47a703f089bbb13ee4ac52` matches | smoke only | **PASS** |
|
|
| Compact index `/shape.dat` | PASS | `370eb0a8df86868c4842ca535ed64670f0277ea2ed47a703f089bbb13ee4ac52` matches | smoke only | **PASS** |
|
|
|
|
`./build.sh`, `kldload`, and exact-name `kldunload` passed. The isolated dmesg
|
|
delta was empty, with no panic, trap, integrity diagnostic, or decompression
|
|
error. Build objects, kernel module output, images, and VM overlays were not
|
|
staged for commit.
|