3.2 KiB
Test Case: Primary Plus Three External Providers
Test ID: TC100-multidev-4devices
Category: Multi-Device
Priority: Critical
Objective
Verify a four-provider filesystem, option-order independence, cross-slot and concurrent reads, and missing, duplicate, and short slot cleanup.
Fixture qualification
The G6 verifier reports multi3 primary blocks 2 and slots (89,2), (90,91),
and (51,181). /cross-device.bin has three 131072-byte indexes with device
IDs 1,2,3. The generator host-fsck extracts all three providers and compares
the complete source tree. multi3-slot3-short.blob is exactly one block below
the declared slot-3 size.
Positive procedure
I=/root/repo22-g6/images
S=/root/repo22-g6/sources/chunk
mkdir -p /mnt/g6
kldload /root/repo22-g6/erofs.ko
mdconfig -a -t vnode -f "$I/multi3-primary.erofs" -u 90
mdconfig -a -t vnode -f "$I/multi3-slot1.blob" -u 91
mdconfig -a -t vnode -f "$I/multi3-slot2.blob" -u 92
mdconfig -a -t vnode -f "$I/multi3-slot3.blob" -u 93
mount -t erofs -o ro -o device.3=/dev/md93 -o device.1=/dev/md91 \
-o device.2=/dev/md92 /dev/md90 /mnt/g6
sha256 "$S/cross-device.bin" /mnt/g6/cross-device.bin
cmp "$S/cross-device.bin" /mnt/g6/cross-device.bin
dd if="$S/cross-device.bin" of=/tmp/tc100.cross.src bs=1 skip=126976 count=262144 2>/dev/null
dd if=/mnt/g6/cross-device.bin of=/tmp/tc100.cross.mnt bs=1 skip=126976 count=262144 2>/dev/null
cmp /tmp/tc100.cross.src /tmp/tc100.cross.mnt
sha256 /mnt/g6/cross-device.bin >/tmp/tc100.concurrent.1 &
sha256 /mnt/g6/indexed.bin >/tmp/tc100.concurrent.2 &
sha256 /mnt/g6/cold-slot2.bin >/tmp/tc100.concurrent.3 &
wait
cat /tmp/tc100.concurrent.1 /tmp/tc100.concurrent.2 /tmp/tc100.concurrent.3
The 262144-byte range starts before the slot-1/slot-2 transition and ends after the slot-2/slot-3 transition. All full, range, and concurrent reads must pass.
Unmount and detach 93, 92, 91, 90 before each negative step.
Negative mount cases
Run each case directly and capture nmount with truss:
- Omit
device.3: expectedENXIO. - Map both
device.1anddevice.2to md91: expectedEINVAL. - Attach
multi3-slot3-short.blobas md93: expectedENXIO.
For the short case, the exact command is:
mdconfig -a -t vnode -f "$I/multi3-primary.erofs" -u 90
mdconfig -a -t vnode -f "$I/multi3-slot1.blob" -u 91
mdconfig -a -t vnode -f "$I/multi3-slot2.blob" -u 92
mdconfig -a -t vnode -f "$I/multi3-slot3-short.blob" -u 93
truss -f -o /tmp/tc100-short.truss mount -t erofs -o ro \
-o device.1=/dev/md91 -o device.2=/dev/md92 -o device.3=/dev/md93 \
/dev/md90 /mnt/g6
tail -20 /tmp/tc100-short.truss
After each failure, detach all attached md units in descending order and verify no EROFS mount or matching GEOM consumer remains.
Cleanup and zero-state check
umount /mnt/g6 2>/dev/null || true
mdconfig -d -u 93 2>/dev/null || true
mdconfig -d -u 92 2>/dev/null || true
mdconfig -d -u 91 2>/dev/null || true
mdconfig -d -u 90 2>/dev/null || true
kldunload erofs
rm -f /tmp/tc100.cross.* /tmp/tc100.concurrent.*
mount -p | awk '$3 == "erofs" { print }'
mdconfig -l
kldstat -n erofs 2>/dev/null || true
sysctl -n kern.geom.conftxt | grep -E 'md9[0-3]|erofs' || true
All four final outputs must be empty, with no panic, trap, or hang.