In case we're accounting from a sub-namespace, the tgids reported will not refer to the right namespace. Save the pid_namespace we're accounting in on the acct_glbs and use it in do_acct_process. Two less :) places using the task_struct.tgid member.
Showing the changes to kernel (1 of 1 file). Show all
Unified · Split
| @@ -58,6 +58,7 @@ · 57 unmodified lines | ||
| 58 | 58 | #include <asm/uaccess.h> |
| 59 | 59 | #include <asm/div64.h> |
| 60 | 60 | #include <linux/blkdev.h> /* sector_div */ |
| 61 | +#include <linux/pid_namespace.h> | |
| 61 | 62 | |
| 62 | 63 | /* |
| 63 | 64 | * These constants control the amount of freespace that suspend and |
| @@ -74,7 +75,7 @@ int acct_parm[3] = {4, 2, 30}; · 10 unmodified lines | ||
| 74 | 75 | /* |
| 75 | 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 | 81 | * This structure is used so that all the data protected by lock |
| @@ -86,6 +87,7 @@ struct acct_glbs { · 5 unmodified lines | ||
| 86 | 87 | volatile int active; |
| 87 | 88 | volatile int needcheck; |
| 88 | 89 | struct file *file; |
| 90 | + struct pid_namespace *ns; | |
| 89 | 91 | struct timer_list timer; |
| 90 | 92 | }; |
| 91 | 93 | |
| @@ -175,9 +177,11 @@ out: · 83 unmodified lines | ||
| 175 | 177 | static void acct_file_reopen(struct file *file) |
| 176 | 178 | { |
| 177 | 179 | struct file *old_acct = NULL; |
| 180 | + struct pid_namespace *old_ns = NULL; | |
| 178 | 181 | |
| 179 | 182 | if (acct_globals.file) { |
| 180 | 183 | old_acct = acct_globals.file; |
| 184 | + old_ns = acct_globals.ns; | |
| 181 | 185 | del_timer(&acct_globals.timer); |
| 182 | 186 | acct_globals.active = 0; |
| 183 | 187 | acct_globals.needcheck = 0; |
| @@ -185,6 +189,7 @@ static void acct_file_reopen(struct file *file) · 1 unmodified line | ||
| 185 | 189 | } |
| 186 | 190 | if (file) { |
| 187 | 191 | acct_globals.file = file; |
| 192 | + acct_globals.ns = get_pid_ns(task_active_pid_ns(current)); | |
| 188 | 193 | acct_globals.needcheck = 0; |
| 189 | 194 | acct_globals.active = 1; |
| 190 | 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) · 5 unmodified lines | ||
| 196 | 201 | if (old_acct) { |
| 197 | 202 | mnt_unpin(old_acct->f_path.mnt); |
| 198 | 203 | spin_unlock(&acct_globals.lock); |
| 199 | − do_acct_process(old_acct); | |
| 204 | + do_acct_process(old_ns, old_acct); | |
| 200 | 205 | filp_close(old_acct, NULL); |
| 206 | + put_pid_ns(old_ns); | |
| 201 | 207 | spin_lock(&acct_globals.lock); |
| 202 | 208 | } |
| 203 | 209 | } |
| @@ -419,7 +425,7 @@ static u32 encode_float(u64 value) · 215 unmodified lines | ||
| 419 | 425 | /* |
| 420 | 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 | 430 | struct pacct_struct *pacct = ¤t->signal->pacct; |
| 425 | 431 | acct_t ac; |
| @@ -481,9 +487,9 @@ static void do_acct_process(struct file *file) · 55 unmodified lines | ||
| 481 | 487 | ac.ac_gid16 = current->gid; |
| 482 | 488 | #endif |
| 483 | 489 | #if ACCT_VERSION==3 |
| 484 | − ac.ac_pid = current->tgid; | |
| 490 | + ac.ac_pid = task_tgid_nr_ns(current, ns); | |
| 485 | 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 | 493 | rcu_read_unlock(); |
| 488 | 494 | #endif |
| 489 | 495 | |
| @@ -580,6 +586,7 @@ void acct_collect(long exitcode, int group_dead) · 90 unmodified lines | ||
| 580 | 586 | void acct_process(void) |
| 581 | 587 | { |
| 582 | 588 | struct file *file = NULL; |
| 589 | + struct pid_namespace *ns; | |
| 583 | 590 | |
| 584 | 591 | /* |
| 585 | 592 | * accelerate the common fastpath: |
| @@ -594,8 +601,10 @@ void acct_process(void) · 8 unmodified lines | ||
| 594 | 601 | return; |
| 595 | 602 | } |
| 596 | 603 | get_file(file); |
| 604 | + ns = get_pid_ns(acct_globals.ns); | |
| 597 | 605 | spin_unlock(&acct_globals.lock); |
| 598 | 606 | |
| 599 | − do_acct_process(file); | |
| 607 | + do_acct_process(ns, file); | |
| 600 | 608 | fput(file); |
| 609 | + put_pid_ns(ns); | |
| 601 | 610 | } |