提交 6248b1b3 编写于 作者: P Pavel Emelyanov 提交者: Linus Torvalds

bsdacct: make internal code work with passed bsd_acct_struct, not global

This adds the appropriate pointer to all the internal (i.e.  static)
functions that work with global acct instance.  API calls pass a global
instance to them (while we still have such).

Mostly this is a s/acct_globals./acct->/ over the file.
Signed-off-by: NPavel Emelyanov <xemul@openvz.org>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 a75d9797
...@@ -75,7 +75,8 @@ int acct_parm[3] = {4, 2, 30}; ...@@ -75,7 +75,8 @@ int acct_parm[3] = {4, 2, 30};
/* /*
* External references and all of the globals. * External references and all of the globals.
*/ */
static void do_acct_process(struct pid_namespace *ns, struct file *); static void do_acct_process(struct bsd_acct_struct *acct,
struct pid_namespace *ns, struct file *);
/* /*
* This structure is used so that all the data protected by lock * This structure is used so that all the data protected by lock
...@@ -106,7 +107,7 @@ static void acct_timeout(unsigned long x) ...@@ -106,7 +107,7 @@ static void acct_timeout(unsigned long x)
/* /*
* Check the amount of free space and suspend/resume accordingly. * Check the amount of free space and suspend/resume accordingly.
*/ */
static int check_free_space(struct file *file) static int check_free_space(struct bsd_acct_struct *acct, struct file *file)
{ {
struct kstatfs sbuf; struct kstatfs sbuf;
int res; int res;
...@@ -115,8 +116,8 @@ static int check_free_space(struct file *file) ...@@ -115,8 +116,8 @@ static int check_free_space(struct file *file)
sector_t suspend; sector_t suspend;
spin_lock(&acct_lock); spin_lock(&acct_lock);
res = acct_globals.active; res = acct->active;
if (!file || !acct_globals.needcheck) if (!file || !acct->needcheck)
goto out; goto out;
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
...@@ -137,33 +138,33 @@ static int check_free_space(struct file *file) ...@@ -137,33 +138,33 @@ static int check_free_space(struct file *file)
act = 0; act = 0;
/* /*
* If some joker switched acct_globals.file under us we'ld better be * If some joker switched acct->file under us we'ld better be
* silent and _not_ touch anything. * silent and _not_ touch anything.
*/ */
spin_lock(&acct_lock); spin_lock(&acct_lock);
if (file != acct_globals.file) { if (file != acct->file) {
if (act) if (act)
res = act>0; res = act>0;
goto out; goto out;
} }
if (acct_globals.active) { if (acct->active) {
if (act < 0) { if (act < 0) {
acct_globals.active = 0; acct->active = 0;
printk(KERN_INFO "Process accounting paused\n"); printk(KERN_INFO "Process accounting paused\n");
} }
} else { } else {
if (act > 0) { if (act > 0) {
acct_globals.active = 1; acct->active = 1;
printk(KERN_INFO "Process accounting resumed\n"); printk(KERN_INFO "Process accounting resumed\n");
} }
} }
del_timer(&acct_globals.timer); del_timer(&acct->timer);
acct_globals.needcheck = 0; acct->needcheck = 0;
acct_globals.timer.expires = jiffies + ACCT_TIMEOUT*HZ; acct->timer.expires = jiffies + ACCT_TIMEOUT*HZ;
add_timer(&acct_globals.timer); add_timer(&acct->timer);
res = acct_globals.active; res = acct->active;
out: out:
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
return res; return res;
...@@ -175,34 +176,33 @@ static int check_free_space(struct file *file) ...@@ -175,34 +176,33 @@ static int check_free_space(struct file *file)
* *
* NOTE: acct_lock MUST be held on entry and exit. * NOTE: acct_lock MUST be held on entry and exit.
*/ */
static void acct_file_reopen(struct file *file) static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file)
{ {
struct file *old_acct = NULL; struct file *old_acct = NULL;
struct pid_namespace *old_ns = NULL; struct pid_namespace *old_ns = NULL;
if (acct_globals.file) { if (acct->file) {
old_acct = acct_globals.file; old_acct = acct->file;
old_ns = acct_globals.ns; old_ns = acct->ns;
del_timer(&acct_globals.timer); del_timer(&acct->timer);
acct_globals.active = 0; acct->active = 0;
acct_globals.needcheck = 0; acct->needcheck = 0;
acct_globals.file = NULL; acct->file = NULL;
} }
if (file) { if (file) {
acct_globals.file = file; acct->file = file;
acct_globals.ns = get_pid_ns(task_active_pid_ns(current)); acct->ns = get_pid_ns(task_active_pid_ns(current));
acct_globals.needcheck = 0; acct->needcheck = 0;
acct_globals.active = 1; acct->active = 1;
/* It's been deleted if it was used before so this is safe */ /* It's been deleted if it was used before so this is safe */
setup_timer(&acct_globals.timer, acct_timeout, setup_timer(&acct->timer, acct_timeout, (unsigned long)acct);
(unsigned long)&acct_globals); acct->timer.expires = jiffies + ACCT_TIMEOUT*HZ;
acct_globals.timer.expires = jiffies + ACCT_TIMEOUT*HZ; add_timer(&acct->timer);
add_timer(&acct_globals.timer);
} }
if (old_acct) { if (old_acct) {
mnt_unpin(old_acct->f_path.mnt); mnt_unpin(old_acct->f_path.mnt);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
do_acct_process(old_ns, old_acct); do_acct_process(acct, old_ns, old_acct);
filp_close(old_acct, NULL); filp_close(old_acct, NULL);
put_pid_ns(old_ns); put_pid_ns(old_ns);
spin_lock(&acct_lock); spin_lock(&acct_lock);
...@@ -237,7 +237,7 @@ static int acct_on(char *name) ...@@ -237,7 +237,7 @@ static int acct_on(char *name)
spin_lock(&acct_lock); spin_lock(&acct_lock);
mnt_pin(file->f_path.mnt); mnt_pin(file->f_path.mnt);
acct_file_reopen(file); acct_file_reopen(&acct_globals, file);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
mntput(file->f_path.mnt); /* it's pinned, now give up active reference */ mntput(file->f_path.mnt); /* it's pinned, now give up active reference */
...@@ -273,7 +273,7 @@ asmlinkage long sys_acct(const char __user *name) ...@@ -273,7 +273,7 @@ asmlinkage long sys_acct(const char __user *name)
error = security_acct(NULL); error = security_acct(NULL);
if (!error) { if (!error) {
spin_lock(&acct_lock); spin_lock(&acct_lock);
acct_file_reopen(NULL); acct_file_reopen(&acct_globals, NULL);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
} }
} }
...@@ -291,7 +291,7 @@ void acct_auto_close_mnt(struct vfsmount *m) ...@@ -291,7 +291,7 @@ void acct_auto_close_mnt(struct vfsmount *m)
{ {
spin_lock(&acct_lock); spin_lock(&acct_lock);
if (acct_globals.file && acct_globals.file->f_path.mnt == m) if (acct_globals.file && acct_globals.file->f_path.mnt == m)
acct_file_reopen(NULL); acct_file_reopen(&acct_globals, NULL);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
} }
...@@ -307,7 +307,7 @@ void acct_auto_close(struct super_block *sb) ...@@ -307,7 +307,7 @@ void acct_auto_close(struct super_block *sb)
spin_lock(&acct_lock); spin_lock(&acct_lock);
if (acct_globals.file && if (acct_globals.file &&
acct_globals.file->f_path.mnt->mnt_sb == sb) { acct_globals.file->f_path.mnt->mnt_sb == sb) {
acct_file_reopen(NULL); acct_file_reopen(&acct_globals, NULL);
} }
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
} }
...@@ -426,7 +426,8 @@ static u32 encode_float(u64 value) ...@@ -426,7 +426,8 @@ static u32 encode_float(u64 value)
/* /*
* do_acct_process does all actual work. Caller holds the reference to file. * do_acct_process does all actual work. Caller holds the reference to file.
*/ */
static void do_acct_process(struct pid_namespace *ns, struct file *file) static void do_acct_process(struct bsd_acct_struct *acct,
struct pid_namespace *ns, struct file *file)
{ {
struct pacct_struct *pacct = &current->signal->pacct; struct pacct_struct *pacct = &current->signal->pacct;
acct_t ac; acct_t ac;
...@@ -441,7 +442,7 @@ static void do_acct_process(struct pid_namespace *ns, struct file *file) ...@@ -441,7 +442,7 @@ static void do_acct_process(struct pid_namespace *ns, struct file *file)
* First check to see if there is enough free_space to continue * First check to see if there is enough free_space to continue
* the process accounting system. * the process accounting system.
*/ */
if (!check_free_space(file)) if (!check_free_space(acct, file))
return; return;
/* /*
...@@ -604,7 +605,7 @@ void acct_process(void) ...@@ -604,7 +605,7 @@ void acct_process(void)
ns = get_pid_ns(acct_globals.ns); ns = get_pid_ns(acct_globals.ns);
spin_unlock(&acct_lock); spin_unlock(&acct_lock);
do_acct_process(ns, file); do_acct_process(&acct_globals, ns, file);
fput(file); fput(file);
put_pid_ns(ns); put_pid_ns(ns);
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册