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.
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