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
This commit is contained in:
Mike Pritchard 2007-02-13 00:20:13 +00:00
parent 1ec4c3a889
commit 51fd6380c5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=166678

View File

@ -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;
}
/*