Page MenuHomeFreeBSD

D21426.diff
No OneTemporary

D21426.diff

Index: sys/fs/unionfs/union_vnops.c
===================================================================
--- sys/fs/unionfs/union_vnops.c
+++ sys/fs/unionfs/union_vnops.c
@@ -1978,7 +1978,6 @@
{
int error;
int flags;
- int mtxlkflag;
int uhold;
struct vnode *vp;
struct vnode *lvp;
@@ -1988,18 +1987,10 @@
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 +1998,24 @@
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));
}
Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c
+++ sys/kern/vfs_subr.c
@@ -1034,8 +1034,8 @@
(vp->v_iflag & VI_FREE) != 0 ||
(vp->v_object != NULL &&
vp->v_object->resident_page_count > trigger)) {
- VOP_UNLOCK(vp, LK_INTERLOCK);
- vdrop(vp);
+ VOP_UNLOCK(vp, 0);
+ vdropl(vp);
goto next_iter_mntunlocked;
}
KASSERT((vp->v_iflag & VI_DOOMED) == 0,
@@ -1398,7 +1398,8 @@
*/
VI_LOCK(vp);
if (vp->v_usecount) {
- VOP_UNLOCK(vp, LK_INTERLOCK);
+ VOP_UNLOCK(vp, 0);
+ VI_UNLOCK(vp);
vn_finished_write(vnmp);
CTR2(KTR_VFS,
"%s: impossible to recycle, %p is already referenced",
@@ -1409,7 +1410,8 @@
counter_u64_add(recycles_count, 1);
vgonel(vp);
}
- VOP_UNLOCK(vp, LK_INTERLOCK);
+ VOP_UNLOCK(vp, 0);
+ VI_UNLOCK(vp);
vn_finished_write(vnmp);
return (0);
}

File Metadata

Mime Type
text/plain
Expires
Fri, May 1, 8:45 AM (15 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32452012
Default Alt Text
D21426.diff (2 KB)

Event Timeline