From 2df3bcd48260e3038cc3a84d244e3814c8debc0e Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sun, 21 Sep 2025 20:11:58 -0400 Subject: kern: vfs: Add support for image-like paths Typically filesystems are tree-like, however certain filesystems in the form of images have fixed paths baked into them. This optimizes handling so there isn't a need to unpack it into a rootfs/tmpfs Signed-off-by: Ian Moffett --- src/sys/os/vfs_mount.c | 2 +- src/sys/os/vfs_namei.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) (limited to 'src/sys/os') diff --git a/src/sys/os/vfs_mount.c b/src/sys/os/vfs_mount.c index 8f09096..034b324 100644 --- a/src/sys/os/vfs_mount.c +++ b/src/sys/os/vfs_mount.c @@ -228,7 +228,7 @@ mount(struct mount_args *margs, uint32_t flags) return error; } - /* The filesystem should give us its vnode */ + mpp->fs = fip; mpp->vp = margs->vp_res; return 0; } diff --git a/src/sys/os/vfs_namei.c b/src/sys/os/vfs_namei.c index 8727965..18d35f2 100644 --- a/src/sys/os/vfs_namei.c +++ b/src/sys/os/vfs_namei.c @@ -43,6 +43,10 @@ int namei(struct nameidata *ndp) { struct mount *mp = NULL; + struct vnode *vp; + struct vop *vops; + struct vop_lookup_args lookup; + struct fs_info *fip; char namebuf[NAME_MAX]; const char *p, *pcur; size_t len, i = 0; @@ -63,6 +67,31 @@ namei(struct nameidata *ndp) return error; } + vp = mp->vp; + fip = mp->fs; + + if ((vops = vp->vops) == NULL) { + printf("namei: failed to get vops\n"); + return -EIO; + } + + /* We need vops->lookup() */ + if (vops->lookup == NULL) { + printf("namei: vops does not have lookup op\n"); + return -EIO; + } + + /* + * If this is an image we are looking up, then throw + * a path right at it. + */ + if (ISSET(fip->attr, FS_ATTR_IMAGE)) { + lookup.name = ndp->path; + lookup.dirvp = mp->vp; + lookup.vpp = &vp; + return vops->lookup(&lookup); + } + printf("namei: f: %s\n", ndp->path); printf("namei: d: /\n", ndp->path); -- cgit v1.2.3