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:
parent
593d37bb8e
commit
7ffbcfe281
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user