/* * Close the old accounting file (if currently open) and then replace * it with file (if non-NULL). * * NOTE: acct_lock MUST be held on entry and exit. */ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file, struct pid_namespace *ns) { struct file *old_acct = NULL; struct pid_namespace *old_ns = NULL; if (acct->file) { old_acct = acct->file; old_ns = acct->ns; acct->active = 0; acct->file = NULL; acct->ns = NULL; list_del(&acct->list); } if (file) { acct->file = file; acct->ns = ns; acct->needcheck = jiffies + ACCT_TIMEOUT*HZ; acct->active = 1; list_add(&acct->list, &acct_list); } if (old_acct) { mnt_unpin(old_acct->f_path.mnt); spin_unlock(&acct_lock); do_acct_process(acct, old_ns, old_acct); filp_close(old_acct, NULL); spin_lock(&acct_lock); } }
/* * Close the old accounting file (if currently open) and then replace * it with file (if non-NULL). * * NOTE: acct_lock MUST be held on entry and exit. */ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file, struct pid_namespace *ns) { struct file *old_acct = NULL; struct pid_namespace *old_ns = NULL; if (acct->file) { old_acct = acct->file; old_ns = acct->ns; del_timer(&acct->timer); acct->active = 0; acct->needcheck = 0; acct->file = NULL; acct->ns = NULL; list_del(&acct->list); } if (file) { acct->file = file; acct->ns = ns; acct->needcheck = 0; acct->active = 1; list_add(&acct->list, &acct_list); /* It's been deleted if it was used before so this is safe */ setup_timer(&acct->timer, acct_timeout, (unsigned long)acct); acct->timer.expires = jiffies + ACCT_TIMEOUT*HZ; add_timer(&acct->timer); } if (old_acct) { mnt_unpin(old_acct->f_path.mnt); spin_unlock(&acct_lock); do_acct_process(acct, old_ns, old_acct); filp_close(old_acct, NULL); spin_lock(&acct_lock); } }
/* * Close the old accounting file (if currently open) and then replace * it with file (if non-NULL). * * NOTE: acct_globals.lock MUST be held on entry and exit. */ static void acct_file_reopen(struct file *file) { struct file *old_acct = NULL; struct pid_namespace *old_ns = NULL; if (acct_globals.file) { old_acct = acct_globals.file; old_ns = acct_globals.ns; del_timer(&acct_globals.timer); acct_globals.active = 0; acct_globals.needcheck = 0; acct_globals.file = NULL; } if (file) { acct_globals.file = file; acct_globals.ns = get_pid_ns(task_active_pid_ns(current)); acct_globals.needcheck = 0; acct_globals.active = 1; /* It's been deleted if it was used before so this is safe */ init_timer(&acct_globals.timer); acct_globals.timer.function = acct_timeout; acct_globals.timer.expires = jiffies + ACCT_TIMEOUT*HZ; add_timer(&acct_globals.timer); } if (old_acct) { mnt_unpin(old_acct->f_path.mnt); spin_unlock(&acct_globals.lock); do_acct_process(old_ns, old_acct); filp_close(old_acct, NULL); put_pid_ns(old_ns); spin_lock(&acct_globals.lock); } }