svn commit: r335437 - in head: share/man/man4 sys/kern
Bjoern A. Zeeb
bz at FreeBSD.org
Wed Jun 20 08:34:30 UTC 2018
Author: bz
Date: Wed Jun 20 08:34:29 2018
New Revision: 335437
URL: https://svnweb.freebsd.org/changeset/base/335437
Log:
Sometimes it is helpful to get the path for a vnode.
Implement a ddb function walking the namecache to do this.
Reviewed by: jhb, mjg
Inspired by: gdb macro from jhb (old version)
Sponsored by: iXsystems, Inc.
Differential Revision: https://reviews.freebsd.org/D14898
Modified:
head/share/man/man4/ddb.4
head/sys/kern/vfs_cache.c
Modified: head/share/man/man4/ddb.4
==============================================================================
--- head/share/man/man4/ddb.4 Wed Jun 20 07:02:19 2018 (r335436)
+++ head/share/man/man4/ddb.4 Wed Jun 20 08:34:29 2018 (r335437)
@@ -60,7 +60,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd August 24, 2017
+.Dd June 20, 2018
.Dt DDB 4
.Os
.Sh NAME
@@ -1121,6 +1121,11 @@ header file.
.Pp
.It Ic show Cm vnodebufs Ar addr
Shows clean/dirty buffer lists of the vnode located at
+.Ar addr .
+.\"
+.Pp
+.It Ic show Cm vpath Ar addr
+Walk the namecache to lookup the pathname of the vnode located at
.Ar addr .
.\"
.Pp
Modified: head/sys/kern/vfs_cache.c
==============================================================================
--- head/sys/kern/vfs_cache.c Wed Jun 20 07:02:19 2018 (r335436)
+++ head/sys/kern/vfs_cache.c Wed Jun 20 08:34:29 2018 (r335437)
@@ -37,6 +37,7 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_ddb.h"
#include "opt_ktrace.h"
#include <sys/param.h>
@@ -62,6 +63,10 @@ __FBSDID("$FreeBSD$");
#include <sys/ktrace.h>
#endif
+#ifdef DDB
+#include <ddb/ddb.h>
+#endif
+
#include <vm/uma.h>
SDT_PROVIDER_DECLARE(vfs);
@@ -2529,3 +2534,54 @@ out:
free(fbuf, M_TEMP);
return (error);
}
+
+#ifdef DDB
+static void
+db_print_vpath(struct vnode *vp)
+{
+
+ while (vp != NULL) {
+ db_printf("%p: ", vp);
+ if (vp == rootvnode) {
+ db_printf("/");
+ vp = NULL;
+ } else {
+ if (vp->v_vflag & VV_ROOT) {
+ db_printf("<mount point>");
+ vp = vp->v_mount->mnt_vnodecovered;
+ } else {
+ struct namecache *ncp;
+ char *ncn;
+ int i;
+
+ ncp = TAILQ_FIRST(&vp->v_cache_dst);
+ if (ncp != NULL) {
+ ncn = ncp->nc_name;
+ for (i = 0; i < ncp->nc_nlen; i++)
+ db_printf("%c", *ncn++);
+ vp = ncp->nc_dvp;
+ } else {
+ vp = NULL;
+ }
+ }
+ }
+ db_printf("\n");
+ }
+
+ return;
+}
+
+DB_SHOW_COMMAND(vpath, db_show_vpath)
+{
+ struct vnode *vp;
+
+ if (!have_addr) {
+ db_printf("usage: show vpath <struct vnode *>\n");
+ return;
+ }
+
+ vp = (struct vnode *)addr;
+ db_print_vpath(vp);
+}
+
+#endif
More information about the svn-src-all
mailing list