Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Jul 2023 11:36:34 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: f58378393fb0 - main - vn_lock_pair(): Support passing LK_NODDLKTREAT
Message-ID:  <202307141136.36EBaYRX012901@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

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

commit f58378393fb00f1683bc15f1ae7cbb83e047b9fb
Author:     Olivier Certner <olce.freebsd@certner.fr>
AuthorDate: 2023-07-09 17:12:52 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2023-07-14 11:36:12 +0000

    vn_lock_pair(): Support passing LK_NODDLKTREAT
    
    Since this function ultimately calls vn_lock() or VOP_LOCK1(), allows it to
    receive and pass this flag which is used in the lookup code and doesn't
    interfere with the function's operation.
    
    Reviewed by:    kib, markj
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D40954
---
 sys/kern/vfs_vnops.c | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 33cb3ebed60f..41a80da75a4f 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -4018,6 +4018,9 @@ vn_lock_pair_pause(const char *wmesg)
  * Both vnodes could be unlocked temporary (and reclaimed).
  *
  * If requesting shared locking, locked vnode lock must not be recursed.
+ *
+ * Only one of LK_SHARED and LK_EXCLUSIVE must be specified.
+ * LK_NODDLKTREAT can be optionally passed.
  */
 void
 vn_lock_pair(struct vnode *vp1, bool vp1_locked, int lkflags1,
@@ -4025,19 +4028,21 @@ vn_lock_pair(struct vnode *vp1, bool vp1_locked, int lkflags1,
 {
 	int error;
 
-	MPASS(lkflags1 == LK_SHARED || lkflags1 == LK_EXCLUSIVE);
-	MPASS(lkflags2 == LK_SHARED || lkflags2 == LK_EXCLUSIVE);
+	MPASS((lkflags1 & LK_SHARED) != 0 ^ (lkflags1 & LK_EXCLUSIVE) != 0);
+	MPASS((lkflags1 & ~(LK_SHARED | LK_EXCLUSIVE | LK_NODDLKTREAT)) == 0);
+	MPASS((lkflags2 & LK_SHARED) != 0 ^ (lkflags2 & LK_EXCLUSIVE) != 0);
+	MPASS((lkflags2 & ~(LK_SHARED | LK_EXCLUSIVE | LK_NODDLKTREAT)) == 0);
 
 	if (vp1 == NULL && vp2 == NULL)
 		return;
 
 	if (vp1 != NULL) {
-		if (lkflags1 == LK_SHARED &&
+		if ((lkflags1 & LK_SHARED) != 0 &&
 		    (vp1->v_vnlock->lock_object.lo_flags & LK_NOSHARE) != 0)
-			lkflags1 = LK_EXCLUSIVE;
+			lkflags1 = (lkflags1 & ~LK_SHARED) | LK_EXCLUSIVE;
 		if (vp1_locked && VOP_ISLOCKED(vp1) != LK_EXCLUSIVE) {
 			ASSERT_VOP_LOCKED(vp1, "vp1");
-			if (lkflags1 == LK_EXCLUSIVE) {
+			if ((lkflags1 & LK_EXCLUSIVE) != 0) {
 				VOP_UNLOCK(vp1);
 				ASSERT_VOP_UNLOCKED(vp1,
 				    "vp1 shared recursed");
@@ -4050,12 +4055,12 @@ vn_lock_pair(struct vnode *vp1, bool vp1_locked, int lkflags1,
 	}
 
 	if (vp2 != NULL) {
-		if (lkflags2 == LK_SHARED &&
+		if ((lkflags2 & LK_SHARED) != 0 &&
 		    (vp2->v_vnlock->lock_object.lo_flags & LK_NOSHARE) != 0)
-			lkflags2 = LK_EXCLUSIVE;
+			lkflags2 = (lkflags2 & ~LK_SHARED) | LK_EXCLUSIVE;
 		if (vp2_locked && VOP_ISLOCKED(vp2) != LK_EXCLUSIVE) {
 			ASSERT_VOP_LOCKED(vp2, "vp2");
-			if (lkflags2 == LK_EXCLUSIVE) {
+			if ((lkflags2 & LK_EXCLUSIVE) != 0) {
 				VOP_UNLOCK(vp2);
 				ASSERT_VOP_UNLOCKED(vp2,
 				    "vp2 shared recursed");



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202307141136.36EBaYRX012901>