Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Jun 2018 08:05:12 -0700
From:      Conrad Meyer <cem@freebsd.org>
To:        "Bjoern A. Zeeb" <bz@freebsd.org>
Cc:        src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org,  svn-src-head@freebsd.org
Subject:   Re: svn commit: r335437 - in head: share/man/man4 sys/kern
Message-ID:  <CAG6CVpX=0VwOjLg-52bCfF=NTzWvv8Ku6ZENjm-GZU-ou1jzgQ@mail.gmail.com>
In-Reply-To: <201806200834.w5K8YThd082989@repo.freebsd.org>
References:  <201806200834.w5K8YThd082989@repo.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Hi Bjoern,

It might be nice to be explicit that the vnode was not in the
namecache (in the ddb output) rather than failing silently.  The name
of the ddb method does not suggest that only entries in the namecache
may be found, and users (developers :)) do not always read manual
pages thoroughly.

All the best,
Conrad


On Wed, Jun 20, 2018 at 1:34 AM, Bjoern A. Zeeb <bz@freebsd.org> wrote:
> 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?CAG6CVpX=0VwOjLg-52bCfF=NTzWvv8Ku6ZENjm-GZU-ou1jzgQ>