test code v1
This commit is contained in:
@@ -0,0 +1,113 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user