svn commit: r252886 - stable/9/sys/kern

Mateusz Guzik mjg at FreeBSD.org
Sat Jul 6 12:56:31 UTC 2013


Author: mjg
Date: Sat Jul  6 12:56:30 2013
New Revision: 252886
URL: http://svnweb.freebsd.org/changeset/base/252886

Log:
  MFC r252415, r252422:
  
  acct: reduce code duplication by using acct_disable as cleanup for
  failed kproc_create
  
  acct: create a special plimit object and set it for exiting processe
  instead of allocating new one each time
  
  All limits are set to RLIM_INFINITY which sould be ok (even though we
  care only about RLIMT_FSIZE in this case).

Modified:
  stable/9/sys/kern/kern_acct.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/kern/kern_acct.c
==============================================================================
--- stable/9/sys/kern/kern_acct.c	Sat Jul  6 11:39:37 2013	(r252885)
+++ stable/9/sys/kern/kern_acct.c	Sat Jul  6 12:56:30 2013	(r252886)
@@ -133,6 +133,7 @@ static int		 acct_configured;
 static int		 acct_suspended;
 static struct vnode	*acct_vp;
 static struct ucred	*acct_cred;
+static struct plimit	*acct_limit;
 static int		 acct_flags;
 static struct sx	 acct_sx;
 
@@ -196,7 +197,7 @@ int
 sys_acct(struct thread *td, struct acct_args *uap)
 {
 	struct nameidata nd;
-	int error, flags, vfslocked, replacing;
+	int error, flags, i, vfslocked, replacing;
 
 	error = priv_check(td, PRIV_ACCT);
 	if (error)
@@ -274,6 +275,15 @@ sys_acct(struct thread *td, struct acct_
 	}
 
 	/*
+	 * Create our own plimit object without limits. It will be assigned
+	 * to exiting processes.
+	 */
+	acct_limit = lim_alloc();
+	for (i = 0; i < RLIM_NLIMITS; i++)
+		acct_limit->pl_rlimit[i].rlim_cur =
+		    acct_limit->pl_rlimit[i].rlim_max = RLIM_INFINITY;
+
+	/*
 	 * Save the new accounting file vnode, and schedule the new
 	 * free space watcher.
 	 */
@@ -292,13 +302,8 @@ sys_acct(struct thread *td, struct acct_
 		    "accounting");
 		if (error) {
 			vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount);
-			(void) vn_close(acct_vp, acct_flags, acct_cred, td);
+			(void) acct_disable(td, 0);
 			VFS_UNLOCK_GIANT(vfslocked);
-			crfree(acct_cred);
-			acct_configured = 0;
-			acct_vp = NULL;
-			acct_cred = NULL;
-			acct_flags = 0;
 			sx_xunlock(&acct_sx);
 			log(LOG_NOTICE, "Unable to start accounting thread\n");
 			return (error);
@@ -323,6 +328,7 @@ acct_disable(struct thread *td, int logg
 	sx_assert(&acct_sx, SX_XLOCKED);
 	error = vn_close(acct_vp, acct_flags, acct_cred, td);
 	crfree(acct_cred);
+	lim_free(acct_limit);
 	acct_configured = 0;
 	acct_vp = NULL;
 	acct_cred = NULL;
@@ -343,7 +349,7 @@ acct_process(struct thread *td)
 {
 	struct acctv2 acct;
 	struct timeval ut, st, tmp;
-	struct plimit *newlim, *oldlim;
+	struct plimit *oldlim;
 	struct proc *p;
 	struct rusage ru;
 	int t, ret, vfslocked;
@@ -419,7 +425,6 @@ acct_process(struct thread *td)
 
 	/* (8) The boolean flags that tell how the process terminated, etc. */
 	acct.ac_flagx = p->p_acflag;
-	PROC_UNLOCK(p);
 
 	/* Setup ancillary structure fields. */
 	acct.ac_flagx |= ANVER;
@@ -428,14 +433,10 @@ acct_process(struct thread *td)
 	acct.ac_len = acct.ac_len2 = sizeof(acct);
 
 	/*
-	 * Eliminate any file size rlimit.
+	 * Eliminate rlimits (file size limit in particular).
 	 */
-	newlim = lim_alloc();
-	PROC_LOCK(p);
 	oldlim = p->p_limit;
-	lim_copy(newlim, oldlim);
-	newlim->pl_rlimit[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
-	p->p_limit = newlim;
+	p->p_limit = lim_hold(acct_limit);
 	PROC_UNLOCK(p);
 	lim_free(oldlim);
 


More information about the svn-src-stable-9 mailing list