summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2008-07-27 11:46:42 +0000
committerpjd <pjd@FreeBSD.org>2008-07-27 11:46:42 +0000
commit4dd19696a7df7d5a2ba853c021b68dfe52ebbe5a (patch)
treed89aca8a26ee0ba6cc7f568685f62871afbdb046 /sys/kern/vfs_subr.c
parent4c1af4639a28804c24bdde2b0a1d10168d42e1ca (diff)
downloadFreeBSD-src-4dd19696a7df7d5a2ba853c021b68dfe52ebbe5a.zip
FreeBSD-src-4dd19696a7df7d5a2ba853c021b68dfe52ebbe5a.tar.gz
- Move vp test for beeing NULL under IGNORE_LOCK().
- Check if panicstr isn't set, if it is ignore the lock. This helps to avoid confusion, because lockmgr is a no-op when panicstr isn't NULL, so asserting anything at this point doesn't make sense and can just race with other panic. Discussed with: kib
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 16fa8e4..7665d79 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -3581,7 +3581,8 @@ extattr_check_cred(struct vnode *vp, int attrnamespace, struct ucred *cred,
* This only exists to supress warnings from unlocked specfs accesses. It is
* no longer ok to have an unlocked VFS.
*/
-#define IGNORE_LOCK(vp) ((vp)->v_type == VCHR || (vp)->v_type == VBAD)
+#define IGNORE_LOCK(vp) (panicstr != NULL || (vp) == NULL || \
+ (vp)->v_type == VCHR || (vp)->v_type == VBAD)
int vfs_badlock_ddb = 1; /* Drop into debugger on violation. */
SYSCTL_INT(_debug, OID_AUTO, vfs_badlock_ddb, CTLFLAG_RW, &vfs_badlock_ddb, 0, "");
@@ -3631,7 +3632,7 @@ void
assert_vop_locked(struct vnode *vp, const char *str)
{
- if (vp && !IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) == 0)
+ if (!IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) == 0)
vfs_badlock("is not locked but should be", str, vp);
}
@@ -3639,8 +3640,7 @@ void
assert_vop_unlocked(struct vnode *vp, const char *str)
{
- if (vp && !IGNORE_LOCK(vp) &&
- VOP_ISLOCKED(vp) == LK_EXCLUSIVE)
+ if (!IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) == LK_EXCLUSIVE)
vfs_badlock("is locked but should not be", str, vp);
}
@@ -3648,8 +3648,7 @@ void
assert_vop_elocked(struct vnode *vp, const char *str)
{
- if (vp && !IGNORE_LOCK(vp) &&
- VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
+ if (!IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
vfs_badlock("is not exclusive locked but should be", str, vp);
}
@@ -3658,8 +3657,7 @@ void
assert_vop_elocked_other(struct vnode *vp, const char *str)
{
- if (vp && !IGNORE_LOCK(vp) &&
- VOP_ISLOCKED(vp) != LK_EXCLOTHER)
+ if (!IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) != LK_EXCLOTHER)
vfs_badlock("is not exclusive locked by another thread",
str, vp);
}
@@ -3668,8 +3666,7 @@ void
assert_vop_slocked(struct vnode *vp, const char *str)
{
- if (vp && !IGNORE_LOCK(vp) &&
- VOP_ISLOCKED(vp) != LK_SHARED)
+ if (!IGNORE_LOCK(vp) && VOP_ISLOCKED(vp) != LK_SHARED)
vfs_badlock("is not locked shared but should be", str, vp);
}
#endif /* 0 */
OpenPOWER on IntegriCloud