diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -4025,19 +4025,21 @@ { 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_RETRY | LK_NOWAIT)) == 0); + MPASS((lkflags2 & LK_SHARED) != 0 ^ (lkflags2 & LK_EXCLUSIVE) != 0); + MPASS((lkflags2 & (LK_RETRY | LK_NOWAIT)) == 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 +4052,12 @@ } 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");