aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2023-11-18 08:55:48 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2023-12-05 00:44:13 +0000
commit62ed7f98a2db5018a5336398df37f60cb157ec6d (patch)
tree9f9ad6463c03913e34ea3dc9453ba283dac960f1
parentca50304272a673f4bacce824261dfa4999182c1c (diff)
downloadsrc-62ed7f98a2db5018a5336398df37f60cb157ec6d.tar.gz
src-62ed7f98a2db5018a5336398df37f60cb157ec6d.zip
VFS: add VOP_GETLOWVNODE()
(cherry picked from commit 4cbe4c48a7e574ec1bb919351d7a57d252b00b62)
-rw-r--r--sys/fs/nullfs/null_vnops.c18
-rw-r--r--sys/kern/vfs_default.c10
-rw-r--r--sys/kern/vnode_if.src7
3 files changed, 35 insertions, 0 deletions
diff --git a/sys/fs/nullfs/null_vnops.c b/sys/fs/nullfs/null_vnops.c
index 9898bf010a21..7db7a352f176 100644
--- a/sys/fs/nullfs/null_vnops.c
+++ b/sys/fs/nullfs/null_vnops.c
@@ -1131,6 +1131,23 @@ null_vput_pair(struct vop_vput_pair_args *ap)
return (res);
}
+static int
+null_getlowvnode(struct vop_getlowvnode_args *ap)
+{
+ struct vnode *vp, *vpl;
+
+ vp = ap->a_vp;
+ if (vn_lock(vp, LK_SHARED) != 0)
+ return (EBADF);
+
+ vpl = NULLVPTOLOWERVP(vp);
+ vhold(vpl);
+ VOP_UNLOCK(vp);
+ VOP_GETLOWVNODE(vpl, ap->a_vplp, ap->a_flags);
+ vdrop(vpl);
+ return (0);
+}
+
/*
* Global vfs data structures
*/
@@ -1143,6 +1160,7 @@ struct vop_vector null_vnodeops = {
.vop_bmap = VOP_EOPNOTSUPP,
.vop_stat = null_stat,
.vop_getattr = null_getattr,
+ .vop_getlowvnode = null_getlowvnode,
.vop_getwritemount = null_getwritemount,
.vop_inactive = null_inactive,
.vop_need_inactive = null_need_inactive,
diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 966f0c7ab497..c378d05e449f 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -85,6 +85,7 @@ static int vop_stdgetpages_async(struct vop_getpages_async_args *ap);
static int vop_stdread_pgcache(struct vop_read_pgcache_args *ap);
static int vop_stdstat(struct vop_stat_args *ap);
static int vop_stdvput_pair(struct vop_vput_pair_args *ap);
+static int vop_stdgetlowvnode(struct vop_getlowvnode_args *ap);
/*
* This vnode table stores what we want to do if the filesystem doesn't
@@ -114,6 +115,7 @@ struct vop_vector default_vnodeops = {
.vop_fsync = VOP_NULL,
.vop_stat = vop_stdstat,
.vop_fdatasync = vop_stdfdatasync,
+ .vop_getlowvnode = vop_stdgetlowvnode,
.vop_getpages = vop_stdgetpages,
.vop_getpages_async = vop_stdgetpages_async,
.vop_getwritemount = vop_stdgetwritemount,
@@ -1463,3 +1465,11 @@ vop_stdvput_pair(struct vop_vput_pair_args *ap)
vput(vp);
return (0);
}
+
+static int
+vop_stdgetlowvnode(struct vop_getlowvnode_args *ap)
+{
+ vref(ap->a_vp);
+ *ap->a_vplp = ap->a_vp;
+ return (0);
+}
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 8f9a8503f22a..dd4a3a738089 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -472,6 +472,13 @@ vop_getwritemount {
OUT struct mount **mpp;
};
+%% getwritevnode vp = = =
+
+vop_getlowvnode {
+ IN struct vnode *vp;
+ OUT struct vnode **vplp;
+ IN int flags;
+};
%% print vp - - -