summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry Jelinek <jerry.jelinek@joyent.com>2020-03-05 11:59:13 +0000
committerJerry Jelinek <jerry.jelinek@joyent.com>2020-03-05 11:59:13 +0000
commit37db1b725f2132b140356cbf6ba045af1d7dfd97 (patch)
treeae8d7711c278889f29dff53e3f0c73da2b835e9e
parentf170e679d64050d73ddc2fc68bdc9136f34dddc6 (diff)
parent8950e535f42dd006f8cfb2122c94f6b7557757e0 (diff)
downloadillumos-joyent-37db1b725f2132b140356cbf6ba045af1d7dfd97.tar.gz
[illumos-gate merge]
commit 8950e535f42dd006f8cfb2122c94f6b7557757e0 12261 pfiles(1) could show any filesystem endpoints for a door
-rw-r--r--usr/src/cmd/ptools/pfiles/pfiles.c13
-rw-r--r--usr/src/uts/common/fs/namefs/namevfs.c27
-rw-r--r--usr/src/uts/common/fs/proc/prsubr.c70
-rw-r--r--usr/src/uts/common/sys/fs/namenode.h8
-rw-r--r--usr/src/uts/intel/procfs/Makefile3
-rw-r--r--usr/src/uts/sparc/procfs/Makefile20
6 files changed, 111 insertions, 30 deletions
diff --git a/usr/src/cmd/ptools/pfiles/pfiles.c b/usr/src/cmd/ptools/pfiles/pfiles.c
index c9540a466c..474650faa4 100644
--- a/usr/src/cmd/ptools/pfiles/pfiles.c
+++ b/usr/src/cmd/ptools/pfiles/pfiles.c
@@ -205,13 +205,19 @@ intr(int sig)
/* ------ begin specific code ------ */
+static int
+show_paths(uint_t type, const void *data, size_t len, void *arg __unused)
+{
+ if (type == PR_PATHNAME)
+ (void) printf(" %.*s\n", len, data);
+ return (0);
+}
static int
show_file(void *data, const prfdinfo_t *info)
{
struct ps_prochandle *Pr = data;
char unknown[12];
- const char *path;
char *s;
mode_t mode;
@@ -259,8 +265,6 @@ show_file(void *data, const prfdinfo_t *info)
(void) printf(" rdev:%u,%u\n",
(unsigned)info->pr_rmajor, (unsigned)info->pr_rminor);
- path = proc_fdinfo_misc(info, PR_PATHNAME, NULL);
-
if (!nflag) {
dofcntl(Pr, info,
(mode & (S_IFMT|S_ENFMT|S_IXGRP)) == (S_IFREG|S_ENFMT),
@@ -285,8 +289,7 @@ show_file(void *data, const prfdinfo_t *info)
}
}
- if (path != NULL)
- (void) printf(" %s\n", path);
+ (void) proc_fdinfowalk(info, show_paths, NULL);
if (info->pr_offset != -1) {
(void) printf(" offset:%lld\n",
diff --git a/usr/src/uts/common/fs/namefs/namevfs.c b/usr/src/uts/common/fs/namefs/namevfs.c
index 9952f0a742..63e618de11 100644
--- a/usr/src/uts/common/fs/namefs/namevfs.c
+++ b/usr/src/uts/common/fs/namefs/namevfs.c
@@ -21,6 +21,7 @@
/*
* Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2017 by Delphix. All rights reserved.
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
*/
/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
@@ -182,6 +183,31 @@ namefind(vnode_t *vp, vnode_t *mnt)
}
/*
+ * For each namenode that has nm_filevp == vp, call the provided function
+ * with the namenode as an argument. This finds all of the namefs entries
+ * which are mounted on vp; note that there can be more than one.
+ */
+int
+nm_walk_mounts(const vnode_t *vp, nm_walk_mounts_f *func, cred_t *cr, void *arg)
+{
+ struct namenode *np;
+ int ret = 0;
+
+ mutex_enter(&ntable_lock);
+
+ for (np = *NM_FILEVP_HASH(vp); np != NULL; np = np->nm_nextp) {
+ if (np->nm_filevp == vp) {
+ if ((ret = func(np, cr, arg)) != 0)
+ break;
+ }
+ }
+
+ mutex_exit(&ntable_lock);
+
+ return (ret);
+}
+
+/*
* Force the unmouting of a file descriptor from ALL of the nodes
* that it was mounted to.
* At the present time, the only usage for this routine is in the
@@ -480,6 +506,7 @@ nm_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *crp)
newvp->v_rdev = filevp->v_rdev;
newvp->v_data = (caddr_t)nodep;
VFS_HOLD(vfsp);
+ vn_copypath(mvp, newvp);
vn_exists(newvp);
/*
diff --git a/usr/src/uts/common/fs/proc/prsubr.c b/usr/src/uts/common/fs/proc/prsubr.c
index 0a9589a373..08aee63610 100644
--- a/usr/src/uts/common/fs/proc/prsubr.c
+++ b/usr/src/uts/common/fs/proc/prsubr.c
@@ -75,6 +75,7 @@
#include <sys/autoconf.h>
#include <sys/dtrace.h>
#include <sys/timod.h>
+#include <sys/fs/namenode.h>
#include <netinet/udp.h>
#include <netinet/tcp.h>
#include <inet/cc.h>
@@ -2552,7 +2553,11 @@ prfdinfopath(proc_t *p, vnode_t *vp, list_t *data, cred_t *cred)
size_t pathlen;
size_t sz = 0;
- pathlen = MAXPATHLEN + 1;
+ /*
+ * The global zone's path to a file in a non-global zone can exceed
+ * MAXPATHLEN.
+ */
+ pathlen = MAXPATHLEN * 2 + 1;
pathname = kmem_alloc(pathlen, KM_SLEEP);
if (vnodetopath(NULL, vp, pathname, pathlen, cred) == 0) {
@@ -2561,6 +2566,7 @@ prfdinfopath(proc_t *p, vnode_t *vp, list_t *data, cred_t *cred)
}
kmem_free(pathname, pathlen);
+
return (sz);
}
@@ -2789,6 +2795,22 @@ prfdinfosockopt(vnode_t *vp, list_t *data, cred_t *cred)
return (sz);
}
+typedef struct prfdinfo_nm_path_cbdata {
+ proc_t *nmp_p;
+ u_offset_t nmp_sz;
+ list_t *nmp_data;
+} prfdinfo_nm_path_cbdata_t;
+
+static int
+prfdinfo_nm_path(const struct namenode *np, cred_t *cred, void *arg)
+{
+ prfdinfo_nm_path_cbdata_t *cb = arg;
+
+ cb->nmp_sz += prfdinfopath(cb->nmp_p, np->nm_vnode, cb->nmp_data, cred);
+
+ return (0);
+}
+
u_offset_t
prgetfdinfosize(proc_t *p, vnode_t *vp, cred_t *cred)
{
@@ -2801,8 +2823,23 @@ prgetfdinfosize(proc_t *p, vnode_t *vp, cred_t *cred)
sz = offsetof(prfdinfo_t, pr_misc) + sizeof (pr_misc_header_t);
/* Pathname */
- if (vp->v_type != VSOCK && vp->v_type != VDOOR)
+ switch (vp->v_type) {
+ case VDOOR: {
+ prfdinfo_nm_path_cbdata_t cb = {
+ .nmp_p = p,
+ .nmp_data = NULL,
+ .nmp_sz = 0
+ };
+
+ (void) nm_walk_mounts(vp, prfdinfo_nm_path, cred, &cb);
+ sz += cb.nmp_sz;
+ break;
+ }
+ case VSOCK:
+ break;
+ default:
sz += prfdinfopath(p, vp, NULL, cred);
+ }
/* Socket options */
if (vp->v_type == VSOCK)
@@ -2946,14 +2983,31 @@ prgetfdinfo(proc_t *p, vnode_t *vp, prfdinfo_t *fdinfo, cred_t *cred,
}
}
- /*
- * Don't attempt to determine the vnode path for a socket or a door
- * as it will cause a linear scan of the dnlc table given there is no
- * v_path associated with the vnode.
- */
- if (vp->v_type != VSOCK && vp->v_type != VDOOR)
+ /* pathname */
+
+ switch (vp->v_type) {
+ case VDOOR: {
+ prfdinfo_nm_path_cbdata_t cb = {
+ .nmp_p = p,
+ .nmp_data = data,
+ .nmp_sz = 0
+ };
+
+ (void) nm_walk_mounts(vp, prfdinfo_nm_path, cred, &cb);
+ break;
+ }
+ case VSOCK:
+ /*
+ * Don't attempt to determine the path for a socket as the
+ * vnode has no associated v_path. It will cause a linear scan
+ * of the dnlc table and result in no path being found.
+ */
+ break;
+ default:
(void) prfdinfopath(p, vp, data, cred);
+ }
+ /* socket options */
if (vp->v_type == VSOCK)
(void) prfdinfosockopt(vp, data, cred);
diff --git a/usr/src/uts/common/sys/fs/namenode.h b/usr/src/uts/common/sys/fs/namenode.h
index 9ebf2cf1ca..24d276b6c3 100644
--- a/usr/src/uts/common/sys/fs/namenode.h
+++ b/usr/src/uts/common/sys/fs/namenode.h
@@ -26,6 +26,10 @@
* Use is subject to license terms.
*/
+/*
+ * Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
+ */
+
#ifndef _SYS_FS_NAMENODE_H
#define _SYS_FS_NAMENODE_H
@@ -93,6 +97,10 @@ extern struct vnodeops *nm_vnodeops;
extern const struct fs_operation_def nm_vnodeops_template[];
extern kmutex_t ntable_lock;
+typedef int nm_walk_mounts_f(const struct namenode *, cred_t *, void *);
+extern int nm_walk_mounts(const vnode_t *, nm_walk_mounts_f *, cred_t *,
+ void *);
+
#endif /* _KERNEL */
#ifdef __cplusplus
diff --git a/usr/src/uts/intel/procfs/Makefile b/usr/src/uts/intel/procfs/Makefile
index 1db5848438..630b6a25d3 100644
--- a/usr/src/uts/intel/procfs/Makefile
+++ b/usr/src/uts/intel/procfs/Makefile
@@ -25,6 +25,7 @@
# Use is subject to license terms.
#
# Copyright 2019 Joyent, Inc.
+# Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
#
# This makefile drives the production of the procfs file system
@@ -83,6 +84,8 @@ $(OBJS_DIR)/prsubr.o := SMOFF += all_func_returns
$(OBJS_DIR)/prcontrol.o := SMOFF += all_func_returns
$(OBJS_DIR)/prioctl.o := SMOFF += signed
+LDFLAGS += -dy -Nfs/namefs
+
#
# Default build targets.
#
diff --git a/usr/src/uts/sparc/procfs/Makefile b/usr/src/uts/sparc/procfs/Makefile
index 8dd05fe72b..3226238bd4 100644
--- a/usr/src/uts/sparc/procfs/Makefile
+++ b/usr/src/uts/sparc/procfs/Makefile
@@ -23,6 +23,7 @@
# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
+# Copyright 2020 OmniOS Community Edition (OmniOSce) Association.
#
# This makefile drives the production of the procfs file system
@@ -41,7 +42,6 @@ UTSBASE = ../..
#
MODULE = procfs
OBJECTS = $(PROC_OBJS:%=$(OBJS_DIR)/%)
-LINTS = $(PROC_OBJS:%.o=$(LINTS_DIR)/%.ln)
ROOTMODULE = $(ROOT_FS_DIR)/$(MODULE)
#
@@ -53,7 +53,6 @@ include $(UTSBASE)/sparc/Makefile.sparc
# Define targets
#
ALL_TARGET = $(BINARY)
-LINT_TARGET = $(MODULE).lint
INSTALL_TARGET = $(BINARY) $(ROOTMODULE)
#
@@ -64,19 +63,12 @@ $(MODSTUBS_O) := AS_CPPFLAGS += -DPROC_MODULE
CLEANFILES += $(MODSTUBS_O)
CFLAGS += $(CCVERBOSE)
-#
-# For now, disable these lint checks; maintainers should endeavor
-# to investigate and remove these for maximum lint coverage.
-# Please do not carry these forward to new Makefiles.
-#
-LINTTAGS += -erroff=E_BAD_PTR_CAST_ALIGN
-LINTTAGS += -erroff=E_PTRDIFF_OVERFLOW
-LINTTAGS += -erroff=E_ASSIGN_NARROW_CONV
-
CERRWARN += -_gcc=-Wno-parentheses
CERRWARN += -_gcc=-Wno-switch
CERRWARN += $(CNOWARN_UNINIT)
+LDFLAGS += -dy -Nfs/namefs
+
#
# Default build targets.
#
@@ -90,12 +82,6 @@ clean: $(CLEAN_DEPS)
clobber: $(CLOBBER_DEPS)
-lint: $(LINT_DEPS)
-
-modlintlib: $(MODLINTLIB_DEPS)
-
-clean.lint: $(CLEAN_LINT_DEPS)
-
install: $(INSTALL_DEPS)
#