1.8 KiB
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.