From 51fd6380c54143a4cf3e00cf5c4d07cc0556b5e6 Mon Sep 17 00:00:00 2001 From: Mike Pritchard Date: Tue, 13 Feb 2007 00:20:13 +0000 Subject: [PATCH] Do not do a vn_close for all references to the ktraced file if we are doing a CLEARFILE option. Do a vrele instead. This prevents a panic later due to v_writecount being negative when the vnode is taken off the freelist. Submitted by: jhb --- sys/kern/kern_ktrace.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/sys/kern/kern_ktrace.c b/sys/kern/kern_ktrace.c index 9e92e493afed..0f574bf8d00c 100644 --- a/sys/kern/kern_ktrace.c +++ b/sys/kern/kern_ktrace.c @@ -628,6 +628,9 @@ ktrace(td, uap) * Clear all uses of the tracefile. */ if (ops == KTROP_CLEARFILE) { + int vrele_count; + + vrele_count = 0; sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { PROC_LOCK(p); @@ -639,20 +642,20 @@ ktrace(td, uap) p->p_tracevp = NULL; p->p_traceflag = 0; mtx_unlock(&ktrace_mtx); - PROC_UNLOCK(p); - vfslocked = VFS_LOCK_GIANT(vp->v_mount); - (void) vn_close(vp, FREAD|FWRITE, - cred, td); - VFS_UNLOCK_GIANT(vfslocked); + vrele_count++; crfree(cred); - } else { - PROC_UNLOCK(p); + } else error = EPERM; - } - } else - PROC_UNLOCK(p); + } + PROC_UNLOCK(p); } sx_sunlock(&allproc_lock); + if (vrele_count > 0) { + vfslocked = VFS_LOCK_GIANT(vp->v_mount); + while (vrele_count-- > 0) + vrele(vp); + VFS_UNLOCK_GIANT(vfslocked); + } goto done; } /*