Commit cdd37e23 authored by Al Viro's avatar Al Viro

separate namespace-independent parts of filling acct_t

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ed44724b
...@@ -448,42 +448,20 @@ static u32 encode_float(u64 value) ...@@ -448,42 +448,20 @@ static u32 encode_float(u64 value)
* do_exit() or when switching to a different output file. * do_exit() or when switching to a different output file.
*/ */
/* static void fill_ac(acct_t *ac)
* do_acct_process does all actual work. Caller holds the reference to file.
*/
static void do_acct_process(struct bsd_acct_struct *acct,
struct pid_namespace *ns, struct file *file)
{ {
struct pacct_struct *pacct = &current->signal->pacct; struct pacct_struct *pacct = &current->signal->pacct;
acct_t ac;
unsigned long flim;
u64 elapsed, run_time; u64 elapsed, run_time;
struct tty_struct *tty; struct tty_struct *tty;
const struct cred *orig_cred;
/*
* Accounting records are not subject to resource limits.
*/
flim = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
/* Perform file operations on behalf of whoever enabled accounting */
orig_cred = override_creds(file->f_cred);
/*
* First check to see if there is enough free_space to continue
* the process accounting system.
*/
if (!check_free_space(acct, file))
goto out;
/* /*
* Fill the accounting struct with the needed info as recorded * Fill the accounting struct with the needed info as recorded
* by the different kernel functions. * by the different kernel functions.
*/ */
memset(&ac, 0, sizeof(acct_t)); memset(ac, 0, sizeof(acct_t));
ac.ac_version = ACCT_VERSION | ACCT_BYTEORDER; ac->ac_version = ACCT_VERSION | ACCT_BYTEORDER;
strlcpy(ac.ac_comm, current->comm, sizeof(ac.ac_comm)); strlcpy(ac->ac_comm, current->comm, sizeof(ac->ac_comm));
/* calculate run_time in nsec*/ /* calculate run_time in nsec*/
run_time = ktime_get_ns(); run_time = ktime_get_ns();
...@@ -491,27 +469,66 @@ static void do_acct_process(struct bsd_acct_struct *acct, ...@@ -491,27 +469,66 @@ static void do_acct_process(struct bsd_acct_struct *acct,
/* convert nsec -> AHZ */ /* convert nsec -> AHZ */
elapsed = nsec_to_AHZ(run_time); elapsed = nsec_to_AHZ(run_time);
#if ACCT_VERSION==3 #if ACCT_VERSION==3
ac.ac_etime = encode_float(elapsed); ac->ac_etime = encode_float(elapsed);
#else #else
ac.ac_etime = encode_comp_t(elapsed < (unsigned long) -1l ? ac->ac_etime = encode_comp_t(elapsed < (unsigned long) -1l ?
(unsigned long) elapsed : (unsigned long) -1l); (unsigned long) elapsed : (unsigned long) -1l);
#endif #endif
#if ACCT_VERSION==1 || ACCT_VERSION==2 #if ACCT_VERSION==1 || ACCT_VERSION==2
{ {
/* new enlarged etime field */ /* new enlarged etime field */
comp2_t etime = encode_comp2_t(elapsed); comp2_t etime = encode_comp2_t(elapsed);
ac.ac_etime_hi = etime >> 16; ac->ac_etime_hi = etime >> 16;
ac.ac_etime_lo = (u16) etime; ac->ac_etime_lo = (u16) etime;
} }
#endif #endif
do_div(elapsed, AHZ); do_div(elapsed, AHZ);
ac.ac_btime = get_seconds() - elapsed; ac->ac_btime = get_seconds() - elapsed;
#if ACCT_VERSION==2
ac->ac_ahz = AHZ;
#endif
spin_lock_irq(&current->sighand->siglock);
tty = current->signal->tty; /* Safe as we hold the siglock */
ac->ac_tty = tty ? old_encode_dev(tty_devnum(tty)) : 0;
ac->ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime)));
ac->ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime)));
ac->ac_flag = pacct->ac_flag;
ac->ac_mem = encode_comp_t(pacct->ac_mem);
ac->ac_minflt = encode_comp_t(pacct->ac_minflt);
ac->ac_majflt = encode_comp_t(pacct->ac_majflt);
ac->ac_exitcode = pacct->ac_exitcode;
spin_unlock_irq(&current->sighand->siglock);
}
/*
* do_acct_process does all actual work. Caller holds the reference to file.
*/
static void do_acct_process(struct bsd_acct_struct *acct,
struct pid_namespace *ns, struct file *file)
{
acct_t ac;
unsigned long flim;
const struct cred *orig_cred;
/*
* Accounting records are not subject to resource limits.
*/
flim = current->signal->rlim[RLIMIT_FSIZE].rlim_cur;
current->signal->rlim[RLIMIT_FSIZE].rlim_cur = RLIM_INFINITY;
/* Perform file operations on behalf of whoever enabled accounting */
orig_cred = override_creds(file->f_cred);
/*
* First check to see if there is enough free_space to continue
* the process accounting system.
*/
if (!check_free_space(acct, file))
goto out;
fill_ac(&ac);
/* we really need to bite the bullet and change layout */ /* we really need to bite the bullet and change layout */
ac.ac_uid = from_kuid_munged(file->f_cred->user_ns, orig_cred->uid); ac.ac_uid = from_kuid_munged(file->f_cred->user_ns, orig_cred->uid);
ac.ac_gid = from_kgid_munged(file->f_cred->user_ns, orig_cred->gid); ac.ac_gid = from_kgid_munged(file->f_cred->user_ns, orig_cred->gid);
#if ACCT_VERSION==2
ac.ac_ahz = AHZ;
#endif
#if ACCT_VERSION==1 || ACCT_VERSION==2 #if ACCT_VERSION==1 || ACCT_VERSION==2
/* backward-compatible 16 bit fields */ /* backward-compatible 16 bit fields */
ac.ac_uid16 = ac.ac_uid; ac.ac_uid16 = ac.ac_uid;
...@@ -523,19 +540,6 @@ static void do_acct_process(struct bsd_acct_struct *acct, ...@@ -523,19 +540,6 @@ static void do_acct_process(struct bsd_acct_struct *acct,
ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns); ac.ac_ppid = task_tgid_nr_ns(rcu_dereference(current->real_parent), ns);
rcu_read_unlock(); rcu_read_unlock();
#endif #endif
spin_lock_irq(&current->sighand->siglock);
tty = current->signal->tty; /* Safe as we hold the siglock */
ac.ac_tty = tty ? old_encode_dev(tty_devnum(tty)) : 0;
ac.ac_utime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_utime)));
ac.ac_stime = encode_comp_t(jiffies_to_AHZ(cputime_to_jiffies(pacct->ac_stime)));
ac.ac_flag = pacct->ac_flag;
ac.ac_mem = encode_comp_t(pacct->ac_mem);
ac.ac_minflt = encode_comp_t(pacct->ac_minflt);
ac.ac_majflt = encode_comp_t(pacct->ac_majflt);
ac.ac_exitcode = pacct->ac_exitcode;
spin_unlock_irq(&current->sighand->siglock);
/* /*
* Get freeze protection. If the fs is frozen, just skip the write * Get freeze protection. If the fs is frozen, just skip the write
* as we could deadlock the system otherwise. * as we could deadlock the system otherwise.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment