Page MenuHomeFreeBSD

D21480.diff
No OneTemporary

D21480.diff

Index: head/sys/fs/nullfs/null_vnops.c
===================================================================
--- head/sys/fs/nullfs/null_vnops.c
+++ head/sys/fs/nullfs/null_vnops.c
@@ -638,16 +638,16 @@
null_lock(struct vop_lock1_args *ap)
{
struct vnode *vp = ap->a_vp;
- int flags = ap->a_flags;
+ int flags;
struct null_node *nn;
struct vnode *lvp;
int error;
-
- if ((flags & LK_INTERLOCK) == 0) {
+ if ((ap->a_flags & LK_INTERLOCK) == 0)
VI_LOCK(vp);
- ap->a_flags = flags |= LK_INTERLOCK;
- }
+ else
+ ap->a_flags &= ~LK_INTERLOCK;
+ flags = ap->a_flags;
nn = VTONULL(vp);
/*
* If we're still active we must ask the lower layer to
@@ -655,8 +655,6 @@
* vop lock.
*/
if (nn != NULL && (lvp = NULLVPTOLOWERVP(vp)) != NULL) {
- VI_LOCK_FLAGS(lvp, MTX_DUPOK);
- VI_UNLOCK(vp);
/*
* We have to hold the vnode here to solve a potential
* reclaim race. If we're forcibly vgone'd while we
@@ -669,6 +667,7 @@
* here.
*/
vholdnz(lvp);
+ VI_UNLOCK(vp);
error = VOP_LOCK(lvp, flags);
/*
@@ -678,7 +677,7 @@
* case by reacquiring correct lock in requested mode.
*/
if (VTONULL(vp) == NULL && error == 0) {
- ap->a_flags &= ~(LK_TYPE_MASK | LK_INTERLOCK);
+ ap->a_flags &= ~LK_TYPE_MASK;
switch (flags & LK_TYPE_MASK) {
case LK_SHARED:
ap->a_flags |= LK_SHARED;
@@ -695,8 +694,10 @@
error = vop_stdlock(ap);
}
vdrop(lvp);
- } else
+ } else {
+ VI_UNLOCK(vp);
error = vop_stdlock(ap);
+ }
return (error);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 14, 6:41 AM (21 h, 32 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15791906
Default Alt Text
D21480.diff (1 KB)

Event Timeline