git: 49c117c19376 - main - Add VOP_VPUT_PAIR() with trivial default implementation.

Konstantin Belousov kib at FreeBSD.org
Fri Feb 12 01:07:14 UTC 2021


The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=49c117c193768b10f5fb1c5e4d6b88300cfbcdd6

commit 49c117c193768b10f5fb1c5e4d6b88300cfbcdd6
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-01-28 22:30:53 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-02-12 01:02:20 +0000

    Add VOP_VPUT_PAIR() with trivial default implementation.
    
    The VOP is intended to be used in situations where VFS has two
    referenced locked vnodes, typically a directory vnode dvp and a vnode
    vp that is linked from the directory, and at least dvp is vput(9)ed.
    The child vnode can be also vput-ed, but optionally left referenced and
    locked.
    
    There, at least UFS may need to do some actions with dvp which cannot be
    done while vp is also locked, so its lock might be dropped temporary.
    For instance, in some cases UFS needs to sync dvp to avoid filesystem
    state that is currently not handled by either kernel nor fsck. Having
    such VOP provides the neccessary context for filesystem which can do
    correct locking and handle potential reclamation of vp after relock.
    
    Trivial implementation does vput(dvp) and optionally vput(vp).
    
    Reviewed by:    chs, mckusick
    Tested by:      pho
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
---
 sys/kern/vfs_default.c | 15 +++++++++++++++
 sys/kern/vnode_if.src  |  9 +++++++++
 2 files changed, 24 insertions(+)

diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c
index 4b96d9522ce3..382fbb2d9ace 100644
--- a/sys/kern/vfs_default.c
+++ b/sys/kern/vfs_default.c
@@ -92,6 +92,7 @@ static int vop_stdfdatasync(struct vop_fdatasync_args *ap);
 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);
 
 /*
  * This vnode table stores what we want to do if the filesystem doesn't
@@ -151,6 +152,7 @@ struct vop_vector default_vnodeops = {
 	.vop_unset_text =	vop_stdunset_text,
 	.vop_add_writecount =	vop_stdadd_writecount,
 	.vop_copy_file_range =	vop_stdcopy_file_range,
+	.vop_vput_pair =	vop_stdvput_pair,
 };
 VFS_VOP_VECTOR_REGISTER(default_vnodeops);
 
@@ -1592,3 +1594,16 @@ vop_stdread_pgcache(struct vop_read_pgcache_args *ap __unused)
 {
 	return (EJUSTRETURN);
 }
+
+static int
+vop_stdvput_pair(struct vop_vput_pair_args *ap)
+{
+	struct vnode *dvp, *vp, **vpp;
+
+	dvp = ap->a_dvp;
+	vpp = ap->a_vpp;
+	vput(dvp);
+	if (vpp != NULL && ap->a_unlock_vp && (vp = *vpp) != NULL)
+		vput(vp);
+	return (0);
+}
diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src
index 5d15d4a0c863..b506237f385d 100644
--- a/sys/kern/vnode_if.src
+++ b/sys/kern/vnode_if.src
@@ -792,6 +792,15 @@ vop_copy_file_range {
 };
 
 
+%% vput_pair	dvp	E - -
+
+vop_vput_pair {
+	IN struct vnode *dvp;
+	INOUT struct vnode **vpp;
+	IN bool unlock_vp;
+};
+
+
 # The VOPs below are spares at the end of the table to allow new VOPs to be
 # added in stable branches without breaking the KBI.  New VOPs in HEAD should
 # be added above these spares.  When merging a new VOP to a stable branch,


More information about the dev-commits-src-all mailing list