diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-18 22:36:36 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-18 22:38:44 -0400 |
commit | 70dc7ad8924cf3e30e06b02698b1294fe9553538 (patch) | |
tree | a0ae1d423e958a37e2b548d5ed7913776e9b76cc | |
parent | ac93c35a842936a4f722b85ea3b4d3ff872123f9 (diff) |
kern: vfs: Add initial vfsops, and mount code
This commit introduces the groundwork for mountpoints, filesystems and
the VFS as a whole. OMAR is now initialized as its own filesystem by the
VFS
Signed-off-by: Ian Moffett <ian@osmora.org>
-rw-r--r-- | src/sys/include/os/vfs.h | 57 | ||||
-rw-r--r-- | src/sys/include/sys/mount.h | 137 | ||||
-rw-r--r-- | src/sys/os/os_init.c | 6 | ||||
-rw-r--r-- | src/sys/os/os_omar.c | 14 | ||||
-rw-r--r-- | src/sys/os/vfs_init.c | 79 | ||||
-rw-r--r-- | src/sys/os/vfs_mount.c | 119 |
6 files changed, 404 insertions, 8 deletions
diff --git a/src/sys/include/os/vfs.h b/src/sys/include/os/vfs.h new file mode 100644 index 0000000..ec7eb77 --- /dev/null +++ b/src/sys/include/os/vfs.h @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _OS_VFS_H_ +#define _OS_VFS_H_ 1 + +#include <sys/types.h> +#include <sys/mount.h> + +/* + * Initialize the virtual filesystem + * layer + * + * Returns zero on success, otherwise a less + * than zero value on failure. + */ +int vfs_init(void); + +/* + * Get a VFS file table entry by index. + * + * @index: Index to desired entry + * @resp: Result pointer is written here + * + * Returns zero on success and the entry being + * found, otherwise a less than zero failure if + * the entry has not been found. + */ +int vfs_by_index(uint16_t index, struct fs_info **resp); + +#endif /* !_OS_VFS_H_ */ diff --git a/src/sys/include/sys/mount.h b/src/sys/include/sys/mount.h new file mode 100644 index 0000000..c2beb8d --- /dev/null +++ b/src/sys/include/sys/mount.h @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _SYS_MOUNT_H_ +#define _SYS_MOUNT_H_ + +#include <sys/queue.h> +#include <sys/types.h> +#include <os/vnode.h> + +#if defined(_KERNEL) + +/* + * Number of bytes allowed in a filesystem + * name including the null termination + */ +#define FSNAME_MAX 16 + +/* + * Mount filesystem string names + */ +#define MOUNT_INITRD "initrd" /* Initial ramdisk */ + +/* Forward declarations */ +struct vfsops; +struct mount; + +/* Filesystem vfsops */ +extern struct vfsops g_omar_vfsops; + +/* + * Represents a mountpoint + */ +struct mount { + struct vnode *vp; + const char *name; + TAILQ_ENTRY(mount) link; + TAILQ_HEAD(, mount) buckets; +}; + +/* + * Represents a list of mountpoints + * + * @i: Initialized (set if initialized) + */ +struct mountlist { + uint8_t i : 1; + TAILQ_HEAD(, mount) list; +}; +/* + * Arguments for mount() + * + * @source: Specifies the source filesystem to mount + * @target: Specifies the location to mount source + * @fstype: File system type + * @data: Filesystem specific data + */ +struct mount_args { + const char *source; + const char *target; + const char *fstype; + const void *data; +}; + +/* + * Represents information about a filesystem + * + * @name: Filesystem type name + * @vfsops: VFS operations vector + * @refcount: Mount count of this type + */ +struct fs_info { + char name[FSNAME_MAX]; + const struct vfsops *vfsops; + int refcount; +}; + +/* + * VFS operations vector + * + * @init: Initialize the filesystem + * @mount: Mount a filesystem + */ +struct vfsops { + int(*init)(struct fs_info *fip); + int(*mount)(struct fs_info *fip, struct mount_args *margs); +}; + +/* + * Mount a specific filesystem + * + * @margs: Mount arguments + * @flags: Mount flags + * + * Returns zero on success, otherwise a less than zero + * failure upon failure. + */ +int mount(struct mount_args *margs, uint32_t flags); + +/* + * Initialize a mountpoint to a known state + * + * @mp: Pointer to mountlist [if NULL, use root] + * + * Returns zero on success, otherwise a less than + * zero value on failure. + */ +int mountlist_init(struct mountlist *mlp); + +#endif /* !_KERNEL */ +#endif /* !_SYS_MOUNT_H_ */ diff --git a/src/sys/os/os_init.c b/src/sys/os/os_init.c index 8480a3f..7628574 100644 --- a/src/sys/os/os_init.c +++ b/src/sys/os/os_init.c @@ -32,9 +32,11 @@ #include <sys/sysvar.h> #include <sys/syslog.h> #include <sys/proc.h> +#include <sys/mount.h> #include <sys/cpuvar.h> #include <os/sched.h> #include <os/elfload.h> +#include <os/vfs.h> #include <acpi/acpi.h> #include <io/cons/cons.h> #include <vm/vm.h> @@ -73,6 +75,10 @@ main(void) cpu_init(&g_bsp); bsp_ap_startup(); + /* Mount root */ + vfs_init(); + mountlist_init(NULL); + sched_init(); core = this_core(); proc_init(&g_rootproc, 0); diff --git a/src/sys/os/os_omar.c b/src/sys/os/os_omar.c index 63493b0..186ca57 100644 --- a/src/sys/os/os_omar.c +++ b/src/sys/os/os_omar.c @@ -32,6 +32,7 @@ #include <sys/errno.h> #include <sys/bootvars.h> #include <sys/cdefs.h> +#include <sys/mount.h> #include <sys/panic.h> #include <sys/syslog.h> #include <os/omar.h> @@ -143,7 +144,7 @@ initrd_get_file(const char *path, struct initrd_node *res) * Initialize the initrd */ static int -initrd_init(void) +initrd_init(struct fs_info *fip) { struct bootvars bootvars; struct bootvar_io *bvio = NULL; @@ -187,13 +188,6 @@ initrd_open(const char *path, char **res) return -ENOENT; } - if (__initrd_root == NULL) { - error = initrd_init(); - if (error < 0) { - panic("initrd: failed to setup initrd\n"); - } - } - error = initrd_get_file(path, &node); if (error < 0) { printf("initrd: failed to open '%s'\n", path); @@ -203,3 +197,7 @@ initrd_open(const char *path, char **res) *res = node.data; return node.size; } + +struct vfsops g_omar_vfsops = { + .init = initrd_init +}; diff --git a/src/sys/os/vfs_init.c b/src/sys/os/vfs_init.c new file mode 100644 index 0000000..b40b74d --- /dev/null +++ b/src/sys/os/vfs_init.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/errno.h> +#include <sys/param.h> +#include <sys/mount.h> +#include <os/vfs.h> + +/* + * The filesystem table + */ +static struct fs_info fstab[] = { + { MOUNT_INITRD, &g_omar_vfsops, 0 } +}; + +/* + * Get entry by index + */ +int +vfs_by_index(uint16_t index, struct fs_info **resp) +{ + if (resp == NULL) { + return -EINVAL; + } + + if (index >= NELEM(fstab)) { + return -ENOENT; + } + + *resp = &fstab[index]; + return 0; +} + +int +vfs_init(void) +{ + const struct vfsops *vfsops; + struct fs_info *fip; + size_t nelem = NELEM(fstab); + + /* + * Initialize each filesystem + */ + for (size_t i = 0; i < nelem; ++i) { + fip = &fstab[i]; + vfsops = fip->vfsops; + if (vfsops->init != NULL) { + vfsops->init(fip); + } + } + return 0; +} diff --git a/src/sys/os/vfs_mount.c b/src/sys/os/vfs_mount.c new file mode 100644 index 0000000..f1d7ffd --- /dev/null +++ b/src/sys/os/vfs_mount.c @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2025 Ian Marco Moffett and L5 engineers + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include <sys/types.h> +#include <sys/syslog.h> +#include <sys/errno.h> +#include <sys/cdefs.h> +#include <sys/mount.h> +#include <os/vfs.h> +#include <string.h> + +/* + * Represents the root mountlist, every other + * mountpoint is put here. + */ +static struct mountlist root; + +/* + * Mount a filesystem + */ +int +mount(struct mount_args *margs, uint32_t flags) +{ + const struct vfsops *vfsops; + struct fs_info *fip = NULL; + int error; + + if (margs == NULL) { + return -EINVAL; + } + + /* XXX: Unused as of now */ + (void)margs->source; + (void)margs->target; + (void)margs->data; + + /* XXX: Requires fstype for now */ + if (margs->fstype == NULL) { + return -ENOENT; + } + + /* + * Now we go through each entry of the filesystem + * table and if it matches the filesystem type, + * we're good. + */ + for (uint8_t i = 0;; ++i) { + error = vfs_by_index(i, &fip); + if (error != 0) { + return -ENOENT; + } + + if (strcmp(fip->name, margs->fstype) == 0) { + break; + } + } + + + /* Sanity check */ + if (__unlikely(fip == NULL)) { + printf("mount: got NULL filesystem info\n"); + return -ENOENT; + } + + vfsops = fip->vfsops; + if (__unlikely(vfsops->mount == NULL)) { + printf("mount: fs does not implement mount!\n"); + return -EIO; + } + + vfsops->mount(fip, margs); + return 0; +} + +/* + * Initialize the mountlist + */ +int +mountlist_init(struct mountlist *mlp) +{ + if (mlp == NULL) { + mlp = &root; + } + + /* Don't initialize twice */ + if (mlp->i) { + return -EPERM; + } + + TAILQ_INIT(&mlp->list); + mlp->i = 1; + return 0; +} |