diff options
Diffstat (limited to 'usr/src/uts/common/syscall/uadmin.c')
| -rw-r--r-- | usr/src/uts/common/syscall/uadmin.c | 10 | 
1 files changed, 6 insertions, 4 deletions
| diff --git a/usr/src/uts/common/syscall/uadmin.c b/usr/src/uts/common/syscall/uadmin.c index 858305504d..dfe7f22d44 100644 --- a/usr/src/uts/common/syscall/uadmin.c +++ b/usr/src/uts/common/syscall/uadmin.c @@ -22,7 +22,7 @@  /*   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.   * Use is subject to license terms. - * Copyright 2013 Joyent, Inc.  All rights reserved. + * Copyright 2016 Joyent, Inc.   */  #include <sys/param.h> @@ -78,7 +78,7 @@ volatile int fastreboot_dryrun = 0;   * system with many zones.   */  void -killall(zoneid_t zoneid) +killall(zoneid_t zoneid, boolean_t force)  {  	proc_t *p; @@ -108,7 +108,7 @@ killall(zoneid_t zoneid)  		    p->p_stat != SIDL &&  		    p->p_stat != SZOMB) {  			mutex_enter(&p->p_lock); -			if (sigismember(&p->p_sig, SIGKILL)) { +			if (!force && sigismember(&p->p_sig, SIGKILL)) {  				mutex_exit(&p->p_lock);  				p = p->p_next;  			} else { @@ -245,12 +245,13 @@ kadmin(int cmd, int fcn, void *mdep, cred_t *credp)  		 */  		zone_shutdown_global(); -		killall(ALL_ZONES); +		killall(ALL_ZONES, B_FALSE);  		/*  		 * If we are calling kadmin() from a kernel context then we  		 * do not release these resources.  		 */  		if (ttoproc(curthread) != &p0) { +			mutex_enter(&curproc->p_lock);  			VN_RELE(PTOU(curproc)->u_cdir);  			if (PTOU(curproc)->u_rdir)  				VN_RELE(PTOU(curproc)->u_rdir); @@ -260,6 +261,7 @@ kadmin(int cmd, int fcn, void *mdep, cred_t *credp)  			PTOU(curproc)->u_cdir = rootdir;  			PTOU(curproc)->u_rdir = NULL;  			PTOU(curproc)->u_cwd = NULL; +			mutex_exit(&curproc->p_lock);  		}  		/* | 
