diff options
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); |