diff options
author | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-09-06 15:09:43 +0000 |
---|---|---|
committer | Jerry Jelinek <jerry.jelinek@joyent.com> | 2017-09-06 15:10:34 +0000 |
commit | 468fe59992746b536d9e84763d00706eb773e2cd (patch) | |
tree | a9efcdcc61e12130273294fd0f6e9be3fe781319 /usr/src | |
parent | 7e83ccc4caf287e6f6e515d104473ebe1339e7a0 (diff) | |
download | illumos-joyent-468fe59992746b536d9e84763d00706eb773e2cd.tar.gz |
OS-6290 improve procfs exit handling
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Jason King <jason.king@joyent.com>
Approved by: Patrick Mooney <patrick.mooney@joyent.com>
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/brand/lx/procfs/lx_prsubr.c | 4 | ||||
-rw-r--r-- | usr/src/uts/common/fs/lxproc/lxpr_subr.c | 6 | ||||
-rw-r--r-- | usr/src/uts/common/fs/lxproc/lxpr_vnops.c | 17 | ||||
-rw-r--r-- | usr/src/uts/common/fs/proc/prvnops.c | 2 |
4 files changed, 16 insertions, 13 deletions
diff --git a/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c b/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c index d103868737..08d40a4a67 100644 --- a/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c +++ b/usr/src/uts/common/brand/lx/procfs/lx_prsubr.c @@ -530,7 +530,7 @@ lxpr_getnode(vnode_t *dp, lxpr_nodetype_t type, proc_t *p, int desc) * ignores nodes in the SIDL state so we'll never get a node * that isn't already in the SRUN state. */ - if (p->p_stat == SZOMB) { + if (p->p_stat == SZOMB || (p->p_flag & SEXITING) != 0) { lxpnp->lxpr_realvp = NULL; } else { ASSERT(MUTEX_HELD(&p->p_lock)); @@ -546,7 +546,7 @@ lxpr_getnode(vnode_t *dp, lxpr_nodetype_t type, proc_t *p, int desc) case LXPR_PID_ROOTDIR: ASSERT(p != NULL); /* Zombie check. see locking comment above */ - if (p->p_stat == SZOMB) { + if (p->p_stat == SZOMB || (p->p_flag & SEXITING) != 0) { lxpnp->lxpr_realvp = NULL; } else { ASSERT(MUTEX_HELD(&p->p_lock)); diff --git a/usr/src/uts/common/fs/lxproc/lxpr_subr.c b/usr/src/uts/common/fs/lxproc/lxpr_subr.c index 6667233693..24c010a463 100644 --- a/usr/src/uts/common/fs/lxproc/lxpr_subr.c +++ b/usr/src/uts/common/fs/lxproc/lxpr_subr.c @@ -24,7 +24,7 @@ */ /* - * Copyright 2016, Joyent, Inc. + * Copyright 2017, Joyent, Inc. */ #include <sys/varargs.h> @@ -410,7 +410,7 @@ lxpr_getnode(vnode_t *dp, lxpr_nodetype_t type, proc_t *p, int fd) * ignores nodes in the SIDL state so we'll never get a node * that isn't already in the SRUN state. */ - if (p->p_stat == SZOMB) { + if (p->p_stat == SZOMB || (p->p_flag & SEXITING) != 0) { lxpnp->lxpr_realvp = NULL; } else { ASSERT(MUTEX_HELD(&p->p_lock)); @@ -426,7 +426,7 @@ lxpr_getnode(vnode_t *dp, lxpr_nodetype_t type, proc_t *p, int fd) case LXPR_PID_ROOTDIR: ASSERT(p != NULL); /* Zombie check. see locking comment above */ - if (p->p_stat == SZOMB) { + if (p->p_stat == SZOMB || (p->p_flag & SEXITING) != 0) { lxpnp->lxpr_realvp = NULL; } else { ASSERT(MUTEX_HELD(&p->p_lock)); diff --git a/usr/src/uts/common/fs/lxproc/lxpr_vnops.c b/usr/src/uts/common/fs/lxproc/lxpr_vnops.c index 9b02fea244..85ef7b4b9b 100644 --- a/usr/src/uts/common/fs/lxproc/lxpr_vnops.c +++ b/usr/src/uts/common/fs/lxproc/lxpr_vnops.c @@ -24,7 +24,7 @@ */ /* - * Copyright 2016 Joyent, Inc. + * Copyright 2017 Joyent, Inc. */ /* @@ -1004,7 +1004,8 @@ lxpr_read_pid_status(lxpr_node_t *lxpnp, lxpr_uiobuf_t *uiobuf) crfree(cr); as = p->p_as; - if ((p->p_stat != SZOMB) && !(p->p_flag & SSYS) && (as != &kas)) { + if ((p->p_stat != SZOMB) && !(p->p_flag & (SSYS | SEXITING)) && + (as != &kas)) { mutex_exit(&p->p_lock); AS_LOCK_ENTER(as, RW_READER); vsize = as->a_resvsize; @@ -2283,8 +2284,8 @@ lxpr_lookup_not_a_dir(vnode_t *dp, char *comp) /* ARGSUSED */ static int lxpr_lookup(vnode_t *dp, char *comp, vnode_t **vpp, pathname_t *pathp, - int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct, - int *direntflags, pathname_t *realpnp) + int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct, + int *direntflags, pathname_t *realpnp) { lxpr_node_t *lxpnp = VTOLXP(dp); lxpr_nodetype_t type = lxpnp->lxpr_type; @@ -2416,7 +2417,8 @@ lxpr_lookup_fddir(vnode_t *dp, char *comp) * If the process is a zombie or system process * it can't have any open files. */ - if ((p->p_stat == SZOMB) || (p->p_flag & SSYS) || (p->p_as == &kas)) { + if ((p->p_stat == SZOMB) || (p->p_flag & (SSYS | SEXITING)) || + (p->p_as == &kas)) { lxpr_unlock(p); return (NULL); } @@ -2550,7 +2552,7 @@ lxpr_lookup_procdir(vnode_t *dp, char *comp) /* ARGSUSED */ static int lxpr_readdir(vnode_t *dp, uio_t *uiop, cred_t *cr, int *eofp, - caller_context_t *ct, int flags) + caller_context_t *ct, int flags) { lxpr_node_t *lxpnp = VTOLXP(dp); lxpr_nodetype_t type = lxpnp->lxpr_type; @@ -2889,7 +2891,8 @@ lxpr_readdir_fddir(lxpr_node_t *lxpnp, uio_t *uiop, int *eofp) if (p == NULL) return (ENOENT); - if ((p->p_stat == SZOMB) || (p->p_flag & SSYS) || (p->p_as == &kas)) + if ((p->p_stat == SZOMB) || (p->p_flag & (SSYS | SEXITING)) || + (p->p_as == &kas)) fddirsize = 0; /* diff --git a/usr/src/uts/common/fs/proc/prvnops.c b/usr/src/uts/common/fs/proc/prvnops.c index 462d62dcd7..7d6cb037c1 100644 --- a/usr/src/uts/common/fs/proc/prvnops.c +++ b/usr/src/uts/common/fs/proc/prvnops.c @@ -3739,7 +3739,7 @@ pr_lookup_procdir(vnode_t *dp, char *comp) /* initialize the new prcommon struct */ if ((p->p_flag & SSYS) || p->p_as == &kas) pcp->prc_flags |= PRC_SYS; - if (p->p_stat == SZOMB) + if (p->p_stat == SZOMB || (p->p_flag & SEXITING) != 0) pcp->prc_flags |= PRC_DESTROY; pcp->prc_proc = p; pcp->prc_datamodel = p->p_model; |