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
This commit is contained in:
Bjoern A. Zeeb 2018-06-20 08:34:29 +00:00
parent 593d37bb8e
commit 7ffbcfe281
2 changed files with 62 additions and 1 deletions

View File

@ -60,7 +60,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd August 24, 2017
.Dd June 20, 2018
.Dt DDB 4
.Os
.Sh NAME
@ -1124,6 +1124,11 @@ 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
.It Ic show Cm watches
Displays all watchpoints.
Shows watchpoints set with "watch" command.

View File

@ -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 @@ vn_path_to_global_path(struct thread *td, struct vnode *vp, char *path,
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