Index: sys/kern/vfs_subr.c =================================================================== --- sys/kern/vfs_subr.c +++ sys/kern/vfs_subr.c @@ -339,6 +339,54 @@ SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhere, CTLFLAG_RW, &vnlru_nowhere, 0, "Number of times the vnlru process ran without success"); +#ifdef INVARIANTS +static int +sysctl_try_reclaim_vnode(SYSCTL_HANDLER_ARGS) +{ + struct vnode *vp; + struct nameidata nd; + char buf[PATH_MAX]; + int error; + + if (req->newptr == NULL) + return (EINVAL); + + if (req->newlen > sizeof(buf)) + return (E2BIG); + + error = SYSCTL_IN(req, buf, req->newlen); + if (error != 0) + return (error); + + buf[req->newlen] = '\0'; + + NDINIT(&nd, LOOKUP, + LOCKLEAF| NOFOLLOW | AUDITVNODE1 | NOCACHE | SAVENAME, + UIO_SYSSPACE, buf, curthread); + if ((error = namei(&nd)) != 0) + return (error); + vp = nd.ni_vp; + NDFREE(&nd, NDF_NO_FREE_PNBUF | NDF_NO_VP_UNLOCK | NDF_NO_VP_RELE); + + if (vp->v_usecount > 1 || (vp->v_iflag & VI_DOOMED)) { + vput(vp); + return (EBUSY); + } + + vhold(vp); + counter_u64_add(recycles_count, 1); + vgone(vp); + vdrop(vp); + vput(vp); + + return (0); +} + +SYSCTL_PROC(_debug, OID_AUTO, try_reclaim_vnode, + CTLTYPE_STRING | CTLFLAG_MPSAFE | CTLFLAG_WR, NULL, 0, + sysctl_try_reclaim_vnode, "A", "Try to reclaim a vnode by its pathname"); +#endif /* INVARIANTS */ + /* Shift count for (uintptr_t)vp to initialize vp->v_hash. */ static int vnsz2log;