Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 Jun 2018 18:49:42 -0700
From:      Devin Teske <dteske@FreeBSD.org>
To:        Warner Losh <imp@bsdimp.com>
Cc:        Devin Teske <dteske@FreeBSD.org>, Gleb Smirnoff <glebius@freebsd.org>, Warner Losh <imp@freebsd.org>, src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   Re: svn commit: r335690 - head/sys/kern
Message-ID:  <16B9F36D-E92A-4FEC-B096-5E24A4E180FC@FreeBSD.org>
In-Reply-To: <CANCZdfpdBOin=w0qEGXM%2BciTAbETezYTOPq1nuEV1pT5QATEHA@mail.gmail.com>
References:  <201806270411.w5R4B9ZB078994@repo.freebsd.org> <20180627235216.GO1165@FreeBSD.org> <CANCZdfpdBOin=w0qEGXM%2BciTAbETezYTOPq1nuEV1pT5QATEHA@mail.gmail.com>

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

> On Jun 27, 2018, at 5:59 PM, Warner Losh <imp@bsdimp.com> wrote:
>=20
>=20
>=20
> On Wed, Jun 27, 2018 at 5:52 PM, Gleb Smirnoff <glebius@freebsd.org =
<mailto:glebius@freebsd.org>> wrote:
> On Wed, Jun 27, 2018 at 04:11:09AM +0000, Warner Losh wrote:
> W> Author: imp
> W> Date: Wed Jun 27 04:11:09 2018
> W> New Revision: 335690
> W> URL: https://svnweb.freebsd.org/changeset/base/335690 =
<https://svnweb.freebsd.org/changeset/base/335690>;
> W>=20
> W> Log:
> W>   Fix devctl generation for core files.
> W>  =20
> W>   We have a problem with vn_fullpath_global when the file exists. =
Work
> W>   around it by printing the full path if the core file name starts =
with /,
> W>   or current working directory followed by the filename if not.
>=20
> Is this going to work when a core is dumped not at current working =
directory,
> but at absolute path? e.g. kern.corefile=3D/var/log/cores/%N.core
>=20
> Yes. That works.
> =20
> Looks like the vn_fullpath_global needs to be fixed rather than =
problem
> workarounded.
>=20
> It can't be fixed reliably. FreeBSD does not and cannot map a vnode to =
a name. The only reason we're able to at all is due to the name cache. =
And when we recreate a file, we invalidate the name cache. And even if =
we fixed that, there's no guarantee the name cache won't get flushed =
before we translate the name.... Linux can do this because it keeps the =
path name associated with the inode. FreeBSD simply doesn't.
>=20

They said it couldn't be done, but I personally have done it ...

I map vnodes to full paths in dwatch. It's not impossible, just =
implausibly hard.

I derived my formula by reading the C code which was very twisty-turny =
and rather hard to read at times (and I have been using C since 1998 on =
everything from AIX and OSF/1 to HP/UX, Cygwin, MinGW, FreeBSD, =
countless Linux-like things, IRIX, and a God-awful remainder of many =
others; the vnode code was an adventure to say the least).

You're welcome to see how it's done in /usr/libexec/dwatch/vop_create

I load up a clause-local variable named "path" with a path constructed =
from a pointer to a vnode structure argument to VOP_CREATE(9).

The D code could easily be rewritten back into C to walk the vnode to =
completion (compared to the D code which is bounded by depth-limit since =
DTrace doesn't provide loops; so you have to, as I have done, use a =
higher-level language wrapper to repeat the code to some desired limit; =
dwatch defaulting to 64 for directory depth limit).

Compared this, say, to vfssnoop.d from Chapter 5 of the DTrace book =
which utilizes the vfs:namei:lookup: probes. My approach in dwatch is =
far more accurate, produces full paths, and I've benchmarked it at lower =
overhead with better results.

Maybe some of this can be useful? If not, just ignore me.
--=20
Devin=



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?16B9F36D-E92A-4FEC-B096-5E24A4E180FC>