140 lines
7.4 KiB
Markdown
140 lines
7.4 KiB
Markdown
# repo22 G6 Chunk and Multi-Device Manual Regression
|
|
|
|
Date: 2026-08-09
|
|
Executor: G6 manual agent
|
|
Source baseline: `6b33b4afb490be7d6fec70e499469c306a58435d`
|
|
Scope: `TC006`, `TC093`-`TC101`, `TC118` (11 exact IDs)
|
|
|
|
## Result
|
|
|
|
PASS. All 11 requested test cases passed. There are no KFAIL, SHELVED, or
|
|
ENV results, no duplicate IDs, and no omitted IDs.
|
|
|
|
| Status | Count |
|
|
| --- | ---: |
|
|
| PASS | 11 |
|
|
| KFAIL | 0 |
|
|
| SHELVED | 0 |
|
|
| ENV | 0 |
|
|
| Duplicate | 0 |
|
|
| Omitted | 0 |
|
|
|
|
No kernel source was changed. `git diff -- src` was empty after testing.
|
|
|
|
## Environment and build identity
|
|
|
|
- Worktree: dedicated sparse worktree and branch
|
|
`manual-g6-20260809T114414Z`, based directly on `xdm/main` at the source
|
|
commit above.
|
|
- VM: dedicated qcow2 overlay, QEMU TCG, 6144 MB, 4 vCPUs, SSH forward
|
|
`127.0.0.1:9226` only.
|
|
- Guest: FreeBSD `15.0-RELEASE-p8` amd64,
|
|
`releng/15.0-n281036-53054229dcb3`, OSREL `1500068`.
|
|
- Guest kernel SHA256:
|
|
`b9abf7b58f9dd4d87f14d2fbc306cf255e6eadc47b8ae885a230f65e28be4562`.
|
|
- Tracked build sys source: `REVISION=15.0`, `BRANCH=RELEASE-p9`, archived
|
|
from the same repository commit; archive SHA256
|
|
`66c457159b758ab1a5d298292b81bd29ab439ca4ab396091602e030da4721cb9`.
|
|
- Build configuration: native guest build,
|
|
`WITH_ZSTDIO=1 FREEBSD_SRC=/root/freebsd-src`.
|
|
- KLD SHA256:
|
|
`d5ff5ceef1ad76eb5b608d362b04f3bc40379e58a73d91ed3ae747c035d7b8af`.
|
|
- repo22 source archive SHA256:
|
|
`7562e230d165f0c0caa050684a9c1e2bd1bbb178e54a1d5273428435ae512455`.
|
|
|
|
The latest tracked sys source is p9 while the clean guest kernel/userland is
|
|
p8. Both use OSREL 1500068; the module built and loaded successfully. This
|
|
source/guest patch-level distinction is recorded rather than hidden.
|
|
|
|
## Fresh fixture qualification
|
|
|
|
`tests/g6_multidev_fixtures.py` generated every source, primary image, blob,
|
|
flatdev, and negative image from zero with erofs-utils 1.8.6. No old test image
|
|
or report was an input.
|
|
|
|
- Generator SHA256:
|
|
`18638aee056e05099b39477fa6ad4d678ab0a74a027cfb45146ae225ff35d950`.
|
|
- Final manifest SHA256:
|
|
`b636a52c7b3ec7f2343f07e2d389783c8383ec07d9d9468f7552e817891c3a81`.
|
|
- Final `SHA256SUMS` SHA256:
|
|
`ed81d63469b40f1aba691e54a08d39737c71e66d2ff4fef963a0101fa2ad9854`.
|
|
- Final fixture archive SHA256:
|
|
`28be1a5cdcebb163710433c9e7c30162c1170312c34d0b286f4143480881d62f`.
|
|
- Generated set: 62 artifacts, 17 parsed fixtures, 7 table/index negative
|
|
images, and 10 explicit mutation assertions.
|
|
- Reproducibility: two clean output directories had byte-identical
|
|
`manifest.json` and `SHA256SUMS`.
|
|
- Host fsck extraction qualified the mkfs split image, single-index image,
|
|
explicit two/three-slot images, table-at-zero, `uniaddr=0`, packed fragment,
|
|
and the original two-block LZ4 pcluster.
|
|
- Guest final `sha256 -c SHA256SUMS` returned 0.
|
|
|
|
During qualification, an initial maximum-48-bit negative used all ones. Field
|
|
review identified that value as the legal chunk hole sentinel. The generator
|
|
was corrected to the largest non-NULL address `0xfffffffffffe`, regenerated
|
|
twice, and reverified. Only the intended primary artifact changed; its final
|
|
SHA256 is
|
|
`d6f113cb5d2cb7da7f892632930eedf1c84fb494f5e1e4f0d2a852496ee92951`.
|
|
The corrected kernel read returned `EINTEGRITY`.
|
|
|
|
## Exact results
|
|
|
|
| Test ID | Status | Manual evidence |
|
|
| --- | --- | --- |
|
|
| TC006 | PASS | Direct mkfs split primary/blob; full and cross-32K range `cmp`; external `MDIOCDETACH` returned `ERR#16 EBUSY`. |
|
|
| TC093 | PASS | 8-byte device-ID-0 indexes with no table; full and cross-32K range `cmp` on the primary provider. |
|
|
| TC094 | PASS | Reversed slot option order; 1/2/1 full and per-index ranges; `uniaddr=0` with nonzero ID; swapped media `ERR#6 ENXIO`; real external 8192-byte LZ4 pcluster produced the complete 131072-byte source SHA256. |
|
|
| TC095 | PASS | First/middle/last/cross-index reads; zero-high 48-bit control and nonzero-high unified read; mapped ID 3 returned `read ERR#19 ENODEV`, unaffected file remained readable. |
|
|
| TC096 | PASS | Parsed normal, table-at-zero, `uniaddr=0`, and high 48-bit tables; `df -k` reported 916 KiB = 229 blocks x 4096; table outside primary returned `ERR#97 EINTEGRITY`. |
|
|
| TC097 | PASS | Six structural variants each returned `nmount ERR#97 EINTEGRITY`; after every failure md/KLD/consumer state was zero; slot-2 `ENOENT` after slot 1 open released slot 1 immediately. |
|
|
| TC098 | PASS | Packed NID 42 whole-file fragment; size 100000; full SHA/`cmp` and 8192-byte offset range passed. |
|
|
| TC099 | PASS | Direct primary+one-blob layout; `df -k` 900 KiB = 225 blocks x 4096; full/range compare; omitted blob option returned `ERR#6 ENXIO`. |
|
|
| TC100 | PASS | Four providers with option order 3/1/2; full read, 262144-byte range across both transitions, and three concurrent reads passed; missing/duplicate/short returned `ERR#6/22/6`. |
|
|
| TC101 | PASS | Explicit unified, nonzero-ID flatdev, device-ID-0 flatdev, and nonzero-high 48-bit reads matched source; gap, explicit/unified cross-slot chunk, explicit/flatdev two-block pcluster, and largest non-NULL 48-bit address all returned `read ERR#97 EINTEGRITY`. |
|
|
| TC118 | PASS | No options/one option/short returned `ERR#6`; duplicate/primary-as-slot returned `ERR#22`; normal detach `ERR#16`; forced orphan cold slot-2 read `ERR#6`; second mount `ERR#16`; primary and external missing paths preserved `ERR#2`. |
|
|
|
|
## External-data proof
|
|
|
|
The TC094 compressed primary is 8192 bytes and contains only metadata plus its
|
|
device table. The original pcluster blocks are absent. Its HEAD pblk is the
|
|
slot-1 unified address, and the 8192 compressed bytes exist only in the
|
|
external provider. FreeBSD returned the complete source SHA256
|
|
`8dd7830946e7154d9feaaa87df6d1d39e47d51da22a690c5469dc4f2955ea0f1`;
|
|
therefore this was an external compressed read, not table-only parsing.
|
|
|
|
TC101 also mounted generated combined flatdev providers with no `device.N`
|
|
options. Both nonzero device-ID mapping and device-ID-0 unified mapping
|
|
returned the same source SHA256 values as explicit providers. erofs-utils
|
|
1.8.6 does not qualify these two forms, so the FreeBSD full/range comparisons
|
|
are the runtime qualification.
|
|
|
|
## Errno summary
|
|
|
|
- `EBUSY` = 16: live md detach and second concurrent mount.
|
|
- `ENXIO` = 6: missing/short media and forced-orphan cold I/O.
|
|
- `ENODEV` = 19: mapped but undeclared chunk device ID 3.
|
|
- `EINVAL` = 22: duplicate provider and primary reused as an external slot.
|
|
- `ENOENT` = 2: nonexistent primary or external pathname.
|
|
- `EINTEGRITY` = 97: malformed tables and complete-extent range failures.
|
|
|
|
## Lifecycle and platform behavior
|
|
|
|
Every TC ended with zero EROFS mounts, zero md units, no loaded EROFS KLD, and
|
|
no matching GEOM consumer. TC097 repeated this after each individual malformed
|
|
table. TC118 forced md92 orphaning, observed cold `read ERR#6 ENXIO`, then
|
|
unmounted and released the remaining providers without panic or hang. The
|
|
final dmesg anomaly scan for panic, fatal trap, assertion, watchdog, or EROFS
|
|
errors was empty.
|
|
|
|
Linux device tables allow table offset zero and skip `uniaddr=0` during
|
|
device-ID-0 lookup while retaining explicit nonzero-ID selection. FreeBSD
|
|
matches those on-disk semantics but receives external providers through
|
|
explicit `device.<slot>` mount options and owns read-only GEOM consumers.
|
|
Consequently FreeBSD-specific `EBUSY` detach and forced-orphan `ENXIO` behavior
|
|
was tested directly rather than inferred from Linux loop devices.
|
|
|
|
## Issues
|
|
|
|
None. No kernel failure remained after correcting the fixture's reserved hole
|
|
sentinel, so no issue file and no source change were created.
|