Page MenuHomeFreeBSD

D20519.id58266.diff
No OneTemporary

D20519.id58266.diff

Index: sys/kern/vfs_subr.c
===================================================================
--- sys/kern/vfs_subr.c
+++ sys/kern/vfs_subr.c
@@ -339,6 +339,65 @@
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';
+
+ /*
+ * XXX It would be nice if there were a flag that could restrict namei
+ * from doing real I/O and limit it to just searching the cache.
+ */
+ 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;
+ }
+
+ if (error != 0)
+ goto putvnode;
+
+ counter_u64_add(recycles_count, 1);
+ vgone(vp);
+putvnode:
+ NDFREE(&nd, 0);
+out:
+ free(buf, M_TEMP);
+ 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");
+
/* Shift count for (uintptr_t)vp to initialize vp->v_hash. */
static int vnsz2log;

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 21, 9:37 AM (14 h, 39 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16006659
Default Alt Text
D20519.id58266.diff (1 KB)

Event Timeline