Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Jun 2018 08:34:29 +0000 (UTC)
From:      "Bjoern A. Zeeb" <bz@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r335437 - in head: share/man/man4 sys/kern
Message-ID:  <201806200834.w5K8YThd082989@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201806200834.w5K8YThd082989>