diff --git a/src/development/design/filesystem.md b/src/development/design/filesystem.md index 3259573..ab3129e 100644 --- a/src/development/design/filesystem.md +++ b/src/development/design/filesystem.md @@ -24,19 +24,22 @@ It's identified simply by numerical order. const BOOT_SIZE: u64; // How large the BOOT partition will be const LABEL_SIZE: u64; // Number of characters that can be used in the partition label +let NUM_CHUNLKS: u64; // Number of chunks in a specific partition struct PartitionHeader { boot: bool, // Boot flag label: [char; LABEL_SIZE], // Human-readable label. Not UTF-8 though :/ - num_chunks: u64, // Chunks in this partition + index: [(u64, Uuid); NUM_CHUNKS], // Array of tuples mapping Actor UUID's to chunk indexes + // TODO: What if a Uuid is on multiple chunks? + num_chunks: NUM_CHUNKS, // Chunks in this partition } ``` ### Chunk Small pieces that each partition is split into. -Contains fixed-length metadata (checksum, extension flag, uuid) at the beginning, and then arbitrary data afterwards. +Contains fixed-length metadata (checksum, extension flag) at the beginning, and then arbitrary data afterwards. If the saved data exceeds past a single chunk, the `extends` flag is set. -Additionally, it has a **UUID** generated via [lolid](https://lib.rs/crates/lolid) to enable identifying a specific chunk. + ```rust const CHUNK_SIZE: u64; // Example static chunk size @@ -45,7 +48,6 @@ struct ChunkHeader { checksum: u64, extends: bool, encrypted: bool, - uuid: Uuid, modified: u64, // Timestamp of last modified } @@ -75,6 +77,7 @@ Basically, `part1_offset = BOOT_PARTITION_SIZE`, `part1_data_start = part1_offse ### Writing Writing uses a similar process. An *Actor* can request to write data. If it has proper capabilties, we serialize the data, allocate a free chunk[^free_chunk], and write to it. We *hash* the data first to generate a checksum, and set proper metadata if the data extends past the `CHUNK_SIZE`. +Then the `ParitionHeader` *index* is updated to contain the new chunk(s) being used. ### Permissions Again, whether actors can: @@ -116,6 +119,6 @@ struct PackedExecutable { [^encryption]: Specific details to be figured out later -[^find_chunk]: Currently via magic. I have no idea how to do this other than a simple search. Maybe generate an index, or use a **UUID**? +[^find_chunk]: The `PartitionHeader` has a tuple `(Uuid, u64)` which maps each `Actor` to a chunk number, allowing for easy finding of a specific chunk from an actor-provided `Uuid`. -[^free_chunk]: Again, no idea how. +[^free_chunk]: Because we know which chunks are used, we know which ones aren't.