7.4 KiB
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 onxdm/mainat the source commit above. - VM: dedicated qcow2 overlay, QEMU TCG, 6144 MB, 4 vCPUs, SSH forward
127.0.0.1:9226only. - Guest: FreeBSD
15.0-RELEASE-p8amd64,releng/15.0-n281036-53054229dcb3, OSREL1500068. - Guest kernel SHA256:
b9abf7b58f9dd4d87f14d2fbc306cf255e6eadc47b8ae885a230f65e28be4562. - Tracked build sys source:
REVISION=15.0,BRANCH=RELEASE-p9, archived from the same repository commit; archive SHA25666c457159b758ab1a5d298292b81bd29ab439ca4ab396091602e030da4721cb9. - 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
SHA256SUMSSHA256: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.jsonandSHA256SUMS. - 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 SHA256SUMSreturned 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.