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>
This commit is contained in:
parent
a846a1954b
commit
5f7b703fe2
1 changed files with 15 additions and 6 deletions
|
@ -58,6 +58,7 @@
|
||||||
#include <asm/uaccess.h>
|
#include <asm/uaccess.h>
|
||||||
#include <asm/div64.h>
|
#include <asm/div64.h>
|
||||||
#include <linux/blkdev.h> /* sector_div */
|
#include <linux/blkdev.h> /* sector_div */
|
||||||
|
#include <linux/pid_namespace.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These constants control the amount of freespace that suspend and
|
* These constants control the amount of freespace that suspend and
|
||||||
|
@ -74,7 +75,7 @@ int acct_parm[3] = {4, 2, 30};
|
||||||
/*
|
/*
|
||||||
* External references and all of the globals.
|
* External references and all of the globals.
|
||||||
*/
|
*/
|
||||||
static void do_acct_process(struct file *);
|
static void do_acct_process(struct pid_namespace *ns, struct file *);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This structure is used so that all the data protected by lock
|
* This structure is used so that all the data protected by lock
|
||||||
|
@ -86,6 +87,7 @@ struct acct_glbs {
|
||||||
volatile int active;
|
volatile int active;
|
||||||
volatile int needcheck;
|
volatile int needcheck;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
|
struct pid_namespace *ns;
|
||||||
struct timer_list timer;
|
struct timer_list timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -175,9 +177,11 @@ static int check_free_space(struct file *file)
|
||||||
static void acct_file_reopen(struct file *file)
|
static void acct_file_reopen(struct file *file)
|
||||||
{
|
{
|
||||||
struct file *old_acct = NULL;
|
struct file *old_acct = NULL;
|
||||||
|
struct pid_namespace *old_ns = NULL;
|
||||||
|
|
||||||
if (acct_globals.file) {
|
if (acct_globals.file) {
|
||||||
old_acct = acct_globals.file;
|
old_acct = acct_globals.file;
|
||||||
|
old_ns = acct_globals.ns;
|
||||||
del_timer(&acct_globals.timer);
|
del_timer(&acct_globals.timer);
|
||||||
acct_globals.active = 0;
|
acct_globals.active = 0;
|
||||||
acct_globals.needcheck = 0;
|
acct_globals.needcheck = 0;
|
||||||
|
@ -185,6 +189,7 @@ static void acct_file_reopen(struct file *file)
|
||||||
}
|
}
|
||||||
if (file) {
|
if (file) {
|
||||||
acct_globals.file = file;
|
acct_globals.file = file;
|
||||||
|
acct_globals.ns = get_pid_ns(task_active_pid_ns(current));
|
||||||
acct_globals.needcheck = 0;
|
acct_globals.needcheck = 0;
|
||||||
acct_globals.active = 1;
|
acct_globals.active = 1;
|
||||||
/* It's been deleted if it was used before so this is safe */
|
/* 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)
|
||||||
if (old_acct) {
|
if (old_acct) {
|
||||||
mnt_unpin(old_acct->f_path.mnt);
|
mnt_unpin(old_acct->f_path.mnt);
|
||||||
spin_unlock(&acct_globals.lock);
|
spin_unlock(&acct_globals.lock);
|
||||||
do_acct_process(old_acct);
|
do_acct_process(old_ns, old_acct);
|
||||||
filp_close(old_acct, NULL);
|
filp_close(old_acct, NULL);
|
||||||
|
put_pid_ns(old_ns);
|
||||||
spin_lock(&acct_globals.lock);
|
spin_lock(&acct_globals.lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -419,7 +425,7 @@ static u32 encode_float(u64 value)
|
||||||
/*
|
/*
|
||||||
* do_acct_process does all actual work. Caller holds the reference to file.
|
* do_acct_process does all actual work. Caller holds the reference to file.
|
||||||
*/
|
*/
|
||||||
static void do_acct_process(struct file *file)
|
static void do_acct_process(struct pid_namespace *ns, struct file *file)
|
||||||
{
|
{
|
||||||
struct pacct_struct *pacct = ¤t->signal->pacct;
|
struct pacct_struct *pacct = ¤t->signal->pacct;
|
||||||
acct_t ac;
|
acct_t ac;
|
||||||
|
@ -481,9 +487,9 @@ static void do_acct_process(struct file *file)
|
||||||
ac.ac_gid16 = current->gid;
|
ac.ac_gid16 = current->gid;
|
||||||
#endif
|
#endif
|
||||||
#if ACCT_VERSION==3
|
#if ACCT_VERSION==3
|
||||||
ac.ac_pid = current->tgid;
|
ac.ac_pid = task_tgid_nr_ns(current, ns);
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
ac.ac_ppid = rcu_dereference(current->real_parent)->tgid;
|
ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -580,6 +586,7 @@ void acct_collect(long exitcode, int group_dead)
|
||||||
void acct_process(void)
|
void acct_process(void)
|
||||||
{
|
{
|
||||||
struct file *file = NULL;
|
struct file *file = NULL;
|
||||||
|
struct pid_namespace *ns;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* accelerate the common fastpath:
|
* accelerate the common fastpath:
|
||||||
|
@ -594,8 +601,10 @@ void acct_process(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
get_file(file);
|
get_file(file);
|
||||||
|
ns = get_pid_ns(acct_globals.ns);
|
||||||
spin_unlock(&acct_globals.lock);
|
spin_unlock(&acct_globals.lock);
|
||||||
|
|
||||||
do_acct_process(file);
|
do_acct_process(ns, file);
|
||||||
fput(file);
|
fput(file);
|
||||||
|
put_pid_ns(ns);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue