exfat: the in-VM mount + mutation drill (S4 step 8)
exfat-volume attaches a bare exFAT data device (serial e0fa0001, from
make-exfat-image.py) beside the FAT boot volume. The volume manager
content-routes it to the exFAT service — not fat — which mounts it at
its id-path /volumes/exfat-e0fa0001; the exfat-test client then reads the
seeded HELLO.TXT and mutates through the mount (mkdir/write/rename/read/
remove). The second engine reusing the shared harness is now proven end
to end, on a real device, in QEMU.
The drill caught what host tests could not: the exfat service was denied
openEndpoint("volume-manager") — it had no protocol.csv grant — so its
hello never reached the manager and its volume never mounted (a silent
spin, no fault). Added the grant mirroring fat's. A new exfatVolumeTest
kernel case boots the tree and spawns the fixture; the run harness grows
an exfat data-volume flavor. Fails against pre-S4 (no exfat binary, csv
row, VBR recognizer, or grant).
This commit is contained in:
@@ -857,6 +857,23 @@ CASES = [
|
||||
r"(?=.*fat: mounted /volumes/fat-da7a0001)"
|
||||
r"(?=.*fat: mounted /volumes/fat-da7a0002)",
|
||||
"fail": r"DANOS-TEST-RESULT: FAIL"},
|
||||
# S4 second engine: a bare exFAT data device (serial e0fa0001) attached beside
|
||||
# the FAT boot volume. The volume manager content-routes it to the exFAT
|
||||
# service (not fat), which mounts it at its id-path /volumes/exfat-e0fa0001;
|
||||
# the exfat-test client then reads the seeded HELLO.TXT and mutates through the
|
||||
# mount (mkdir/write/rename/read/remove). Proves the second engine reuses the
|
||||
# shared harness end to end. Fails against pre-S4 (no exfat binary, csv row, or
|
||||
# VBR recognizer — the device would go to fat, which rejects the exFAT VBR).
|
||||
{"name": "exfat-volume",
|
||||
"build_case": "exfat-volume",
|
||||
"smp": 4,
|
||||
"timeout": 150,
|
||||
"data_volume": {"exfat": True, "serial": "E0FA0001", "size_mib": 48},
|
||||
"expect": r"(?s)(?=.*volume 0x0*e0fa0001 -> /system/services/exfat )"
|
||||
r"(?=.*exfat: mounted /volumes/exfat-e0fa0001)"
|
||||
r"(?=.*exfat-test: read HELLO.TXT ok)"
|
||||
r"(?=.*exfat-test: ok)",
|
||||
"fail": r"exfat-test: FAILED|DANOS-TEST-RESULT: FAIL"},
|
||||
# Phase 2b: mkdir/unlink through the mount. Reuses the fat-mount build — the
|
||||
# fat-test client, after listing, makes a directory, writes+reads a file inside
|
||||
# it, then removes the file, exercising the whole VFS -> fat mutation path.
|
||||
@@ -1477,6 +1494,10 @@ def run_case(arch, case):
|
||||
gen = [sys.executable, os.path.join(REPO, "tools", "make-partitioned-image.py"), data_img]
|
||||
for part in dv["partitions"]:
|
||||
gen += [part["serial"], str(part.get("size_mib", 40))]
|
||||
elif dv.get("exfat"):
|
||||
# One device, a bare exFAT volume — the second engine's medium.
|
||||
gen = [sys.executable, os.path.join(REPO, "tools", "make-exfat-image.py"),
|
||||
"--serial", dv["serial"], data_img, str(dv.get("size_mib", 48))]
|
||||
else:
|
||||
# One device, one bare FAT volume.
|
||||
gen = [sys.executable, os.path.join(REPO, "tools", "make-fat-image.py"),
|
||||
|
||||
Reference in New Issue
Block a user