From owner-freebsd-current@FreeBSD.ORG Mon Aug 20 12:31:50 2012 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id C582A1065680; Mon, 20 Aug 2012 12:31:50 +0000 (UTC) (envelope-from kostikbel@gmail.com) Received: from mail.zoral.com.ua (mx0.zoral.com.ua [91.193.166.200]) by mx1.freebsd.org (Postfix) with ESMTP id 114FA8FC14; Mon, 20 Aug 2012 12:31:49 +0000 (UTC) Received: from skuns.kiev.zoral.com.ua (localhost [127.0.0.1]) by mail.zoral.com.ua (8.14.2/8.14.2) with ESMTP id q7KCVsMH024365; Mon, 20 Aug 2012 15:31:54 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: from deviant.kiev.zoral.com.ua (kostik@localhost [127.0.0.1]) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5) with ESMTP id q7KCVgLc086767; Mon, 20 Aug 2012 15:31:42 +0300 (EEST) (envelope-from kostikbel@gmail.com) Received: (from kostik@localhost) by deviant.kiev.zoral.com.ua (8.14.5/8.14.5/Submit) id q7KCVglY086766; Mon, 20 Aug 2012 15:31:42 +0300 (EEST) (envelope-from kostikbel@gmail.com) X-Authentication-Warning: deviant.kiev.zoral.com.ua: kostik set sender to kostikbel@gmail.com using -f Date: Mon, 20 Aug 2012 15:31:42 +0300 From: Konstantin Belousov To: Bernhard Fr?hlich Message-ID: <20120820123142.GY33100@deviant.kiev.zoral.com.ua> References: <20120812132047.GA33526@psconsult.nl> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="hblleJHDxiLJUoyx" Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.3i X-Virus-Scanned: clamav-milter 0.95.2 at skuns.kiev.zoral.com.ua X-Virus-Status: Clean X-Spam-Status: No, score=-4.0 required=5.0 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.2.5 X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on skuns.kiev.zoral.com.ua Cc: Garrett Cooper , Current FreeBSD , Paul Schenkeveld Subject: Re: make package fails in chroot: tar: getvfsbyname failed: No such file or directory X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 20 Aug 2012 12:31:50 -0000 --hblleJHDxiLJUoyx Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Mon, Aug 20, 2012 at 01:42:31PM +0200, Bernhard Fr?hlich wrote: > On Sun, Aug 19, 2012 at 10:01 PM, Tim Kientzle wrote: > > > > On Aug 19, 2012, at 12:17 PM, Garrett Cooper wrote: > > > >> On Sun, Aug 19, 2012 at 9:45 AM, Tim Kientzle wrote: > >>> > >>> On Aug 12, 2012, at 6:20 AM, Paul Schenkeveld wrote: > >>> > >>>> Hi, > >>>> > >>>> I have a wrapper script that builds packages in a chroot environment > >>>> which happily runs on release 6 thru 9 and earlier 10 but fails with: > >>>> > >>>> tar: getvfsbyname failed: No such file or directory > >>>> > >>>> on a recent -CURRENT. > >>> > >>> libarchive does do an initial getvfsbyname() when you ask it > >>> to traverse a directory tree so that it can accurately handle later > >>> requests about mountpoints and filesystem types. This code > >>> is admittedly a little intricate. > >> > >> The problem most likely is the fact that all mountpoints are > >> exposed via chroot, thus, if it's checking to see if a mountpoint > >> exists, it may exist outside of the chroot. > >> > > > > I reviewed the code to refresh my memory. Some > > of what I said before was not quite right. > > > > Libarchive's directory traversal tracks information about > > the filesystem type so that clients such as bsdtar can > > efficiently skip synthetic filesystems (/dev or /proc) or > > network filesystems (NFS or SMB mounts). > > > > The net effect is something like this: > > > > For each file: > > stat() or lstat() or fstat() the file > > look up dev number in an internal cache > > if the dev number is new: > > fstatfs() the open fd to get the FS name > > getvfsbyname() to identify the FS type > > > > Unless there's a logic error in libarchive itself, this > > would suggest that somehow fstatfs() is returning > > a filesystem type that getvfsbyname() can't > > identify. > > > > Paul: > > What filesystem are you using? > > > > What does "mount" show? > > > > Does it work outside the chroot? >=20 > I also see the same on the redports.org build machines. > It builds within a jail there which is completely on a tmpfs. > Interestinly everything is fine with a 10-CURRENT/amd64 > jail but it breaks in a 10-CURRENT/i386 jail. Both are > running on the same 10-CURRENT/amd64 which is > around 2 months old. >=20 > https://redports.org/buildarchive/20120814130205-56327/ Try this. diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 1d6136a..631d3f2 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -41,6 +41,7 @@ #include __FBSDID("$FreeBSD$"); =20 +#include "opt_compat.h" #include "opt_ddb.h" #include "opt_watchdog.h" =20 @@ -3111,21 +3112,49 @@ DB_SHOW_COMMAND(mount, db_show_mount) /* * Fill in a struct xvfsconf based on a struct vfsconf. */ -static void -vfsconf2x(struct vfsconf *vfsp, struct xvfsconf *xvfsp) +static int +vfsconf2x(struct sysctl_req *req, struct vfsconf *vfsp) { + struct xvfsconf xvfsp; =20 - strcpy(xvfsp->vfc_name, vfsp->vfc_name); - xvfsp->vfc_typenum =3D vfsp->vfc_typenum; - xvfsp->vfc_refcount =3D vfsp->vfc_refcount; - xvfsp->vfc_flags =3D vfsp->vfc_flags; + bzero(&xvfsp, sizeof(xvfsp)); + strcpy(xvfsp.vfc_name, vfsp->vfc_name); + xvfsp.vfc_typenum =3D vfsp->vfc_typenum; + xvfsp.vfc_refcount =3D vfsp->vfc_refcount; + xvfsp.vfc_flags =3D vfsp->vfc_flags; /* * These are unused in userland, we keep them * to not break binary compatibility. */ - xvfsp->vfc_vfsops =3D NULL; - xvfsp->vfc_next =3D NULL; + xvfsp.vfc_vfsops =3D NULL; + xvfsp.vfc_next =3D NULL; + return (SYSCTL_OUT(req, &xvfsp, sizeof(xvfsp))); +} + +#ifdef COMPAT_FREEBSD32 +struct xvfsconf32 { + uint32_t vfc_vfsops; + char vfc_name[MFSNAMELEN]; + int32_t vfc_typenum; + int32_t vfc_refcount; + int32_t vfc_flags; + uint32_t vfc_next; +}; + +static int +vfsconf2x32(struct sysctl_req *req, struct vfsconf *vfsp) +{ + struct xvfsconf32 xvfsp; + + strcpy(xvfsp.vfc_name, vfsp->vfc_name); + xvfsp.vfc_typenum =3D vfsp->vfc_typenum; + xvfsp.vfc_refcount =3D vfsp->vfc_refcount; + xvfsp.vfc_flags =3D vfsp->vfc_flags; + xvfsp.vfc_vfsops =3D 0; + xvfsp.vfc_next =3D 0; + return (SYSCTL_OUT(req, &xvfsp, sizeof(xvfsp))); } +#endif =20 /* * Top level filesystem related information gathering. @@ -3134,14 +3163,16 @@ static int sysctl_vfs_conflist(SYSCTL_HANDLER_ARGS) { struct vfsconf *vfsp; - struct xvfsconf xvfsp; int error; =20 error =3D 0; TAILQ_FOREACH(vfsp, &vfsconf, vfc_list) { - bzero(&xvfsp, sizeof(xvfsp)); - vfsconf2x(vfsp, &xvfsp); - error =3D SYSCTL_OUT(req, &xvfsp, sizeof xvfsp); +#ifdef COMPAT_FREEBSD32 + if (req->flags & SCTL_MASK32) + error =3D vfsconf2x32(req, vfsp); + else +#endif + error =3D vfsconf2x(req, vfsp); if (error) break; } @@ -3161,7 +3192,6 @@ vfs_sysctl(SYSCTL_HANDLER_ARGS) int *name =3D (int *)arg1 - 1; /* XXX */ u_int namelen =3D arg2 + 1; /* XXX */ struct vfsconf *vfsp; - struct xvfsconf xvfsp; =20 log(LOG_WARNING, "userland calling deprecated sysctl, " "please rebuild world\n"); @@ -3185,9 +3215,12 @@ vfs_sysctl(SYSCTL_HANDLER_ARGS) break; if (vfsp =3D=3D NULL) return (EOPNOTSUPP); - bzero(&xvfsp, sizeof(xvfsp)); - vfsconf2x(vfsp, &xvfsp); - return (SYSCTL_OUT(req, &xvfsp, sizeof(xvfsp))); +#ifdef COMPAT_FREEBSD32 + if (req->flags & SCTL_MASK32) + return (vfsconf2x32(req, vfsp)); + else +#endif + return (vfsconf2x(req, vfsp)); } return (EOPNOTSUPP); } --hblleJHDxiLJUoyx Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (FreeBSD) iEYEARECAAYFAlAyLi0ACgkQC3+MBN1Mb4gyRQCeNC9eH+7VtlGP6EgSdOrFANgf I7sAoNAGHbekSdJ5R8eSMlN+V5naO/ve =Oj1N -----END PGP SIGNATURE----- --hblleJHDxiLJUoyx--