diff options
author | eivind <eivind@FreeBSD.org> | 1999-12-11 16:13:02 +0000 |
---|---|---|
committer | eivind <eivind@FreeBSD.org> | 1999-12-11 16:13:02 +0000 |
commit | 287836faea1ff2f002f4c9ea357e87cb7f2b4cd6 (patch) | |
tree | 9524fb381c1cbe8aed4ee0af7b1a693057985617 /sys/kern | |
parent | ff090abf5121f6bf2199248b70a4896d25f49550 (diff) | |
download | FreeBSD-src-287836faea1ff2f002f4c9ea357e87cb7f2b4cd6.zip FreeBSD-src-287836faea1ff2f002f4c9ea357e87cb7f2b4cd6.tar.gz |
Lock reporting and assertion changes.
* lockstatus() and VOP_ISLOCKED() gets a new process argument and a new
return value: LK_EXCLOTHER, when the lock is held exclusively by another
process.
* The ASSERT_VOP_(UN)LOCKED family is extended to use what this gives them
* Extend the vnode_if.src format to allow more exact specification than
locked/unlocked.
This commit should not do any semantic changes unless you are using
DEBUG_VFS_LOCKS.
Discussed with: grog, mch, peter, phk
Reviewed by: peter
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_lock.c | 12 | ||||
-rw-r--r-- | sys/kern/vfs_default.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_export.c | 6 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 6 | ||||
-rw-r--r-- | sys/kern/vnode_if.src | 7 |
5 files changed, 24 insertions, 13 deletions
diff --git a/sys/kern/kern_lock.c b/sys/kern/kern_lock.c index d80561d..b47ca55 100644 --- a/sys/kern/kern_lock.c +++ b/sys/kern/kern_lock.c @@ -511,15 +511,19 @@ lockinit(lkp, prio, wmesg, timo, flags) * Determine the status of a lock. */ int -lockstatus(lkp) +lockstatus(lkp, p) struct lock *lkp; + struct proc *p; { int lock_type = 0; simple_lock(&lkp->lk_interlock); - if (lkp->lk_exclusivecount != 0) - lock_type = LK_EXCLUSIVE; - else if (lkp->lk_sharecount != 0) + if (lkp->lk_exclusivecount != 0) { + if (p == NULL || lkp->lk_lockholder == p->p_pid) + lock_type = LK_EXCLUSIVE; + else + lock_type = LK_EXCLOTHER; + } else if (lkp->lk_sharecount != 0) lock_type = LK_SHARED; simple_unlock(&lkp->lk_interlock); return (lock_type); diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index fe5d94d..600df41 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -255,6 +255,7 @@ int vop_stdislocked(ap) struct vop_islocked_args /* { struct vnode *a_vp; + struct proc *a_p; } */ *ap; { struct lock *l; @@ -262,7 +263,7 @@ vop_stdislocked(ap) if ((l = (struct lock *)ap->a_vp->v_data) == NULL) return 0; - return (lockstatus(l)); + return (lockstatus(l, ap->a_p)); } /* @@ -484,13 +485,14 @@ int vop_noislocked(ap) struct vop_islocked_args /* { struct vnode *a_vp; + struct proc *a_p; } */ *ap; { struct vnode *vp = ap->a_vp; if (vp->v_vnlock == NULL) return (0); - return (lockstatus(vp->v_vnlock)); + return (lockstatus(vp->v_vnlock, ap->a_p)); } /* diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c index a19c3d2..1f6b7a4 100644 --- a/sys/kern/vfs_export.c +++ b/sys/kern/vfs_export.c @@ -990,7 +990,7 @@ sched_sync(void) splx(s); while ((vp = LIST_FIRST(slp)) != NULL) { - if (VOP_ISLOCKED(vp) == 0) { + if (VOP_ISLOCKED(vp, NULL) == 0) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); (void) VOP_FSYNC(vp, p->p_ucred, MNT_LAZY, p); VOP_UNLOCK(vp, 0, p); @@ -1962,7 +1962,7 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes) continue; } LIST_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) { - if (VOP_ISLOCKED(vp)) + if (VOP_ISLOCKED(vp, NULL)) vprint((char *)0, vp); } simple_lock(&mountlist_slock); @@ -2450,7 +2450,7 @@ loop: obj = vp->v_object; if (obj == NULL || (obj->flags & OBJ_MIGHTBEDIRTY) == 0) continue; - if (VOP_ISLOCKED(vp)) + if (VOP_ISLOCKED(vp, NULL)) continue; } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index a19c3d2..1f6b7a4 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -990,7 +990,7 @@ sched_sync(void) splx(s); while ((vp = LIST_FIRST(slp)) != NULL) { - if (VOP_ISLOCKED(vp) == 0) { + if (VOP_ISLOCKED(vp, NULL) == 0) { vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); (void) VOP_FSYNC(vp, p->p_ucred, MNT_LAZY, p); VOP_UNLOCK(vp, 0, p); @@ -1962,7 +1962,7 @@ DB_SHOW_COMMAND(lockedvnodes, lockedvnodes) continue; } LIST_FOREACH(vp, &mp->mnt_vnodelist, v_mntvnodes) { - if (VOP_ISLOCKED(vp)) + if (VOP_ISLOCKED(vp, NULL)) vprint((char *)0, vp); } simple_lock(&mountlist_slock); @@ -2450,7 +2450,7 @@ loop: obj = vp->v_object; if (obj == NULL || (obj->flags & OBJ_MIGHTBEDIRTY) == 0) continue; - if (VOP_ISLOCKED(vp)) + if (VOP_ISLOCKED(vp, NULL)) continue; } diff --git a/sys/kern/vnode_if.src b/sys/kern/vnode_if.src index 2b16704..c418164 100644 --- a/sys/kern/vnode_if.src +++ b/sys/kern/vnode_if.src @@ -43,7 +43,11 @@ # "error" column defines the locking state on error exit. # # The locking value can take the following values: -# L: locked. +# L: locked; not converted to type of lock. +# A: any lock type. +# S: locked with shared lock. +# E: locked with exclusive lock for this process. +# O: locked with exclusive lock for other process. # U: unlocked. # -: not applicable. vnode does not yet (or no longer) exists. # =: the same on input and output, may be either L or U. @@ -55,6 +59,7 @@ # vop_islocked { IN struct vnode *vp; + IN struct proc *p; }; # |