From 794b3671ed636c4fb8a74e1cf3a636272d4fa3d9 Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Fri, 21 Nov 2025 13:48:31 -0500 Subject: kern: vfs: Add vnode lookup VOP Signed-off-by: Ian Moffett --- sys/inc/kern/vnode.h | 23 +++++++++++++++++++++++ sys/kern/vfs_subr.c | 24 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+) (limited to 'sys') diff --git a/sys/inc/kern/vnode.h b/sys/inc/kern/vnode.h index 37b7127..407811a 100644 --- a/sys/inc/kern/vnode.h +++ b/sys/inc/kern/vnode.h @@ -53,12 +53,24 @@ struct vop_buf_args { size_t len; }; +/* + * Arguments for lookup() vop + * + * @component: Path component to lookup + * @vp_res: Resulting vnode pointer + */ +struct vop_lookup_args { + const char *component; + struct vnode **vp_res; +}; + /* * Operations that can be performed on a vnode */ struct vops { ssize_t(*read)(struct vop_buf_args *args); ssize_t(*write)(struct vop_buf_args *args); + int(*lookup)(struct vop_lookup_args *args); void(*reclaim)(struct vnode *vp); }; @@ -90,6 +102,17 @@ struct vnode { */ ssize_t vnode_read(struct vnode *vp, void *buf, size_t size, off_t off); +/* + * Lookup a sub-node within a vnode by name + * + * @vp: Vnode to scan within + * @name: Name to lookup + * @res: Result pointer is written here + * + * Returns zero on success + */ +int vnode_lookup(struct vnode *vp, const char *name, struct vnode **res); + /* * Write data into a file described by a vnode * diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 2c08f36..c8e3170 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -139,3 +139,27 @@ vnode_write(struct vnode *vp, const void *buf, size_t size, off_t off) args.offset = off; return vops->write(&args); } + +int +vnode_lookup(struct vnode *vp, const char *name, struct vnode **res) +{ + struct vop_lookup_args args; + struct vops *vops; + + if (vp == NULL || name == NULL) { + return -EINVAL; + } + + if (res == NULL) { + return -EINVAL; + } + + vops = &vp->vops; + if (vops->lookup == NULL) { + return -ENOTSUP; + } + + args.component = name; + args.vp_res = res; + return vops->lookup(&args); +} -- cgit v1.2.3