diff options
Diffstat (limited to 'kernel/acct.c')
-rw-r--r-- | kernel/acct.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/kernel/acct.c b/kernel/acct.c index 7ff5339a3f05..91e1cfd734d2 100644 --- a/kernel/acct.c +++ b/kernel/acct.c | |||
@@ -58,6 +58,7 @@ | |||
58 | #include <asm/uaccess.h> | 58 | #include <asm/uaccess.h> |
59 | #include <asm/div64.h> | 59 | #include <asm/div64.h> |
60 | #include <linux/blkdev.h> /* sector_div */ | 60 | #include <linux/blkdev.h> /* sector_div */ |
61 | #include <linux/pid_namespace.h> | ||
61 | 62 | ||
62 | /* | 63 | /* |
63 | * These constants control the amount of freespace that suspend and | 64 | * These constants control the amount of freespace that suspend and |
@@ -74,7 +75,7 @@ int acct_parm[3] = {4, 2, 30}; | |||
74 | /* | 75 | /* |
75 | * External references and all of the globals. | 76 | * External references and all of the globals. |
76 | */ | 77 | */ |
77 | static void do_acct_process(struct file *); | 78 | static void do_acct_process(struct pid_namespace *ns, struct file *); |
78 | 79 | ||
79 | /* | 80 | /* |
80 | * This structure is used so that all the data protected by lock | 81 | * This structure is used so that all the data protected by lock |
@@ -86,6 +87,7 @@ struct acct_glbs { | |||
86 | volatile int active; | 87 | volatile int active; |
87 | volatile int needcheck; | 88 | volatile int needcheck; |
88 | struct file *file; | 89 | struct file *file; |
90 | struct pid_namespace *ns; | ||
89 | struct timer_list timer; | 91 | struct timer_list timer; |
90 | }; | 92 | }; |
91 | 93 | ||
@@ -175,9 +177,11 @@ out: | |||
175 | static void acct_file_reopen(struct file *file) | 177 | static void acct_file_reopen(struct file *file) |
176 | { | 178 | { |
177 | struct file *old_acct = NULL; | 179 | struct file *old_acct = NULL; |
180 | struct pid_namespace *old_ns = NULL; | ||
178 | 181 | ||
179 | if (acct_globals.file) { | 182 | if (acct_globals.file) { |
180 | old_acct = acct_globals.file; | 183 | old_acct = acct_globals.file; |
184 | old_ns = acct_globals.ns; | ||
181 | del_timer(&acct_globals.timer); | 185 | del_timer(&acct_globals.timer); |
182 | acct_globals.active = 0; | 186 | acct_globals.active = 0; |
183 | acct_globals.needcheck = 0; | 187 | acct_globals.needcheck = 0; |
@@ -185,6 +189,7 @@ static void acct_file_reopen(struct file *file) | |||
185 | } | 189 | } |
186 | if (file) { | 190 | if (file) { |
187 | acct_globals.file = file; | 191 | acct_globals.file = file; |
192 | acct_globals.ns = get_pid_ns(task_active_pid_ns(current)); | ||
188 | acct_globals.needcheck = 0; | 193 | acct_globals.needcheck = 0; |
189 | acct_globals.active = 1; | 194 | acct_globals.active = 1; |
190 | /* It's been deleted if it was used before so this is safe */ | 195 | /* It's been deleted if it was used before so this is safe */ |
@@ -196,8 +201,9 @@ static void acct_file_reopen(struct file *file) | |||
196 | if (old_acct) { | 201 | if (old_acct) { |
197 | mnt_unpin(old_acct->f_path.mnt); | 202 | mnt_unpin(old_acct->f_path.mnt); |
198 | spin_unlock(&acct_globals.lock); | 203 | spin_unlock(&acct_globals.lock); |
199 | do_acct_process(old_acct); | 204 | do_acct_process(old_ns, old_acct); |
200 | filp_close(old_acct, NULL); | 205 | filp_close(old_acct, NULL); |
206 | put_pid_ns(old_ns); | ||
201 | spin_lock(&acct_globals.lock); | 207 | spin_lock(&acct_globals.lock); |
202 | } | 208 | } |
203 | } | 209 | } |
@@ -419,7 +425,7 @@ static u32 encode_float(u64 value) | |||
419 | /* | 425 | /* |
420 | * do_acct_process does all actual work. Caller holds the reference to file. | 426 | * do_acct_process does all actual work. Caller holds the reference to file. |
421 | */ | 427 | */ |
422 | static void do_acct_process(struct file *file) | 428 | static void do_acct_process(struct pid_namespace *ns, struct file *file) |
423 | { | 429 | { |
424 | struct pacct_struct *pacct = ¤t->signal->pacct; | 430 | struct pacct_struct *pacct = ¤t->signal->pacct; |
425 | acct_t ac; | 431 | acct_t ac; |
@@ -481,9 +487,9 @@ static void do_acct_process(struct file *file) | |||
481 | ac.ac_gid16 = current->gid; | 487 | ac.ac_gid16 = current->gid; |
482 | #endif | 488 | #endif |
483 | #if ACCT_VERSION==3 | 489 | #if ACCT_VERSION==3 |
484 | ac.ac_pid = current->tgid; | 490 | ac.ac_pid = task_tgid_nr_ns(current, ns); |
485 | rcu_read_lock(); | 491 | rcu_read_lock(); |
486 | ac.ac_ppid = rcu_dereference(current->real_parent)->tgid; | 492 | ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns); |
487 | rcu_read_unlock(); | 493 | rcu_read_unlock(); |
488 | #endif | 494 | #endif |
489 | 495 | ||
@@ -580,6 +586,7 @@ void acct_collect(long exitcode, int group_dead) | |||
580 | void acct_process(void) | 586 | void acct_process(void) |
581 | { | 587 | { |
582 | struct file *file = NULL; | 588 | struct file *file = NULL; |
589 | struct pid_namespace *ns; | ||
583 | 590 | ||
584 | /* | 591 | /* |
585 | * accelerate the common fastpath: | 592 | * accelerate the common fastpath: |
@@ -594,8 +601,10 @@ void acct_process(void) | |||
594 | return; | 601 | return; |
595 | } | 602 | } |
596 | get_file(file); | 603 | get_file(file); |
604 | ns = get_pid_ns(acct_globals.ns); | ||
597 | spin_unlock(&acct_globals.lock); | 605 | spin_unlock(&acct_globals.lock); |
598 | 606 | ||
599 | do_acct_process(file); | 607 | do_acct_process(ns, file); |
600 | fput(file); | 608 | fput(file); |
609 | put_pid_ns(ns); | ||
601 | } | 610 | } |