diff options
Diffstat (limited to 'sys/kern/kern_loginclass.c')
-rw-r--r-- | sys/kern/kern_loginclass.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/sys/kern/kern_loginclass.c b/sys/kern/kern_loginclass.c index cf644d5..d980246 100644 --- a/sys/kern/kern_loginclass.c +++ b/sys/kern/kern_loginclass.c @@ -56,6 +56,7 @@ __FBSDID("$FreeBSD$"); #include <sys/priv.h> #include <sys/proc.h> #include <sys/queue.h> +#include <sys/racct.h> #include <sys/refcount.h> #include <sys/sysproto.h> #include <sys/systm.h> @@ -90,6 +91,7 @@ loginclass_free(struct loginclass *lc) mtx_lock(&loginclasses_lock); if (refcount_release(&lc->lc_refcount)) { + racct_destroy(&lc->lc_racct); LIST_REMOVE(lc, lc_next); mtx_unlock(&loginclasses_lock); free(lc, M_LOGINCLASS); @@ -115,6 +117,7 @@ loginclass_find(const char *name) return (NULL); newlc = malloc(sizeof(*newlc), M_LOGINCLASS, M_ZERO | M_WAITOK); + racct_create(&newlc->lc_racct); mtx_lock(&loginclasses_lock); LIST_FOREACH(lc, &loginclasses, lc_next) { @@ -124,6 +127,7 @@ loginclass_find(const char *name) /* Found loginclass with a matching name? */ loginclass_hold(lc); mtx_unlock(&loginclasses_lock); + racct_destroy(&newlc->lc_racct); free(newlc, M_LOGINCLASS); return (lc); } @@ -205,13 +209,27 @@ setloginclass(struct thread *td, struct setloginclass_args *uap) newcred->cr_loginclass = newlc; p->p_ucred = newcred; PROC_UNLOCK(p); - +#ifdef RACCT + racct_proc_ucred_changed(p, oldcred, newcred); +#endif loginclass_free(oldcred->cr_loginclass); crfree(oldcred); return (0); } +void +loginclass_racct_foreach(void (*callback)(struct racct *racct, + void *arg2, void *arg3), void *arg2, void *arg3) +{ + struct loginclass *lc; + + mtx_lock(&loginclasses_lock); + LIST_FOREACH(lc, &loginclasses, lc_next) + (callback)(lc->lc_racct, arg2, arg3); + mtx_unlock(&loginclasses_lock); +} + static void lc_init(void) { |