svn commit: r351556 - head/sys/fs/unionfs
Mateusz Guzik
mjg at FreeBSD.org
Tue Aug 27 20:51:18 UTC 2019
Author: mjg
Date: Tue Aug 27 20:51:17 2019
New Revision: 351556
URL: https://svnweb.freebsd.org/changeset/base/351556
Log:
unionfs: stop passing LK_INTERLOCK to VOP_UNLOCK
This is part of the preparation to remove flags argument from VOP_UNLOCK.
Also has a side effect of fixing stacking on top of nullfs broken by r351472.
Reported by: cy
Sponsored by: The FreeBSD Foundation
Modified:
head/sys/fs/unionfs/union_vnops.c
Modified: head/sys/fs/unionfs/union_vnops.c
==============================================================================
--- head/sys/fs/unionfs/union_vnops.c Tue Aug 27 20:30:56 2019 (r351555)
+++ head/sys/fs/unionfs/union_vnops.c Tue Aug 27 20:51:17 2019 (r351556)
@@ -1882,12 +1882,9 @@ unionfs_lock(struct vop_lock1_args *ap)
if (lvp != NULLVP) {
if (uvp != NULLVP && flags & LK_UPGRADE) {
/* Share Lock is once released and a deadlock is avoided. */
- VI_LOCK_FLAGS(uvp, MTX_DUPOK);
- vholdl(uvp);
+ vholdnz(uvp);
uhold = 1;
- VI_UNLOCK(vp);
- VOP_UNLOCK(uvp, LK_RELEASE | LK_INTERLOCK);
- VI_LOCK(vp);
+ VOP_UNLOCK(uvp, LK_RELEASE);
unp = VTOUNIONFS(vp);
if (unp == NULL) {
/* vnode is released. */
@@ -1978,7 +1975,6 @@ unionfs_unlock(struct vop_unlock_args *ap)
{
int error;
int flags;
- int mtxlkflag;
int uhold;
struct vnode *vp;
struct vnode *lvp;
@@ -1988,18 +1984,10 @@ unionfs_unlock(struct vop_unlock_args *ap)
KASSERT_UNIONFS_VNODE(ap->a_vp);
error = 0;
- mtxlkflag = 0;
uhold = 0;
flags = ap->a_flags | LK_RELEASE;
vp = ap->a_vp;
- if ((flags & LK_INTERLOCK) != 0)
- mtxlkflag = 1;
- else if (mtx_owned(VI_MTX(vp)) == 0) {
- VI_LOCK(vp);
- mtxlkflag = 2;
- }
-
unp = VTOUNIONFS(vp);
if (unp == NULL)
goto unionfs_unlock_null_vnode;
@@ -2007,45 +1995,24 @@ unionfs_unlock(struct vop_unlock_args *ap)
uvp = unp->un_uppervp;
if (lvp != NULLVP) {
- VI_LOCK_FLAGS(lvp, MTX_DUPOK);
- flags |= LK_INTERLOCK;
- vholdl(lvp);
-
- VI_UNLOCK(vp);
- ap->a_flags &= ~LK_INTERLOCK;
-
+ vholdnz(lvp);
error = VOP_UNLOCK(lvp, flags);
-
- VI_LOCK(vp);
}
if (error == 0 && uvp != NULLVP) {
- VI_LOCK_FLAGS(uvp, MTX_DUPOK);
- flags |= LK_INTERLOCK;
- vholdl(uvp);
+ vholdnz(uvp);
uhold = 1;
-
- VI_UNLOCK(vp);
- ap->a_flags &= ~LK_INTERLOCK;
-
error = VOP_UNLOCK(uvp, flags);
-
- VI_LOCK(vp);
}
- VI_UNLOCK(vp);
if (lvp != NULLVP)
vdrop(lvp);
if (uhold != 0)
vdrop(uvp);
- if (mtxlkflag == 0)
- VI_LOCK(vp);
return error;
unionfs_unlock_null_vnode:
- if (mtxlkflag == 2)
- VI_UNLOCK(vp);
return (vop_stdunlock(ap));
}
More information about the svn-src-all
mailing list