Print this page
OS-3969 lx brand: reading process map induces many DNLC scans
*** 19,28 ****
--- 19,29 ----
* 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,64 ****
--- 56,66 ----
#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,1417 ****
mutex_exit(&vp->v_lock);
}
pn_free(&pn);
! 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) {
--- 1408,1432 ----
mutex_exit(&vp->v_lock);
}
pn_free(&pn);
! 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) {