History

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.

Pavel Emelyanov committed 18 years ago

Commit 5f7b7031 parent a846a191 file · +15 −6Browse files

Showing the changes to kernel (1 of 1 file). Show all

Unified · Split

kernel/acct.c+15−6
@@ -58,6 +58,7 @@ · 57 unmodified lines
5858 #include <asm/uaccess.h>
5959 #include <asm/div64.h>
6060 #include <linux/blkdev.h> /* sector_div */
61+#include <linux/pid_namespace.h>
6162
6263 /*
6364 * These constants control the amount of freespace that suspend and
@@ -74,7 +75,7 @@ int acct_parm[3] = {4, 2, 30}; · 10 unmodified lines
7475 /*
7576 * External references and all of the globals.
7677 */
77−static void do_acct_process(struct file *);
78+static void do_acct_process(struct pid_namespace *ns, struct file *);
7879
7980 /*
8081 * This structure is used so that all the data protected by lock
@@ -86,6 +87,7 @@ struct acct_glbs { · 5 unmodified lines
8687 volatile int active;
8788 volatile int needcheck;
8889 struct file *file;
90+ struct pid_namespace *ns;
8991 struct timer_list timer;
9092 };
9193
@@ -175,9 +177,11 @@ out: · 83 unmodified lines
175177 static void acct_file_reopen(struct file *file)
176178 {
177179 struct file *old_acct = NULL;
180+ struct pid_namespace *old_ns = NULL;
178181
179182 if (acct_globals.file) {
180183 old_acct = acct_globals.file;
184+ old_ns = acct_globals.ns;
181185 del_timer(&acct_globals.timer);
182186 acct_globals.active = 0;
183187 acct_globals.needcheck = 0;
@@ -185,6 +189,7 @@ static void acct_file_reopen(struct file *file) · 1 unmodified line
185189 }
186190 if (file) {
187191 acct_globals.file = file;
192+ acct_globals.ns = get_pid_ns(task_active_pid_ns(current));
188193 acct_globals.needcheck = 0;
189194 acct_globals.active = 1;
190195 /* 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
196201 if (old_acct) {
197202 mnt_unpin(old_acct->f_path.mnt);
198203 spin_unlock(&acct_globals.lock);
199− do_acct_process(old_acct);
204+ do_acct_process(old_ns, old_acct);
200205 filp_close(old_acct, NULL);
206+ put_pid_ns(old_ns);
201207 spin_lock(&acct_globals.lock);
202208 }
203209 }
@@ -419,7 +425,7 @@ static u32 encode_float(u64 value) · 215 unmodified lines
419425 /*
420426 * do_acct_process does all actual work. Caller holds the reference to file.
421427 */
422−static void do_acct_process(struct file *file)
428+static void do_acct_process(struct pid_namespace *ns, struct file *file)
423429 {
424430 struct pacct_struct *pacct = &current->signal->pacct;
425431 acct_t ac;
@@ -481,9 +487,9 @@ static void do_acct_process(struct file *file) · 55 unmodified lines
481487 ac.ac_gid16 = current->gid;
482488 #endif
483489 #if ACCT_VERSION==3
484− ac.ac_pid = current->tgid;
490+ ac.ac_pid = task_tgid_nr_ns(current, ns);
485491 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);
487493 rcu_read_unlock();
488494 #endif
489495
@@ -580,6 +586,7 @@ void acct_collect(long exitcode, int group_dead) · 90 unmodified lines
580586 void acct_process(void)
581587 {
582588 struct file *file = NULL;
589+ struct pid_namespace *ns;
583590
584591 /*
585592 * accelerate the common fastpath:
@@ -594,8 +601,10 @@ void acct_process(void) · 8 unmodified lines
594601 return;
595602 }
596603 get_file(file);
604+ ns = get_pid_ns(acct_globals.ns);
597605 spin_unlock(&acct_globals.lock);
598606
599− do_acct_process(file);
607+ do_acct_process(ns, file);
600608 fput(file);
609+ put_pid_ns(ns);
601610 }

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t