kern/73777: [linux] [patch] linux emulation: root dir special
handling useless and harmful
Andriy Gapon
avg at icyb.net.ua
Mon Mar 3 21:10:04 UTC 2008
The following reply was made to PR kern/73777; it has been noted by GNATS.
From: Andriy Gapon <avg at icyb.net.ua>
To: bug-followup at FreeBSD.org
Cc: Alexander Leidinger <Alexander at leidinger.net>
Subject: Re: kern/73777: [linux] [patch] linux emulation: root dir special
handling useless and harmful
Date: Mon, 03 Mar 2008 22:14:40 +0200
This is a multi-part message in MIME format.
--------------050001090401010706020209
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
An updated patch that makes the proposed behavior controlled by sysctl.
Present behavior is the default.
--
Andriy Gapon
--------------050001090401010706020209
Content-Type: text/x-patch;
name="rootdir-7.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="rootdir-7.patch"
--- sys/kern/vfs_lookup.c.orig 2007-09-21 13:16:56.000000000 +0300
+++ sys/kern/vfs_lookup.c 2008-03-03 22:03:16.000000000 +0200
@@ -96,6 +96,11 @@
SYSCTL_INT(_vfs, OID_AUTO, lookup_shared, CTLFLAG_RW, &lookup_shared, 0,
"Enables/Disables shared locks for path name translation");
+static int alt_root_is_real_root = 1;
+SYSCTL_INT(_vfs, OID_AUTO, alt_root_is_real_root, CTLFLAG_RW,
+ &alt_root_is_real_root, 0,
+ "Alternative/emulation root directory resolves to the real root");
+
/*
* Convert a pathname into a pointer to a locked vnode.
*
@@ -1071,26 +1076,28 @@
if (error != 0)
goto keeporig;
- /*
- * We now compare the vnode of the prefix to the one
- * vnode asked. If they resolve to be the same, then we
- * ignore the match so that the real root gets used.
- * This avoids the problem of traversing "../.." to find the
- * root directory and never finding it, because "/" resolves
- * to the emulation root directory. This is expensive :-(
- */
- NDINIT(&ndroot, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, prefix,
- td);
-
- /* We shouldn't ever get an error from this namei(). */
- error = namei(&ndroot);
- if (error == 0) {
- if (nd.ni_vp == ndroot.ni_vp)
- error = ENOENT;
-
- NDFREE(&ndroot, NDF_ONLY_PNBUF);
- vrele(ndroot.ni_vp);
- VFS_UNLOCK_GIANT(NDHASGIANT(&ndroot));
+ if (alt_root_is_real_root) {
+ /*
+ * We now compare the vnode of the prefix to the one
+ * vnode asked. If they resolve to be the same, then we
+ * ignore the match so that the real root gets used.
+ * This avoids the problem of traversing "../.." to find the
+ * root directory and never finding it, because "/" resolves
+ * to the emulation root directory. This is expensive :-(
+ */
+ NDINIT(&ndroot, LOOKUP, FOLLOW | MPSAFE, UIO_SYSSPACE, prefix,
+ td);
+
+ /* We shouldn't ever get an error from this namei(). */
+ error = namei(&ndroot);
+ if (error == 0) {
+ if (nd.ni_vp == ndroot.ni_vp)
+ error = ENOENT;
+
+ NDFREE(&ndroot, NDF_ONLY_PNBUF);
+ vrele(ndroot.ni_vp);
+ VFS_UNLOCK_GIANT(NDHASGIANT(&ndroot));
+ }
}
}
--------------050001090401010706020209--
More information about the freebsd-emulation
mailing list