114 lines
3.8 KiB
Markdown
114 lines
3.8 KiB
Markdown
# Test Case: Chunk Index Decode and Mapped Device ID
|
|
|
|
**Test ID**: TC095-chunk-index-read
|
|
**Category**: Chunk-Based
|
|
**Priority**: High
|
|
|
|
## Objective
|
|
|
|
Verify first/middle/last 8-byte indexes, zero-high and nonzero-high 48-bit
|
|
decode, the rounded device-ID mask, and `ENODEV` for mapped ID 3.
|
|
|
|
## Field qualification
|
|
|
|
After G6 generation, print the fields on the host that will be exercised:
|
|
|
|
```sh
|
|
OUTPUT=/path/to/generated-fixtures
|
|
python3 -B - "$OUTPUT/manifest.json" <<'PY'
|
|
import json, sys
|
|
m = json.load(open(sys.argv[1]))
|
|
for fixture in ('multi2', 'multi2-unified48', 'bad-mapped-device3'):
|
|
c = m['fixtures'].get(fixture, {}).get('image', {}).get('chunks', {})
|
|
if '/indexed.bin' in c:
|
|
print(fixture, c['/indexed.bin'])
|
|
print(m['mutations'])
|
|
PY
|
|
```
|
|
|
|
The normal `indexed.bin` has five 32768-byte indexes with IDs `1,2,1,2,1`.
|
|
The 48-bit control has format bit `0x40` with zero high words; its unified
|
|
target also contains a real nonzero high word. The negative second index is
|
|
exactly device ID 3 while `extra_devices=2`, whose mask is 3.
|
|
|
|
## Normal and cross-index reads
|
|
|
|
```sh
|
|
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/multi2-primary.erofs" -u 90
|
|
mdconfig -a -t vnode -f "$I/multi2-slot1.blob" -u 91
|
|
mdconfig -a -t vnode -f "$I/multi2-slot2.blob" -u 92
|
|
mount -t erofs -o ro -o device.1=/dev/md91 -o device.2=/dev/md92 \
|
|
/dev/md90 /mnt/g6
|
|
cmp "$S/indexed.bin" /mnt/g6/indexed.bin
|
|
dd if="$S/indexed.bin" of=/tmp/tc095.first.src bs=1 skip=0 count=4096 2>/dev/null
|
|
dd if=/mnt/g6/indexed.bin of=/tmp/tc095.first.mnt bs=1 skip=0 count=4096 2>/dev/null
|
|
cmp /tmp/tc095.first.src /tmp/tc095.first.mnt
|
|
dd if="$S/indexed.bin" of=/tmp/tc095.middle.src bs=1 skip=65536 count=4096 2>/dev/null
|
|
dd if=/mnt/g6/indexed.bin of=/tmp/tc095.middle.mnt bs=1 skip=65536 count=4096 2>/dev/null
|
|
cmp /tmp/tc095.middle.src /tmp/tc095.middle.mnt
|
|
dd if="$S/indexed.bin" of=/tmp/tc095.last.src bs=1 skip=131072 count=4096 2>/dev/null
|
|
dd if=/mnt/g6/indexed.bin of=/tmp/tc095.last.mnt bs=1 skip=131072 count=4096 2>/dev/null
|
|
cmp /tmp/tc095.last.src /tmp/tc095.last.mnt
|
|
dd if="$S/indexed.bin" of=/tmp/tc095.cross.src bs=1 skip=28672 count=8192 2>/dev/null
|
|
dd if=/mnt/g6/indexed.bin of=/tmp/tc095.cross.mnt bs=1 skip=28672 count=8192 2>/dev/null
|
|
cmp /tmp/tc095.cross.src /tmp/tc095.cross.mnt
|
|
umount /mnt/g6
|
|
mdconfig -d -u 92
|
|
mdconfig -d -u 91
|
|
mdconfig -d -u 90
|
|
```
|
|
|
|
## 48-bit indexes and high unified address
|
|
|
|
```sh
|
|
mdconfig -a -t vnode -f "$I/multi2-unified48-primary.erofs" -u 90
|
|
mdconfig -a -t vnode -f "$I/multi2-unified48-slot1.blob" -u 91
|
|
mdconfig -a -t vnode -f "$I/multi2-unified48-slot2.blob" -u 92
|
|
mount -t erofs -o ro -o device.2=/dev/md92 -o device.1=/dev/md91 \
|
|
/dev/md90 /mnt/g6
|
|
cmp "$S/indexed.bin" /mnt/g6/indexed.bin
|
|
cmp "$S/unified-address.bin" /mnt/g6/unified-address.bin
|
|
umount /mnt/g6
|
|
mdconfig -d -u 92
|
|
mdconfig -d -u 91
|
|
mdconfig -d -u 90
|
|
```
|
|
|
|
## Mapped undeclared ID
|
|
|
|
```sh
|
|
mdconfig -a -t vnode -f "$I/bad-mapped-device3.erofs" -u 90
|
|
mdconfig -a -t vnode -f "$I/multi2-slot1.blob" -u 91
|
|
mdconfig -a -t vnode -f "$I/multi2-slot2.blob" -u 92
|
|
mount -t erofs -o ro -o device.1=/dev/md91 -o device.2=/dev/md92 \
|
|
/dev/md90 /mnt/g6
|
|
truss -f -o /tmp/tc095-enodev.truss dd if=/mnt/g6/indexed.bin \
|
|
of=/dev/null bs=1 skip=32768 count=4096
|
|
tail -20 /tmp/tc095-enodev.truss
|
|
cmp "$S/tc006.bin" /mnt/g6/tc006.bin
|
|
```
|
|
|
|
The affected read must return exactly `ENODEV`; the mount and unaffected file
|
|
remain usable.
|
|
|
|
## Cleanup and zero-state check
|
|
|
|
```sh
|
|
umount /mnt/g6
|
|
mdconfig -d -u 92
|
|
mdconfig -d -u 91
|
|
mdconfig -d -u 90
|
|
kldunload erofs
|
|
rm -f /tmp/tc095.*.src /tmp/tc095.*.mnt
|
|
mount -p | awk '$3 == "erofs" { print }'
|
|
mdconfig -l
|
|
kldstat -n erofs 2>/dev/null || true
|
|
sysctl -n kern.geom.conftxt | grep -E 'md9[0-2]|erofs' || true
|
|
```
|
|
|
|
All four final outputs must be empty.
|