# 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.
