rust-kernel
Rustbelt: a hobby x86_64 kernel written in Rust
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | //! VFS (virtual file system): the layer every concrete file system plugs into.
//!
//! Modelled (very loosely) on Linux:
//!
//! * [`Inode`] -- one file or directory *inside some file system*. Knows how to
//! read/write its bytes at an offset and (for directories) look up / create
//! children. A FAT32, ext2, exFAT or btrfs driver implements this trait.
//! * [`FileSystem`] -- a mounted instance (e.g. "the FAT32 volume on disk 0");
//! gives you its root inode.
//! * the **mount table** -- which file system is attached at which path ("/",
//! "/tmp", ...). `lookup("/tmp/x")` finds the longest matching mount point
//! and walks the rest of the path from that file system's root.
//! * [`file::File`] -- an *open* file (what a file descriptor points to): an
//! inode plus a current offset, or a device like the console. The per-process
//! fd table holds `Arc<dyn File>`s, so syscalls don't care what's behind it.
//!
//! Today there is one implementation, [`ramfs`] (everything in RAM). Later: a
//! block device layer (virtio-blk / ATA PIO), then FAT32, ext2, exFAT and
//! btrfs (read-only first) as further `FileSystem`s.
use crateErrno;
use ;
use Mutex;
/// A file or directory inside a file system.
///
/// Default method bodies return the error a "wrong kind" of inode would give
/// (e.g. `lookup` on a file -> ENOTDIR), so implementations only override
/// what makes sense for them.
/// A mounted file system.
/// The mount table. Lookups take the lock only briefly (never while doing
/// I/O), so it's fine as a spinlock. Not used from interrupt handlers.
static MOUNTS: = new;
/// Attach `fs` at `path` (must be absolute, like "/" or "/tmp").
/// (mount path, fs type) of every mount, for printing.
/// Does mount point `mount` contain `path`? ("/tmp" contains "/tmp/x" but
/// not "/tmpfoo"; "/" contains everything.)
/// Resolve an absolute path to an inode.
/// Create a file at `path` (its parent directory must exist).
/// Boot-time file system setup: a ramfs as "/", with a few files, and a
/// second, empty ramfs mounted at "/tmp" (to exercise the mount table).
|