Print this page
OS-3969 lx brand: reading process map induces many DNLC scans

@@ -19,10 +19,11 @@
  * CDDL HEADER END
  */
 
 /*
  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
+ * Copyright (c) 2015, Joyent, Inc. All rights reserved.
  * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
  */
 
 /*      Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T     */
 /*        All Rights Reserved   */

@@ -55,10 +56,11 @@
 #include <sys/dirent.h>
 #include <c2/audit.h>
 #include <sys/zone.h>
 #include <sys/dnlc.h>
 #include <sys/fs/snode.h>
+#include <sys/brand.h>
 
 /* Controls whether paths are stored with vnodes. */
 int vfs_vnode_path = 1;
 
 int

@@ -1406,12 +1408,25 @@
                 mutex_exit(&vp->v_lock);
         }
 
         pn_free(&pn);
 
-        if (vp->v_type != VDIR) {
+        if (PROC_IS_BRANDED(curproc)) {
                 /*
+                 * If v_path doesn't work out and we're in a branded zone,
+                 * we're not going to bother doing more work here:  because
+                 * directories from the global can be lofs mounted into odd
+                 * locations (e.g., /native in an lx zone), it is likely that
+                 * the DNLC reverse lookup will yield nothing.  Indeed, the
+                 * only certainty is that the DNLC reverse lookup will be
+                 * exceedingly painful; we save ourselves the substantial
+                 * grief of scanning the entire DNLC and kick out with ENOENT
+                 * in this case.
+                 */
+                ret = ENOENT;
+        } else if (vp->v_type != VDIR) {
+                /*
                  * If we don't have a directory, try to find it in the dnlc via
                  * reverse lookup.  Once this is found, we can use the regular
                  * directory search to find the full path.
                  */
                 if ((pvp = dnlc_reverse_lookup(vp, path, MAXNAMELEN)) != NULL) {