bsd_acct: using task_struct->tgid is not right in pid-namespaces

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.

Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Cc: Oleg Nesterov <oleg@tv-sign.ru>
Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by Pavel Emelyanov and committed by Linus Torvalds 5f7b703f a846a195

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