summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2012-05-02 14:25:39 +0000
committerjhb <jhb@FreeBSD.org>2012-05-02 14:25:39 +0000
commitc96b8c07a415e367c09ed62b6690acaceefb47ff (patch)
tree3f1ae94d4af6371a0c916975d8c8cb9082aa73f6
parent0a9ea4a8c0282ebf9678de925065a8624b1cb28d (diff)
downloadFreeBSD-src-c96b8c07a415e367c09ed62b6690acaceefb47ff.zip
FreeBSD-src-c96b8c07a415e367c09ed62b6690acaceefb47ff.tar.gz
- Don't log messages saying that accounting is being disabled and enabled
if the accounting log file is atomically replaced with a new file (such as during log rotation). - Simplify accounting log rotation a bit. There is no need to re-run accton(8) after renaming the new log file to it's real name. PR: kern/167321 Tested by: Jeremy Chadwick
-rwxr-xr-xetc/rc.d/accounting4
-rw-r--r--sys/kern/kern_acct.c23
2 files changed, 17 insertions, 10 deletions
diff --git a/etc/rc.d/accounting b/etc/rc.d/accounting
index 85483fe..0c7ac36c 100755
--- a/etc/rc.d/accounting
+++ b/etc/rc.d/accounting
@@ -65,9 +65,7 @@ accounting_rotate_log()
mv ${accounting_file} ${accounting_file}.0
if checkyesno accounting_enable; then
- ln $_file ${accounting_file##*/}
- ${accounting_command} ${accounting_file}
- unlink $_file
+ mv $_file ${accounting_file}
fi
}
diff --git a/sys/kern/kern_acct.c b/sys/kern/kern_acct.c
index 8e5479b..fda217a 100644
--- a/sys/kern/kern_acct.c
+++ b/sys/kern/kern_acct.c
@@ -122,7 +122,7 @@ static uint32_t encode_timeval(struct timeval);
static uint32_t encode_long(long);
static void acctwatch(void);
static void acct_thread(void *);
-static int acct_disable(struct thread *);
+static int acct_disable(struct thread *, int);
/*
* Accounting vnode pointer, saved vnode pointer, and flags for each.
@@ -196,7 +196,7 @@ int
sys_acct(struct thread *td, struct acct_args *uap)
{
struct nameidata nd;
- int error, flags, vfslocked;
+ int error, flags, vfslocked, replacing;
error = priv_check(td, PRIV_ACCT);
if (error)
@@ -246,6 +246,13 @@ sys_acct(struct thread *td, struct acct_args *uap)
sx_xlock(&acct_sx);
/*
+ * Don't log spurious disable/enable messages if we are
+ * switching from one accounting file to another due to log
+ * rotation.
+ */
+ replacing = (acct_vp != NULL && uap->path != NULL);
+
+ /*
* If accounting was previously enabled, kill the old space-watcher,
* close the file, and (if no new file was specified, leave). Reset
* the suspended state regardless of whether accounting remains
@@ -254,7 +261,7 @@ sys_acct(struct thread *td, struct acct_args *uap)
acct_suspended = 0;
if (acct_vp != NULL) {
vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount);
- error = acct_disable(td);
+ error = acct_disable(td, !replacing);
VFS_UNLOCK_GIANT(vfslocked);
}
if (uap->path == NULL) {
@@ -299,7 +306,8 @@ sys_acct(struct thread *td, struct acct_args *uap)
}
acct_configured = 1;
sx_xunlock(&acct_sx);
- log(LOG_NOTICE, "Accounting enabled\n");
+ if (!replacing)
+ log(LOG_NOTICE, "Accounting enabled\n");
return (error);
}
@@ -308,7 +316,7 @@ sys_acct(struct thread *td, struct acct_args *uap)
* our reference to the credential, and clearing the vnode's flags.
*/
static int
-acct_disable(struct thread *td)
+acct_disable(struct thread *td, int logging)
{
int error;
@@ -319,7 +327,8 @@ acct_disable(struct thread *td)
acct_vp = NULL;
acct_cred = NULL;
acct_flags = 0;
- log(LOG_NOTICE, "Accounting disabled\n");
+ if (logging)
+ log(LOG_NOTICE, "Accounting disabled\n");
return (error);
}
@@ -574,7 +583,7 @@ acctwatch(void)
*/
vfslocked = VFS_LOCK_GIANT(acct_vp->v_mount);
if (acct_vp->v_type == VBAD) {
- (void) acct_disable(NULL);
+ (void) acct_disable(NULL, 1);
VFS_UNLOCK_GIANT(vfslocked);
acct_state |= ACCT_EXITREQ;
return;
OpenPOWER on IntegriCloud