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
This commit is contained in:
parent
09267cc152
commit
f58378393f
@ -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");
|
||||
|
Loading…
Reference in New Issue
Block a user