diff options
author | Ian Moffett <ian@osmora.org> | 2025-09-21 20:11:58 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-09-21 20:11:58 -0400 |
commit | 2df3bcd48260e3038cc3a84d244e3814c8debc0e (patch) | |
tree | 51df25367ff90af32b4367d06280132bc8989828 /src/sys/os | |
parent | 9116f57c6220e6d4de9e8ecc5c10c7c3003387cc (diff) |
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 <ian@osmora.org>
Diffstat (limited to 'src/sys/os')
-rw-r--r-- | src/sys/os/vfs_mount.c | 2 | ||||
-rw-r--r-- | src/sys/os/vfs_namei.c | 29 |
2 files changed, 30 insertions, 1 deletions
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); |