A VFS driver for Able OS :D
Go to file
Egggggg e35bbc1aa2 hamburglar was here 2023-07-13 21:31:22 -04:00
holey-bytes@6a444bd29e Updata 2023-07-13 21:21:39 -04:00
src hamburglar was here 2023-07-13 21:31:22 -04:00
.gitignore Get started 2023-07-12 02:17:00 -04:00
.gitmodules Get started 2023-07-12 02:17:00 -04:00
LICENSE Initial commit 2023-07-12 05:35:06 +00:00
README.md hurb 2023-07-12 23:20:18 -04:00
run.sh gaming 2023-07-12 06:47:49 -04:00

README.md

AbleOS VFS

Public API

// reads the whole file
pub fn read(file: FileHandle) -> Vec<u8>

// reads up to 4096 bytes of the file
pub fn read_block(file: FileHandle) -> Vec<u8>

// overwrites the contents of the file
pub fn write(file: FileHandle, data: Vec<u8>)

// writes 4096 bytes to the file
pub fn write_block(file: FileHandle, data: Vec<u8>)

// opens a file for reading and writing
pub fn open(path: Path)

// closes the file
pub fn close(file: FileHandle)

// deletes a file
pub fn delete(path: Path)

Opening a file opens it using the corresponding filesystem. Multiple processes can open the same file in any mode, and the file only leaves the FS cache when no process has it open anymore.

Minimal FS API

trait FileIO {
    // reads the whole file
    pub fn read(path: Path) -> Vec<u8>

    // overwrites the file contents
    pub fn write(path: Path, data: Vec<u8>)

    // opens a file for reading and writing
    pub fn open(path: Path)

    // closes a file, removing it from the cache
    pub fn close(path: Path)

    // deletes a file
    pub fn delete(path: Path)
}

All filesystems must expose at least these functions in order to work with the VFS.

Structure

Mount Point

path_len: u64
path: [u8; <path_len>]
entries: u64
addr: u64

There is one of these for each mount point, stored sequentially within the root directory it belongs to. The list ends when it finds a path_len of 0

Inode

next: u64
flags: u8
size: u64
addr: u64
name_len: u64
name: [u8; <name_len>]

There can be many of these in a mount point, and they can be nested within eachother. If this is the last entry in the parent, next will refer to this inode, otherwise it will be the address of the next inode under the parent. addr is the address of the first member of this inode if it's a directory. size specifies the number of inodes within a directory, or the number of bytes in a file

Flags

7 6 5 4 3 2 1 0
NA NA NA NA NA NA dir mnt

dir is set if the inode is a directory, or unset if it's a file. mnt is set if the inode is a mount point

create_inode

  1. traverse the path until we reach the last element or a nonexistent directory
  2. if any path elements are mount points, request the filesystem belonging to it to create the item and if it succeeds create the inode