fat: long-file-name creation, fast cluster allocation, makePath
createFile/createDirectory now build long-name chains: a mangled STEM~N 8.3 alias (collision-checked per directory), the standard rotate-add checksum, and 13-UCS-2-per-entry pieces written last-logical-first into a contiguous free-slot run (found sector-wise, growing the directory as today). Write order is chain first, 8.3 entry last, so an interrupted create leaves only skippable orphans. Uppercase-compliant 8.3 names keep the bare-entry fast path; lowercase names now get a chain so their exact case survives — matching tools/make-fat-image.py. rename stays 8.3-only (documented; nothing needs more yet). allocateCluster drops its from-cluster-2 rescan (measured ~1 s/cluster on a part-full volume, a 37 s shutdown flush in the lost M19 build): a next-free hint (rewound by frees) plus a FAT-sector LBA cache turn the scan into one device read per FAT sector. mkdir now refuses an existing name (no duplicate entries), and runtime.fs gains makePath (mkdir -p) for the logger's nested per-boot directories. Engine tests cover the log-directory shape, ~N collisions, chain unlink/reuse, the 8.3 fast path, and the checksum.
This commit is contained in:
@@ -203,7 +203,9 @@ fn onMessage(message: []const u8, out: []u8, sender: u32, capability: ?runtime.i
|
||||
return writeReply(out, .{ .status = 0 }, &.{});
|
||||
},
|
||||
.mkdir => {
|
||||
const split = splitParent(payload[0..@min(payload.len, request.len)]);
|
||||
const path = payload[0..@min(payload.len, request.len)];
|
||||
if (filesystem.resolve(path) != null) return fail(out); // already exists — no duplicate entries
|
||||
const split = splitParent(path);
|
||||
const parent = filesystem.resolve(split.parent) orelse return fail(out);
|
||||
if (filesystem.createDirectory(parent, split.leaf) == null) return fail(out);
|
||||
return writeReply(out, .{ .status = 0 }, &.{});
|
||||
|
||||
Reference in New Issue
Block a user