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
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 and64 * 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 * External references and all of the globals.76 * External references and all of the globals.
76 */77 */
77static void do_acct_process(struct file *);78static 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 lock81 * This structure is used so that all the data protected by lock
@@ -86,6 +87,7 @@ struct acct_glbs { · 5 unmodified lines
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: · 83 unmodified lines
175static void acct_file_reopen(struct file *file)177static 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) · 1 unmodified line
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) · 5 unmodified lines
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) · 215 unmodified lines
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 */
422static void do_acct_process(struct file *file)428static void do_acct_process(struct pid_namespace *ns, struct file *file)
423{429{
424 struct pacct_struct *pacct = &current->signal->pacct;430 struct pacct_struct *pacct = &current->signal->pacct;
425 acct_t ac;431 acct_t ac;
@@ -481,9 +487,9 @@ static void do_acct_process(struct file *file) · 55 unmodified lines
481 ac.ac_gid16 = current->gid;487 ac.ac_gid16 = current->gid;
482#endif488#endif
483#if ACCT_VERSION==3489#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#endif494#endif
489 495
@@ -580,6 +586,7 @@ void acct_collect(long exitcode, int group_dead) · 90 unmodified lines
580void acct_process(void)586void 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) · 8 unmodified lines
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}

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