aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-05-13 23:48:58 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-06-13 01:22:33 +0000
commit11cfede1e62afa1ff00cf97107bc48ebe1561ecb (patch)
treee8d6fb9d489de65fe11ea7fb7327997887547f27
parentaf3dce614155dd3264c7248e0fd082d2c214890a (diff)
downloadsrc-11cfede1e62afa1ff00cf97107bc48ebe1561ecb.tar.gz
src-11cfede1e62afa1ff00cf97107bc48ebe1561ecb.zip
accounting: explicitly mark the exiting thread as doing accounting
(cherry picked from commit 9bb84c23e762e7d1b6154ef4afdcc80662692e76)
-rw-r--r--sys/kern/kern_acct.c26
-rw-r--r--sys/kern/vfs_vnops.c3
-rw-r--r--sys/sys/proc.h1
3 files changed, 8 insertions, 22 deletions
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 675113c6b2ba..4c1efada10da 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -141,7 +141,6 @@ 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;
@@ -206,7 +205,7 @@ int
sys_acct(struct thread *td, struct acct_args *uap)
{
struct nameidata nd;
- int error, flags, i, replacing;
+ int error, flags, replacing;
error = priv_check(td, PRIV_ACCT);
if (error)
@@ -277,15 +276,6 @@ sys_acct(struct thread *td, struct acct_args *uap)
}
/*
- * 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.
*/
@@ -328,7 +318,6 @@ acct_disable(struct thread *td, int logging)
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;
@@ -349,7 +338,6 @@ acct_process(struct thread *td)
{
struct acctv3 acct;
struct timeval ut, st, tmp;
- struct plimit *oldlim;
struct proc *p;
struct rusage ru;
int t, ret;
@@ -374,6 +362,7 @@ acct_process(struct thread *td)
}
p = td->td_proc;
+ td->td_pflags2 |= TDP2_ACCT;
/*
* Get process accounting information.
@@ -426,6 +415,8 @@ 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;
acct.ac_zero = 0;
@@ -433,20 +424,13 @@ acct_process(struct thread *td)
acct.ac_len = acct.ac_len2 = sizeof(acct);
/*
- * Eliminate rlimits (file size limit in particular).
- */
- oldlim = p->p_limit;
- p->p_limit = lim_hold(acct_limit);
- PROC_UNLOCK(p);
- lim_free(oldlim);
-
- /*
* Write the accounting information to the file.
*/
ret = vn_rdwr(UIO_WRITE, acct_vp, (caddr_t)&acct, sizeof (acct),
(off_t)0, UIO_SYSSPACE, IO_APPEND|IO_UNIT, acct_cred, NOCRED,
NULL, td);
sx_sunlock(&acct_sx);
+ td->td_pflags2 &= ~TDP2_ACCT;
return (ret);
}
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index 4ce4678f292f..8be30df40dc5 100644
--- a/sys/kern/vfs_vnops.c
+++ b/sys/kern/vfs_vnops.c
@@ -2361,7 +2361,8 @@ vn_rlimit_fsize(const struct vnode *vp, const struct uio *uio,
struct thread *td)
{
- if (vp->v_type != VREG || td == NULL)
+ if (vp->v_type != VREG || td == NULL ||
+ (td->td_pflags2 & TDP2_ACCT) != 0)
return (0);
if ((uoff_t)uio->uio_offset + uio->uio_resid >
lim_cur(td, RLIMIT_FSIZE)) {
diff --git a/sys/sys/proc.h b/sys/sys/proc.h
index b0fc13a449cb..b47af58c34be 100644
--- a/sys/sys/proc.h
+++ b/sys/sys/proc.h
@@ -527,6 +527,7 @@ do { \
#define TDP2_SBPAGES 0x00000001 /* Owns sbusy on some pages */
#define TDP2_COMPAT32RB 0x00000002 /* compat32 ABI for robust lists */
+#define TDP2_ACCT 0x00000004 /* Doing accounting */
/*
* Reasons that the current thread can not be run yet.