summaryrefslogtreecommitdiffstats
path: root/scripts/mkdisk.sh
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-08-01 02:19:07 +0200
committersalmonik <salmonik@tuta.io>2026-08-01 02:19:07 +0200
commit92ed4f6668efccf6af73f45654405d333e6a318c (patch)
treebb9b651dc36edcc90ae0289d7c4223d983454440 /scripts/mkdisk.sh
parentscripts: automate the data-disk workflow (mkdisk / sendkeys / test-disk) (diff)
downloadrs-dos-92ed4f6668efccf6af73f45654405d333e6a318c.tar.gz
rs-dos-92ed4f6668efccf6af73f45654405d333e6a318c.zip
fat: mount every FAT32 volume under /disk/<UID>/, fix multi-entry LFN
- fat.rs: VOL: Option<Volume> → VOLS: Vec<Volume>; try_mount() returns a Volume per disk and init() mounts every valid FAT32 volume found. Volume UID = sanitized uppercase label + 8-hex volume serial (e.g. RSDOS-5BD1E55F): unique per format, stable across reboots, human-recognizable, machine-parseable (^[A-Z0-9_]+-[0-9A-F]{8}$); cloned volumes get a -N suffix. Public ops take a vol index and select it (select_vol also picks the backing AHCI disk), matching the ahci::select pattern - fs.rs: /disk is now a plain directory whose children are one Disk node per mounted volume, named by UID; DiskInfo carries vol - LFN fix: entries are stored last-first on disk — both the writer (head-entry first) and reader (append in disk order) were reversed and cancelled out for ≤13-char names; multi-entry names (>13 chars) read back mangled (e.g. 'from-kernel.txt' as 'xt'). Writer now places seq=1 closest to the SFN and seq=N|0x40 first; reader places chunks by sequence number and trims at the first NUL. Verified with a 25-char filename round trip: kernel ls/cat correct, mtools shows the full LFN, fsck clean on both volumes - test-disk.sh: test file renamed to disk-test-.txt (>13 chars, exercises multi-entry LFN); UID discovered from the boot log; QEMU stdio redirected to a log file + EXIT trap so an orphaned QEMU can never hang a piped caller (it previously did, 400s)
Diffstat (limited to 'scripts/mkdisk.sh')
-rwxr-xr-xscripts/mkdisk.sh8
1 files changed, 4 insertions, 4 deletions
diff --git a/scripts/mkdisk.sh b/scripts/mkdisk.sh
index f9a8c09..6bdd50c 100755
--- a/scripts/mkdisk.sh
+++ b/scripts/mkdisk.sh
@@ -55,10 +55,10 @@ fi
55 55
56# mkfs.fat sizes are 1024-byte blocks; accept M/G/K suffixes too. 56# mkfs.fat sizes are 1024-byte blocks; accept M/G/K suffixes too.
57case "$SIZE" in 57case "$SIZE" in
58*G) SIZE_BLOCKS=$(( ${SIZE%G} * 1024 * 1024 )) ;; 58*G) SIZE_BLOCKS=$((${SIZE%G} * 1024 * 1024)) ;;
59*M) SIZE_BLOCKS=$(( ${SIZE%M} * 1024 )) ;; 59*M) SIZE_BLOCKS=$((${SIZE%M} * 1024)) ;;
60*K) SIZE_BLOCKS=$(( ${SIZE%K} )) ;; 60*K) SIZE_BLOCKS=$((${SIZE%K})) ;;
61*) SIZE_BLOCKS="$SIZE" ;; 61*) SIZE_BLOCKS="$SIZE" ;;
62esac 62esac
63if [ -z "$SIZE_BLOCKS" ] || [ "$SIZE_BLOCKS" -le 0 ] 2>/dev/null; then 63if [ -z "$SIZE_BLOCKS" ] || [ "$SIZE_BLOCKS" -le 0 ] 2>/dev/null; then
64 echo "mkdisk: bad size '$SIZE' (use e.g. 64M or 65536)" >&2 64 echo "mkdisk: bad size '$SIZE' (use e.g. 64M or 65536)" >&2