void exacct_commit_task(void *arg) { task_t *tk = (task_t *)arg; size_t size; zone_t *zone = tk->tk_zone; struct exacct_globals *acg; ASSERT(tk != task0p); ASSERT(tk->tk_memb_list == NULL); /* * Don't do any extra work if the acctctl module isn't loaded. */ if (exacct_zone_key != ZONE_KEY_UNINITIALIZED) { acg = zone_getspecific(exacct_zone_key, zone); (void) exacct_assemble_task_usage(&acg->ac_task, tk, exacct_commit_callback, NULL, 0, &size, EW_FINAL); if (tk->tk_zone != global_zone) { acg = zone_getspecific(exacct_zone_key, global_zone); (void) exacct_assemble_task_usage(&acg->ac_task, tk, exacct_commit_callback, NULL, 0, &size, EW_FINAL); } } /* * Release associated project and finalize task. */ task_end(tk); }
static int wracct_task(ac_info_t *ac_task, taskid_t tkid, int flag, size_t *sizep) { task_t *tk; int error; mutex_enter(&ac_task->ac_lock); if (ac_task->ac_state == AC_OFF || ac_task->ac_vnode == NULL) { mutex_exit(&ac_task->ac_lock); return (ENOTACTIVE); } mutex_exit(&ac_task->ac_lock); if ((tk = task_hold_by_id(tkid)) == NULL) return (ESRCH); error = exacct_assemble_task_usage(ac_task, tk, exacct_commit_callback, NULL, 0, sizep, flag); task_rele(tk); return (error); }
static int getacct_task(ac_info_t *ac_task, taskid_t tkid, void *buf, size_t bufsize, size_t *sizep) { task_t *tk; int error; mutex_enter(&ac_task->ac_lock); if (ac_task->ac_state == AC_OFF) { mutex_exit(&ac_task->ac_lock); return (ENOTACTIVE); } mutex_exit(&ac_task->ac_lock); if ((tk = task_hold_by_id(tkid)) == NULL) return (ESRCH); error = exacct_assemble_task_usage(ac_task, tk, getacct_callback, buf, bufsize, sizep, EW_PARTIAL); task_rele(tk); return (error); }