Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107961328
D20519.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D20519.diff
View Options
Index: head/sys/kern/vfs_subr.c
===================================================================
--- head/sys/kern/vfs_subr.c
+++ head/sys/kern/vfs_subr.c
@@ -50,6 +50,7 @@
#include <sys/systm.h>
#include <sys/bio.h>
#include <sys/buf.h>
+#include <sys/capsicum.h>
#include <sys/condvar.h>
#include <sys/conf.h>
#include <sys/counter.h>
@@ -338,6 +339,93 @@
static int vnlru_nowhere;
SYSCTL_INT(_debug, OID_AUTO, vnlru_nowhere, CTLFLAG_RW,
&vnlru_nowhere, 0, "Number of times the vnlru process ran without success");
+
+static int
+sysctl_try_reclaim_vnode(SYSCTL_HANDLER_ARGS)
+{
+ struct vnode *vp;
+ struct nameidata nd;
+ char *buf;
+ unsigned long ndflags;
+ int error;
+
+ if (req->newptr == NULL)
+ return (EINVAL);
+ if (req->newlen > PATH_MAX)
+ return (E2BIG);
+
+ buf = malloc(PATH_MAX + 1, M_TEMP, M_WAITOK);
+ error = SYSCTL_IN(req, buf, req->newlen);
+ if (error != 0)
+ goto out;
+
+ buf[req->newlen] = '\0';
+
+ ndflags = LOCKLEAF | NOFOLLOW | AUDITVNODE1 | NOCACHE | SAVENAME;
+ NDINIT(&nd, LOOKUP, ndflags, UIO_SYSSPACE, buf, curthread);
+ if ((error = namei(&nd)) != 0)
+ goto out;
+ vp = nd.ni_vp;
+
+ if ((vp->v_iflag & VI_DOOMED) != 0) {
+ /*
+ * This vnode is being recycled. Return != 0 to let the caller
+ * know that the sysctl had no effect. Return EAGAIN because a
+ * subsequent call will likely succeed (since namei will create
+ * a new vnode if necessary)
+ */
+ error = EAGAIN;
+ goto putvnode;
+ }
+
+ counter_u64_add(recycles_count, 1);
+ vgone(vp);
+putvnode:
+ NDFREE(&nd, 0);
+out:
+ free(buf, M_TEMP);
+ return (error);
+}
+
+static int
+sysctl_ftry_reclaim_vnode(SYSCTL_HANDLER_ARGS)
+{
+ struct thread *td = curthread;
+ struct vnode *vp;
+ struct file *fp;
+ int error;
+ int fd;
+
+ if (req->newptr == NULL)
+ return (EBADF);
+
+ error = sysctl_handle_int(oidp, &fd, 0, req);
+ if (error != 0)
+ return (error);
+ error = getvnode(curthread, fd, &cap_fcntl_rights, &fp);
+ if (error != 0)
+ return (error);
+ vp = fp->f_vnode;
+
+ error = vn_lock(vp, LK_EXCLUSIVE);
+ if (error != 0)
+ goto drop;
+
+ counter_u64_add(recycles_count, 1);
+ vgone(vp);
+ VOP_UNLOCK(vp, 0);
+drop:
+ fdrop(fp, td);
+ return (error);
+}
+
+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");
+SYSCTL_PROC(_debug, OID_AUTO, ftry_reclaim_vnode,
+ CTLTYPE_INT | CTLFLAG_MPSAFE | CTLFLAG_WR, NULL, 0,
+ sysctl_ftry_reclaim_vnode, "I",
+ "Try to reclaim a vnode by its file descriptor");
/* Shift count for (uintptr_t)vp to initialize vp->v_hash. */
static int vnsz2log;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jan 20, 11:50 PM (4 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15989136
Default Alt Text
D20519.diff (2 KB)
Attached To
Mode
D20519: Add a debugging facility to manually reclaim a vnode
Attached
Detach File
Event Timeline
Log In to Comment