summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authoreivind <eivind@FreeBSD.org>1999-12-11 16:13:02 +0000
committereivind <eivind@FreeBSD.org>1999-12-11 16:13:02 +0000
commit287836faea1ff2f002f4c9ea357e87cb7f2b4cd6 (patch)
tree9524fb381c1cbe8aed4ee0af7b1a693057985617 /sys/kern
parentff090abf5121f6bf2199248b70a4896d25f49550 (diff)
downloadFreeBSD-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.c12
-rw-r--r--sys/kern/vfs_default.c6
-rw-r--r--sys/kern/vfs_export.c6
-rw-r--r--sys/kern/vfs_subr.c6
-rw-r--r--sys/kern/vnode_if.src7
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;
};
#
OpenPOWER on IntegriCloud